diff --git a/src/bindings-jvm/tests/kotlin/src/test/kotlin/SmokeTest.kt b/src/bindings-jvm/tests/kotlin/src/test/kotlin/SmokeTest.kt index 2089f346..00c31a3f 100644 --- a/src/bindings-jvm/tests/kotlin/src/test/kotlin/SmokeTest.kt +++ b/src/bindings-jvm/tests/kotlin/src/test/kotlin/SmokeTest.kt @@ -10,6 +10,7 @@ import software.amazon.cloudformation.validate.engine.* import software.amazon.cloudformation.validate.gson.buildBindingsGson import software.amazon.cloudformation.validate.rules.* import software.amazon.cloudformation.validate.schemavalidator.SchemaValidatorConfig +import software.amazon.cloudformation.validate.templatemodel.JsonValueEnum import java.io.File class SmokeTest { @@ -573,6 +574,20 @@ class SmokeTest { assertEquals(1L, counts["errors"]) } + @Test + fun explicitJsonNullContextSurvivesFfi() { + val report = CEL.validateTemplate( + templateFile("bad/resources/properties/list_duplicates.yaml"), + detailedConfig(), + ) + val diagnostic = report.diagnostics.first { it.entity?.logicalId == "IamGroupWithConditions" } + + assertTrue( + diagnostic.context?.actualValue is JsonValueEnum.Null, + "an explicit JSON null must remain distinct from an absent violation-context value", + ) + } + @TestFactory fun regoDetailedMatchesSnapshot(): List = snapshotDetailedTests("rego", REGO) @@ -698,10 +713,24 @@ class SmokeTest { report["metadata"] = metadata } + @Suppress("UNCHECKED_CAST") + private fun stripNullActualValuesOmittedByGson(report: MutableMap) { + val diagnostics = report["diagnostics"] as? List> ?: return + report["diagnostics"] = diagnostics.map { diagnostic -> + val normalized = LinkedHashMap(diagnostic) + val context = diagnostic["context"] as? Map + if (context?.containsKey("actualValue") == true && context["actualValue"] == null) { + normalized["context"] = LinkedHashMap(context).apply { remove("actualValue") } + } + normalized + } + } + @Suppress("UNCHECKED_CAST") private fun stripSnapshotExcludedFields(report: Map, filePath: String? = null): Map { val out = LinkedHashMap(report) excludeSnapshotRules(out) + stripNullActualValuesOmittedByGson(out) if (filePath != null) out["filePath"] = filePath out.remove("version") out.remove("performance") diff --git a/src/bindings-rust/tests/smoke.rs b/src/bindings-rust/tests/smoke.rs index c2b7640c..bcd6306f 100644 --- a/src/bindings-rust/tests/smoke.rs +++ b/src/bindings-rust/tests/smoke.rs @@ -1,8 +1,12 @@ +use cloudformation_validate::template_model::{resolved_value_to_json, resolver::ResolvedValue}; use cloudformation_validate::{ AdditionalSchemaSource, CelEngine, CompositeEngine, CompositeEngineConfig, EngineConfig, ExternalRuleSource, RegoEngine, ReportStatus, SchemaValidator, SchemaValidatorConfig, SemanticModel, Severity, ValidateConfig, ValidationEngine, ValidationReport, validate_bytes_with_path, version, }; +use std::collections::HashMap; + +type Scenario = (ResolvedValue, HashMap); const GOOD_TEMPLATE: &[u8] = br#" AWSTemplateFormatVersion: "2010-09-09" @@ -19,6 +23,22 @@ Resources: BucketName: my-test-bucket "#; +const CONDITIONAL_BUCKET_NAME: &[u8] = br#" +Parameters: + Stage: + Type: String +Conditions: + IsProduction: !Equals [!Ref Stage, production] +Resources: + MyBucket: + Type: AWS::S3::Bucket + Properties: + BucketName: !If [IsProduction, production-bucket, staging-bucket] +"#; + +const BUCKET_NAME_PATH: &str = "Properties.BucketName"; +const IS_PRODUCTION: &str = "IsProduction"; + const TEMPLATE_WITH_OVERLAY_PROPERTY: &[u8] = br#" Resources: Function: @@ -90,6 +110,13 @@ fn diagnostic_signatures(report: &ValidationReport) -> Vec<(String, Severity, St .collect() } +fn rendered_scenarios(scenarios: &[Scenario]) -> Vec<(String, Option)> { + scenarios + .iter() + .map(|(value, conditions)| (resolved_value_to_json(value).to_string(), conditions.get(IS_PRODUCTION).copied())) + .collect() +} + fn all_engines(config: EngineConfig) -> Vec> { // The composite engine takes its own config type. The built-in, default, // good, additional-schema, and Guard matrices that use this helper never @@ -293,6 +320,50 @@ fn semantic_model_is_available_through_the_facade() { assert!(model.transforms.is_empty()); } +#[test] +fn semantic_model_resolve_scenarios_returns_owned_branch_scenarios() { + let model = SemanticModel::from_bytes(CONDITIONAL_BUCKET_NAME).expect("template must parse"); + + let scenarios: Vec = model.resolve_scenarios("MyBucket", BUCKET_NAME_PATH); + + assert_eq!( + rendered_scenarios(&scenarios), + vec![(r#""production-bucket""#.to_string(), Some(true)), (r#""staging-bucket""#.to_string(), Some(false))], + "each Fn::If branch must be one owned scenario paired with the condition value that selects it" + ); +} + +#[test] +fn semantic_model_resolve_scenarios_with_limit_returns_owned_scenarios_and_curtailment() { + let model = SemanticModel::from_bytes(CONDITIONAL_BUCKET_NAME).expect("template must parse"); + + let (scenarios, was_curtailed): (Vec, bool) = + model.resolve_scenarios_with_limit("MyBucket", BUCKET_NAME_PATH, 1); + + assert_eq!( + rendered_scenarios(&scenarios), + vec![(r#""production-bucket""#.to_string(), Some(true))], + "a per-value limit of one must keep only the first branch scenario" + ); + assert!(was_curtailed, "omitting the second branch scenario must be reported as curtailment"); +} + +#[test] +fn semantic_model_resolve_properties_scenarios_returns_owned_whole_properties_scenarios() { + let model = SemanticModel::from_bytes(CONDITIONAL_BUCKET_NAME).expect("template must parse"); + + let scenarios: Vec = model.resolve_properties_scenarios("MyBucket"); + + assert_eq!( + rendered_scenarios(&scenarios), + vec![ + (r#"{"BucketName":"production-bucket"}"#.to_string(), Some(true)), + (r#"{"BucketName":"staging-bucket"}"#.to_string(), Some(false)), + ], + "the whole Properties object must expand into one owned scenario per Fn::If branch" + ); +} + #[test] fn composite_default_produces_the_same_builtin_diagnostics_as_the_cel_engine() { let schema_validator = SchemaValidator::default(); diff --git a/src/cel-engine/src/rules/best_practices.rs b/src/cel-engine/src/rules/best_practices.rs index a46ae35f..bd3370cd 100644 --- a/src/cel-engine/src/rules/best_practices.rs +++ b/src/cel-engine/src/rules/best_practices.rs @@ -1,5 +1,5 @@ use super::patterns::AMI_ID_RE; -use super::resources_extra::{scenario_has_effective_property, scenario_is_reachable}; +use super::resources_extra::scenario_is_reachable; use super::{EvalContext, NativeRuleRegistry}; use data_source::rule_data::{PathSegment, ResourcePropertyPath}; use diagnostics::Diagnostic; @@ -126,11 +126,16 @@ fn rds_storage_encryption_scenario_warns(properties: &ResolvedValue) -> bool { } fn rds_storage_encryption_warns(model: &SemanticModel, resource_id: &str) -> bool { - model.resolve_properties_scenarios(resource_id).into_iter().any(|(properties, conditions)| { - let assumptions: Vec<(String, bool)> = conditions.into_iter().collect(); - (assumptions.is_empty() || model.conditions.is_satisfiable(&assumptions)) - && rds_storage_encryption_scenario_warns(&properties) - }) + let mut inspected_fields = vec!["Engine", "StorageEncrypted"]; + inspected_fields.extend(RDS_INHERITED_OR_IGNORED_ENCRYPTION_FIELDS); + model.resolve_properties_scenarios_projected(resource_id, &inspected_fields).iter().any( + |(properties, conditions)| { + let assumptions: Vec<(String, bool)> = + conditions.iter().map(|(name, value)| (name.clone(), *value)).collect(); + (assumptions.is_empty() || model.conditions.is_satisfiable(&assumptions)) + && rds_storage_encryption_scenario_warns(properties) + }, + ) } fn eval_best_practices(ctx: &EvalContext) -> Vec { @@ -519,9 +524,10 @@ None, .get(&res.resource_type) .map(|entry| entry.properties.iter().any(|p| p == "Tags")) .unwrap_or(false); - let tags_missing = m.resolve_properties_scenarios(name).iter().any(|(properties, conditions)| { - scenario_is_reachable(m, name, conditions) && !scenario_has_effective_property(properties, "Tags") - }); + let tags_missing = m + .property_absence_scenarios(name, "Tags") + .iter() + .any(|conditions| scenario_is_reachable(m, name, conditions)); if supports_tags && tags_missing { out.push(make_resource_diagnostic( "I9040", diff --git a/src/cel-engine/src/rules/resources_extra.rs b/src/cel-engine/src/rules/resources_extra.rs index 8474afc0..6074b09b 100644 --- a/src/cel-engine/src/rules/resources_extra.rs +++ b/src/cel-engine/src/rules/resources_extra.rs @@ -7,7 +7,6 @@ use diagnostics::ResourceRef; use std::collections::{BTreeSet, HashMap, HashSet}; use std::net::{Ipv4Addr, Ipv6Addr}; use std::sync::{Arc, LazyLock}; -use template_model::SemanticModel; use template_model::coercion::{coerce_port_to_string, coerce_to_integer, coerce_to_string, scalar_eq}; use template_model::consts::{ EDGE_KIND_GET_ATT, EDGE_KIND_REF, EDGE_KIND_SELECT, FIELD_ATTR, FIELD_KIND, FIELD_MAPPINGS, FIELD_OUTGOING_REFS, @@ -24,6 +23,7 @@ use template_model::vpc_cidr::subnets_outside_vpc; use template_model::{ CAA_RECORD_PATTERN, IAM_ROLE_ARN_RULE_PATTERN, MARKER_DYNAMIC, MARKER_PARAM_TYPE, MX_RECORD_PATTERN, SourceSpan, }; +use template_model::{ListMemberScenario, SemanticModel}; use template_model::{hardcoded_az, region_enums, schedule_expression_errors}; use validation_engine::{make_resource_diagnostic, make_resource_diagnostic_at_source}; @@ -54,6 +54,14 @@ static MX_RECORD_RE: LazyLock = static ARN_HAS_ACCOUNT_RE: LazyLock = LazyLock::new(|| regex::Regex::new(r":\d{12}:").expect("Invalid ARN_HAS_ACCOUNT_RE pattern")); +/// Matches a reference authored within an `AWS::Lambda::Version`'s `FunctionName`, +/// whether the property sits in a conditional `Properties` block or its value +/// selects between `Fn::If` branches. +static VERSION_FUNCTION_NAME_PATH_RE: LazyLock = LazyLock::new(|| { + regex::Regex::new(r"^Properties(\.Fn::If\.[12])*\.FunctionName(\.|$)") + .expect("Invalid VERSION_FUNCTION_NAME_PATH_RE pattern") +}); + /// Converts a `ResourcePropertyPath`'s segments (after the `Properties` prefix) /// into a dot-separated property path string suitable for `resolve_concrete` and /// diagnostic anchoring. Wildcard segments are excluded from the prefix because @@ -212,6 +220,111 @@ fn snapstart_runtime_supported( !unsupported_runtimes.iter().any(|r| r == runtime) } +const SNAPSTART_APPLY_ON_PATH: &str = "Properties.SnapStart.ApplyOn"; +const SNAPSTART_PUBLISHED_VERSIONS: &str = "PublishedVersions"; +const LAMBDA_VERSION_TYPE: &str = "AWS::Lambda::Version"; + +/// A reference's branch context lists the `Fn::If` conditions enclosing it, +/// separated by commas, with a false branch marked by a leading `!`. +const BRANCH_CONTEXT_SEPARATOR: char = ','; +const FALSE_BRANCH_PREFIX: char = '!'; + +/// SnapStart only takes effect on a published function version. Each reachable +/// scenario that enables it is reported at its authored `ApplyOn` value unless a +/// version publishing the function can be created in that same scenario. +fn snapstart_without_published_version(m: &SemanticModel, function_id: &str) -> Vec { + let published_versions = published_version_scenarios(m, function_id); + let unpublished_source_paths: BTreeSet = m + .resolve_scenarios_json_shared(function_id, SNAPSTART_APPLY_ON_PATH) + .iter() + .filter(|(apply_on, conditions)| { + apply_on.as_str() == Some(SNAPSTART_PUBLISHED_VERSIONS) + && scenario_is_reachable(m, function_id, conditions) + && !scenario_overlaps_any(m, function_id, conditions, &published_versions) + }) + .map(|(_, conditions)| scenario_source_path_or_effective(m, function_id, SNAPSTART_APPLY_ON_PATH, conditions)) + .collect(); + unpublished_source_paths + .iter() + .map(|source_path| { + make_resource_diagnostic_at_source( + "W2530", + "SnapStart is enabled but no AWS::Lambda::Version resource is attached", + m, + function_id, + SNAPSTART_APPLY_ON_PATH, + source_path, + Some("Add an AWS::Lambda::Version resource that references this function"), + ) + }) + .collect() +} + +/// The condition assignments under which an `AWS::Lambda::Version` publishes a +/// version of `function_id`: the version is created and its `FunctionName` +/// refers to the function. A reference from anywhere else in a version, such as +/// `DependsOn` or `Description`, publishes nothing. +fn published_version_scenarios(m: &SemanticModel, function_id: &str) -> Vec> { + let mut scenarios: Vec> = m + .graph + .incoming(function_id) + .into_iter() + .filter(|edge| { + m.resources.get(&edge.source_resource).is_some_and(|source| source.resource_type == LAMBDA_VERSION_TYPE) + && VERSION_FUNCTION_NAME_PATH_RE.is_match(&edge.source_path) + }) + .filter_map(|edge| reference_activation_conditions(m, &edge.source_resource, edge.condition_context.as_deref())) + .collect(); + + if let Some(function_name_identity) = m.value_identity(function_id, "Properties.FunctionName") { + scenarios.extend(m.resources_of_type(LAMBDA_VERSION_TYPE).iter().filter_map(|version_id| { + (m.value_identity(version_id, "Properties.FunctionName").as_ref() == Some(&function_name_identity)) + .then(|| reference_activation_conditions(m, version_id, None)) + .flatten() + })); + } + scenarios.sort_by_key(canonical_condition_assignment); + scenarios.dedup(); + scenarios +} + +fn canonical_condition_assignment(conditions: &HashMap) -> Vec<(String, bool)> { + let mut assignment: Vec<(String, bool)> = + conditions.iter().map(|(condition, value)| (condition.clone(), *value)).collect(); + assignment.sort_unstable(); + assignment +} + +/// The conditions under which a reference is active: the `Fn::If` branches it is +/// authored in and the condition that creates its resource. `None` when they +/// contradict each other, so the reference is never active. +fn reference_activation_conditions( + m: &SemanticModel, + resource_id: &str, + branch_context: Option<&str>, +) -> Option> { + let branch_literals = branch_context + .into_iter() + .flat_map(|context| context.split(BRANCH_CONTEXT_SEPARATOR)) + .filter(|literal| !literal.is_empty()) + .map(|literal| match literal.strip_prefix(FALSE_BRANCH_PREFIX) { + Some(condition) => (condition, false), + None => (literal, true), + }); + let creation_literal = m + .resources + .get(resource_id) + .and_then(|resource| resource.condition.as_deref()) + .map(|condition| (condition, true)); + let mut conditions = HashMap::new(); + for (condition, value) in branch_literals.chain(creation_literal) { + if conditions.insert(condition.to_string(), value).is_some_and(|previous| previous != value) { + return None; + } + } + Some(conditions) +} + fn resolve_all_json(m: &SemanticModel, rid: &str, path: &str) -> Vec { let rv = m.resolve_deep(rid, path).or_else(|| m.resolve(rid, path).cloned()); let Some(rv) = rv else { return vec![] }; @@ -482,7 +595,7 @@ fn scenario_property_json(properties: &ResolvedValue, property_name: &str) -> Op } } -fn route53_scenario_source_path( +fn scenario_source_path_or_effective( m: &SemanticModel, resource_id: &str, effective_path: &str, @@ -491,46 +604,90 @@ fn route53_scenario_source_path( m.scenario_source_path(resource_id, effective_path, conditions).unwrap_or_else(|| effective_path.to_string()) } -fn push_route53_record_value_diagnostics( +fn route53_record_value_message(record_type: &str, record: &str) -> Option { + match record_type { + "A" if record.parse::().is_err() => { + Some(format!("'{}' is not a valid IPv4 address for record type 'A'", record)) + } + "AAAA" if record.parse::().is_err() => { + Some(format!("'{}' is not a valid IPv6 address for record type 'AAAA'", record)) + } + "TXT" if !TXT_RECORD_RE.is_match(record) => { + Some(format!("TXT record value '{}' must be enclosed in double quotes", record)) + } + "CAA" if !CAA_RECORD_RE.is_match(record) => { + Some(format!("CAA record value '{}' must match format: flag tag 'value'", record)) + } + "MX" if !MX_RECORD_RE.is_match(record) => { + Some(format!("MX record value '{}' must match format: priority domain", record)) + } + _ => None, + } +} + +fn route53_cname_multiple_record_source_paths( + model: &SemanticModel, + resource_id: &str, + base_conditions: &HashMap, + type_scenarios: &[(serde_json::Value, HashMap)], + records_path: &str, +) -> BTreeSet { + let mut source_paths = BTreeSet::new(); + for (record_type, type_conditions) in type_scenarios { + if record_type.as_str() != Some("CNAME") { + continue; + } + let Some(base_and_type) = + merge_reachable_scenario_conditions(model, resource_id, base_conditions, type_conditions) + else { + continue; + }; + source_paths.extend(model.list_member_pair_source_paths(resource_id, records_path, &base_and_type)); + } + source_paths +} + +fn push_route53_record_member_diagnostics( diagnostics: &mut Vec, - m: &SemanticModel, + model: &SemanticModel, resource_id: &str, - record_type: &str, - records: &[serde_json::Value], + base_conditions: &HashMap, + type_scenarios: &[(serde_json::Value, HashMap)], + member_scenarios: &[ListMemberScenario], records_path: &str, - source_path_for: F, -) where - F: Fn(&str) -> String, -{ - for (record_index, record) in records.iter().enumerate() { - let Some(record) = record.as_str() else { +) { + let mut reported_values = HashSet::new(); + for (record_type, type_conditions) in type_scenarios { + let Some(record_type) = record_type.as_str() else { continue; }; - let message = match record_type { - "A" if record.parse::().is_err() => { - Some(format!("'{}' is not a valid IPv4 address for record type 'A'", record)) - } - "AAAA" if record.parse::().is_err() => { - Some(format!("'{}' is not a valid IPv6 address for record type 'AAAA'", record)) - } - "TXT" if !TXT_RECORD_RE.is_match(record) => { - Some(format!("TXT record value '{}' must be enclosed in double quotes", record)) - } - "CAA" if !CAA_RECORD_RE.is_match(record) => { - Some(format!("CAA record value '{}' must match format: flag tag 'value'", record)) - } - "MX" if !MX_RECORD_RE.is_match(record) => { - Some(format!("MX record value '{}' must match format: priority domain", record)) - } - _ => None, + let Some(base_and_type) = + merge_reachable_scenario_conditions(model, resource_id, base_conditions, type_conditions) + else { + continue; }; - if let Some(message) = message { - let property_path = format!("{}.{}", records_path, record_index); - let source_path = source_path_for(&property_path); + for member in member_scenarios { + let Some(conditions) = + merge_reachable_scenario_conditions(model, resource_id, &base_and_type, &member.conditions) + else { + continue; + }; + let record_value = resolved_to_route53_scenario_json(&member.value); + let Some(record) = record_value.as_str() else { + continue; + }; + let Some(message) = route53_record_value_message(record_type, record) else { + continue; + }; + let property_path = format!("{}.{}", records_path, member.index); + let source_path = scenario_source_path_or_effective(model, resource_id, &property_path, &conditions); + if !reported_values.insert((property_path.clone(), source_path.clone(), message.clone())) { + continue; + } diagnostics.push(make_resource_diagnostic_at_source( "E3023", &message, - m, + model, resource_id, &property_path, &source_path, @@ -539,13 +696,13 @@ fn push_route53_record_value_diagnostics( } } - let effective_record_count = records.iter().filter(|record| !record.is_null()).count(); - if record_type == "CNAME" && effective_record_count > 1 { - let source_path = source_path_for(records_path); + for source_path in + route53_cname_multiple_record_source_paths(model, resource_id, base_conditions, type_scenarios, records_path) + { diagnostics.push(make_resource_diagnostic_at_source( "E3023", "CNAME records must have at most 1 ResourceRecord", - m, + model, resource_id, records_path, &source_path, @@ -1951,24 +2108,7 @@ pub fn eval_extra_resources(ctx: &EvalContext) -> Vec { } for name in m.resources_of_type("AWS::Lambda::Function") { - if let Some(snap) = resolve_concrete(m, name, "Properties.SnapStart") - && snap.get("ApplyOn").and_then(|a| a.as_str()) == Some("PublishedVersions") - { - let version_refs = m.graph.ref_sources(name); - let has_ver = version_refs - .iter() - .any(|src| m.resources.get(&**src).map(|r| r.resource_type == "AWS::Lambda::Version").unwrap_or(false)); - if !has_ver { - out.push(make_resource_diagnostic( - "W2530", - "SnapStart is enabled but no AWS::Lambda::Version resource is attached", - m, - name, - "Properties.SnapStart", - Some("Add an AWS::Lambda::Version resource that references this function"), - )); - } - } + out.extend(snapstart_without_published_version(m, name)); } for rpp in &ctx.cached_data.rule_tables.iam_role_arn_property_paths { @@ -3452,20 +3592,21 @@ pub fn eval_extra_resources(ctx: &EvalContext) -> Vec { // Route53 RecordSet validation for name in m.resources_of_type("AWS::Route53::RecordSet") { - for (properties, conditions) in m.resolve_properties_scenarios(name) { - if !scenario_is_reachable(m, name, &conditions) { + let identity_scenarios = m.resolve_properties_scenarios_projected(name, &["HostedZoneName", "Name", "Type"]); + for (properties, conditions) in identity_scenarios.iter() { + if !scenario_is_reachable(m, name, conditions) { continue; } - let Some(serde_json::Value::String(record_type)) = scenario_property_json(&properties, "Type") else { + let Some(serde_json::Value::String(record_type)) = scenario_property_json(properties, "Type") else { continue; }; if record_type == "CNAME" && let (Some(serde_json::Value::String(record_name)), Some(serde_json::Value::String(hosted_zone_name))) = - (scenario_property_json(&properties, "Name"), scenario_property_json(&properties, "HostedZoneName")) + (scenario_property_json(properties, "Name"), scenario_property_json(properties, "HostedZoneName")) && record_name.trim_end_matches('.') == hosted_zone_name.trim_end_matches('.') { let property_path = "Properties.Name"; - let source_path = route53_scenario_source_path(m, name, property_path, &conditions); + let source_path = scenario_source_path_or_effective(m, name, property_path, conditions); out.push(make_resource_diagnostic_at_source( "E3023", &format!( @@ -3479,45 +3620,41 @@ pub fn eval_extra_resources(ctx: &EvalContext) -> Vec { None, )); } - if let Some(serde_json::Value::Array(records)) = scenario_property_json(&properties, "ResourceRecords") { - push_route53_record_value_diagnostics( - &mut out, - m, - name, - &record_type, - &records, - "Properties.ResourceRecords", - |property_path| route53_scenario_source_path(m, name, property_path, &conditions), - ); - } } + + let type_scenarios = m.resolve_scenarios_json_shared(name, "Properties.Type"); + let member_scenarios = m.resolve_list_member_scenarios_shared(name, "Properties.ResourceRecords"); + push_route53_record_member_diagnostics( + &mut out, + m, + name, + &HashMap::new(), + type_scenarios.as_slice(), + member_scenarios.as_slice(), + "Properties.ResourceRecords", + ); } // RecordSetGroup - validate records within RecordSets[] for name in m.resources_of_type("AWS::Route53::RecordSetGroup") { - for (properties, conditions) in m.resolve_properties_scenarios(name) { - if !scenario_is_reachable(m, name, &conditions) { - continue; - } - let Some(serde_json::Value::Array(record_sets)) = scenario_property_json(&properties, "RecordSets") else { + let record_set_scenarios = m.resolve_list_member_scenarios_shared(name, "Properties.RecordSets"); + for record_set_scenario in record_set_scenarios.iter() { + if !resolved_to_route53_scenario_json(&record_set_scenario.value).is_object() { continue; - }; - for (set_index, record_set) in record_sets.iter().enumerate() { - let Some(record_type) = record_set.get("Type").and_then(|value| value.as_str()) else { - continue; - }; - if let Some(records) = record_set.get("ResourceRecords").and_then(|value| value.as_array()) { - push_route53_record_value_diagnostics( - &mut out, - m, - name, - record_type, - records, - &format!("Properties.RecordSets.{}.ResourceRecords", set_index), - |property_path| route53_scenario_source_path(m, name, property_path, &conditions), - ); - } } + let type_path = format!("Properties.RecordSets.{}.Type", record_set_scenario.index); + let records_path = format!("Properties.RecordSets.{}.ResourceRecords", record_set_scenario.index); + let type_scenarios = m.resolve_scenarios_json_shared(name, &type_path); + let member_scenarios = m.resolve_list_member_scenarios_shared(name, &records_path); + push_route53_record_member_diagnostics( + &mut out, + m, + name, + &record_set_scenario.conditions, + type_scenarios.as_slice(), + member_scenarios.as_slice(), + &records_path, + ); } } @@ -3571,8 +3708,8 @@ pub fn eval_extra_resources(ctx: &EvalContext) -> Vec { // Route53 RecordSet Alias validation for name in m.resources_of_type("AWS::Route53::RecordSet") { - let property_scenarios = m.resolve_properties_scenarios(name); - let has_alias_ttl_conflict = property_scenarios.iter().any(|(properties, conditions)| { + let alias_ttl_scenarios = m.resolve_properties_scenarios_projected(name, &["AliasTarget", "TTL"]); + let has_alias_ttl_conflict = alias_ttl_scenarios.iter().any(|(properties, conditions)| { scenario_is_reachable(m, name, conditions) && scenario_has_effective_property(properties, "AliasTarget") && scenario_has_effective_property(properties, "TTL") @@ -3588,7 +3725,8 @@ pub fn eval_extra_resources(ctx: &EvalContext) -> Vec { )); } - let invalid_alias_types: BTreeSet = property_scenarios + let alias_type_scenarios = m.resolve_properties_scenarios_projected(name, &["AliasTarget", "Type"]); + let invalid_alias_types: BTreeSet = alias_type_scenarios .iter() .filter_map(|(properties, conditions)| { if !scenario_is_reachable(m, name, conditions) @@ -4031,12 +4169,13 @@ pub fn eval_extra_resources(ctx: &EvalContext) -> Vec { continue; } - let properties_scenarios = m.resolve_properties_scenarios(name); let property_can_be_missing = |property_name: &str| { - properties_scenarios.iter().any(|(properties, conditions)| { - !scenario_has_effective_property(properties, property_name) - && scenario_overlaps_any(m, name, conditions, &fargate_scenarios) - }) + m.resolve_properties_scenarios_projected(name, &[property_name]).iter().any( + |(properties, conditions)| { + !scenario_has_effective_property(properties, property_name) + && scenario_overlaps_any(m, name, conditions, &fargate_scenarios) + }, + ) }; let network_mode_scenarios = m.resolve_scenarios_json(name, "Properties.NetworkMode"); @@ -4117,10 +4256,13 @@ pub fn eval_extra_resources(ctx: &EvalContext) -> Vec { )); } - let placement_is_unsupported = properties_scenarios.iter().any(|(properties, conditions)| { - scenario_has_effective_property(properties, "PlacementConstraints") - && scenario_overlaps_any(m, name, conditions, &fargate_scenarios) - }); + let placement_is_unsupported = m + .resolve_properties_scenarios_projected(name, &["PlacementConstraints"]) + .iter() + .any(|(properties, conditions)| { + scenario_has_effective_property(properties, "PlacementConstraints") + && scenario_overlaps_any(m, name, conditions, &fargate_scenarios) + }); if placement_is_unsupported { out.push(make_resource_diagnostic( "E3048", diff --git a/src/cfn-validate/tests/resource_rule_parity.rs b/src/cfn-validate/tests/resource_rule_parity.rs index 0a2bd673..b680acde 100644 --- a/src/cfn-validate/tests/resource_rule_parity.rs +++ b/src/cfn-validate/tests/resource_rule_parity.rs @@ -40,6 +40,29 @@ fn selected_findings_with_spans(engine: &dyn ValidationEngine, template: &str, r findings } +/// Each finding as `resource|property path|start line:start column`, sorted. +fn selected_finding_anchors(engine: &dyn ValidationEngine, template: &str, rule_ids: &[&str]) -> Vec { + let validator = SchemaValidator::default(); + let report = validate_bytes(engine, &validator, template.as_bytes(), ValidateConfig::default()).unwrap(); + let mut anchors: Vec = report + .diagnostics + .iter() + .filter(|diagnostic| rule_ids.contains(&diagnostic.rule_id.as_str())) + .map(|diagnostic| { + let location = diagnostic.location.as_ref().expect("every finding must carry a source location"); + format!( + "{}|{}|{}:{}", + diagnostic.resource_logical_id().unwrap_or(""), + diagnostic.property_path.as_deref().unwrap_or(""), + location.start_line, + location.start_column + ) + }) + .collect(); + anchors.sort(); + anchors +} + fn diagnostic_identity(diagnostic: &Diagnostic) -> String { format!( "{}|{:?}|{}|{}|{}|{}", @@ -2281,3 +2304,256 @@ fn composite_keys_other_engines_and_consistent_monitoring_are_not_reported() { assert_eq!(rego_findings, cel_findings); assert!(rego_findings.is_empty(), "{rego_findings:?}"); } + +#[test] +fn snapstart_without_version_is_reported_at_each_reachable_enabling_apply_on() { + let template = include_str!("../../resources/templates/bad/W2530_snapstart_conditional_apply_on.yaml"); + let (rego, cel) = engines(); + assert_eq!( + selected_findings_with_spans(®o, template, &["W2530"]), + selected_findings_with_spans(&cel, template, &["W2530"]), + "SnapStart version findings must be identical, spans included" + ); + + let anchors = selected_finding_anchors(®o, template, &["W2530"]); + + assert_eq!( + anchors, + [ + "ApplyOnBesideNoValue|Properties.SnapStart.ApplyOn|74:53", + "ApplyOnFalseBranch|Properties.SnapStart.ApplyOn|63:40", + "ApplyOnTrueBranch|Properties.SnapStart.ApplyOn|52:34", + "EveryBranchEnables|Properties.SnapStart.ApplyOn|100:11", + "EveryBranchEnables|Properties.SnapStart.ApplyOn|99:11", + "PropertiesFalseBranch|Properties.SnapStart.ApplyOn|41:11", + "PropertiesTrueBranch|Properties.SnapStart.ApplyOn|17:11", + "SnapStartBesideNoValue|Properties.SnapStart.ApplyOn|87:11", + ], + "every reachable enabling value is reported once at its authored position" + ); +} + +#[test] +fn snapstart_in_unreachable_or_published_scenarios_is_not_reported() { + let template = include_str!("../../resources/templates/good/W2530_snapstart_unreachable_or_published.yaml"); + let (rego, cel) = engines(); + let rego_findings = selected_findings(®o, template, &["W2530"]); + let cel_findings = selected_findings(&cel, template, &["W2530"]); + assert_eq!(rego_findings, cel_findings); + assert!( + rego_findings.is_empty(), + "unreachable enabling branches and versions published alongside SnapStart must not be reported: {rego_findings:?}" + ); +} + +#[test] +fn snapstart_requires_a_version_publishing_the_function_in_the_same_deployment() { + let template = include_str!("../../resources/templates/bad/W2530_snapstart_version_not_coexisting.yaml"); + let (rego, cel) = engines(); + assert_eq!( + selected_findings_with_spans(®o, template, &["W2530"]), + selected_findings_with_spans(&cel, template, &["W2530"]), + "SnapStart version findings must be identical, spans included" + ); + + let anchors = selected_finding_anchors(®o, template, &["W2530"]); + + assert_eq!( + anchors, + [ + "VersionInOtherEnvironment|Properties.SnapStart.ApplyOn|65:11", + "VersionNamesOtherFunctionWhenEnabled|Properties.SnapStart.ApplyOn|82:34", + "VersionOnlyDependsOnFunction|Properties.SnapStart.ApplyOn|32:9", + "VersionOnlyDescribesFunction|Properties.SnapStart.ApplyOn|48:9", + ], + "a version publishes a function only through its FunctionName and only where it is created" + ); +} + +#[test] +fn snapstart_version_published_from_conditional_version_properties_follows_the_branch() { + let template = r#" +Conditions: + IsUsEast1: !Equals [!Ref AWS::Region, us-east-1] +Resources: + Other: + Type: AWS::Lambda::Function + Properties: + Runtime: python3.12 + Handler: index.handler + Role: !Sub arn:${AWS::Partition}:iam::${AWS::AccountId}:role/lambda + Code: {S3Bucket: bucket, S3Key: code.zip} + PublishedInEnablingBranch: + Type: AWS::Lambda::Function + Properties: + Runtime: java21 + Handler: example.Handler + Role: !Sub arn:${AWS::Partition}:iam::${AWS::AccountId}:role/lambda + Code: {S3Bucket: bucket, S3Key: code.zip} + SnapStart: !If [IsUsEast1, {ApplyOn: PublishedVersions}, !Ref AWS::NoValue] + PublishedInEnablingBranchVersion: + Type: AWS::Lambda::Version + Properties: !If + - IsUsEast1 + - FunctionName: !Ref PublishedInEnablingBranch + - FunctionName: !Ref Other + PublishedOutsideEnablingBranch: + Type: AWS::Lambda::Function + Properties: + Runtime: java21 + Handler: example.Handler + Role: !Sub arn:${AWS::Partition}:iam::${AWS::AccountId}:role/lambda + Code: {S3Bucket: bucket, S3Key: code.zip} + SnapStart: !If [IsUsEast1, {ApplyOn: PublishedVersions}, !Ref AWS::NoValue] + PublishedOutsideEnablingBranchVersion: + Type: AWS::Lambda::Version + Properties: !If + - IsUsEast1 + - FunctionName: !Ref Other + - FunctionName: !Ref PublishedOutsideEnablingBranch +"#; + let (rego, cel) = engines(); + let rego_findings = selected_findings_with_spans(®o, template, &["W2530"]); + let cel_findings = selected_findings_with_spans(&cel, template, &["W2530"]); + assert_eq!(rego_findings, cel_findings); + assert_eq!( + rego_findings.len(), + 1, + "only the branch-mismatched version leaves SnapStart unpublished: {rego_findings:?}" + ); + assert!(rego_findings[0].contains("|PublishedOutsideEnablingBranch|Properties.SnapStart.ApplyOn|")); +} + +#[test] +fn snapstart_version_with_matching_explicit_function_name_is_attached() { + let template = r#" +Resources: + Named: + Type: AWS::Lambda::Function + Properties: + FunctionName: snap-named + Runtime: java21 + Handler: example.Handler + Role: !Sub arn:${AWS::Partition}:iam::${AWS::AccountId}:role/lambda + Code: {S3Bucket: bucket, S3Key: code.zip} + SnapStart: {ApplyOn: PublishedVersions} + NamedVersion: + Type: AWS::Lambda::Version + DependsOn: Named + Properties: + FunctionName: snap-named +"#; + let (rego, cel) = engines(); + let rego_findings = selected_findings_with_spans(®o, template, &["W2530"]); + let cel_findings = selected_findings_with_spans(&cel, template, &["W2530"]); + + assert_eq!(rego_findings, cel_findings); + assert!(rego_findings.is_empty(), "the matching explicit name publishes the function: {rego_findings:?}"); +} + +#[test] +fn route53_cname_identity_ignores_unrelated_record_scenarios() { + let template = include_str!("../../resources/templates/bad/E3023_cname_projection_covering.yaml"); + let (rego, cel) = engines(); + let rego_findings = selected_findings_with_spans(®o, template, &["E3023"]); + let cel_findings = selected_findings_with_spans(&cel, template, &["E3023"]); + + assert_eq!(rego_findings, cel_findings, "Route53 diagnostics must be identical, spans included"); + assert_eq!(rego_findings.len(), 1, "the reachable CNAME at the zone apex must be reported: {rego_findings:?}"); + assert!(rego_findings[0].contains("|Record|Properties.Name|")); + assert!(rego_findings[0].contains("must not match HostedZoneName")); +} + +#[test] +fn fargate_missing_network_mode_ignores_ec2_only_placement_scenarios() { + let template = include_str!("../../resources/templates/bad/E3048_fargate_projection_covering.yaml"); + let (rego, cel) = engines(); + let rego_findings = selected_findings_with_spans(®o, template, &["E3048"]); + let cel_findings = selected_findings_with_spans(&cel, template, &["E3048"]); + + assert_eq!(rego_findings, cel_findings, "Fargate diagnostics must be identical, spans included"); + assert_eq!( + rego_findings.len(), + 1, + "only the reachable Fargate deployment without NetworkMode must be reported: {rego_findings:?}" + ); + assert!(rego_findings[0].contains("|Task|Properties|")); + assert!(rego_findings[0].contains("NetworkMode to be specified as 'awsvpc'")); +} + +#[test] +fn whole_properties_item_cardinality_preserves_nested_member_conditions() { + let template = include_str!("../../resources/templates/bad/F3032_whole_properties_item_cardinality.yaml"); + let (rego, cel) = engines(); + let rego_findings = selected_findings_with_spans(®o, template, &["F3032"]); + let cel_findings = selected_findings_with_spans(&cel, template, &["F3032"]); + + assert_eq!(rego_findings, cel_findings, "schema diagnostics must be identical, spans included"); + assert_eq!(rego_findings.len(), 1, "the selected branch can contain seventeen subnets: {rego_findings:?}"); + assert!(rego_findings[0].contains("|Function|Properties.VpcConfig.SubnetIds|")); + assert!(rego_findings[0].contains("expected maximum item count: 16, found: 17")); +} + +#[test] +fn route53_alias_checks_ignore_unrelated_property_scenarios() { + let template = include_str!("../../resources/templates/bad/E3029_alias_projection_covering.yaml"); + let (rego, cel) = engines(); + let rego_findings = selected_findings_with_spans(®o, template, &["E3029"]); + let cel_findings = selected_findings_with_spans(&cel, template, &["E3029"]); + + assert_eq!(rego_findings, cel_findings, "Route53 alias diagnostics must be identical, spans included"); + assert_eq!(rego_findings.len(), 2, "both independent alias constraints must be reported: {rego_findings:?}"); + assert!(rego_findings.iter().any(|finding| finding.contains("TTL must not be set when AliasTarget is specified"))); + assert!(rego_findings.iter().any(|finding| finding.contains("record type 'NS'"))); +} + +#[test] +fn route53_record_checks_expand_members_independently() { + let template = include_str!("../../resources/templates/bad/E3023_record_value_projection_covering.yaml"); + let (rego, cel) = engines(); + let rego_findings = selected_findings_with_spans(®o, template, &["E3023"]); + let cel_findings = selected_findings_with_spans(&cel, template, &["E3023"]); + + assert_eq!(rego_findings, cel_findings, "Route53 record diagnostics must be identical, spans included"); + assert_eq!(rego_findings.len(), 2, "both reachable record defects must be reported: {rego_findings:?}"); + assert!(rego_findings.iter().any(|finding| { + finding.contains("|CnameCountRecord|Properties.ResourceRecords|") + && finding.contains("at most 1 ResourceRecord") + })); + assert!(rego_findings.iter().any(|finding| { + finding.contains("|AddressRecord|Properties.ResourceRecords.1|") && finding.contains("not a valid IPv4 address") + })); +} + +#[test] +fn route53_cname_record_count_reports_each_invalid_branch() { + let template = include_str!("../../resources/templates/bad/E3023_cname_conditional_record_counts.yaml"); + let (rego, cel) = engines(); + let rego_findings = selected_findings_with_spans(®o, template, &["E3023"]); + let cel_findings = selected_findings_with_spans(&cel, template, &["E3023"]); + + assert_eq!(rego_findings, cel_findings, "conditional CNAME count diagnostics must match, spans included"); + assert_eq!(rego_findings.len(), 4, "each invalid authored branch must be reported once: {rego_findings:?}"); + assert_eq!(rego_findings.iter().filter(|finding| finding.contains("|ConditionalList|")).count(), 2); + assert_eq!(rego_findings.iter().filter(|finding| finding.contains("|ConditionalProperties|")).count(), 2); + assert!(rego_findings.iter().all(|finding| !finding.contains("|SingleRecordBranches|"))); +} + +#[test] +fn route53_recordset_group_checks_expand_members_independently() { + let template = include_str!("../../resources/templates/bad/E3023_recordsetgroup_projection_covering.yaml"); + let (rego, cel) = engines(); + let rego_findings = selected_findings_with_spans(®o, template, &["E3023"]); + let cel_findings = selected_findings_with_spans(&cel, template, &["E3023"]); + + assert_eq!(rego_findings, cel_findings, "Route53 group diagnostics must be identical, spans included"); + assert_eq!(rego_findings.len(), 2, "both reachable group record defects must be reported: {rego_findings:?}"); + assert!(rego_findings.iter().any(|finding| { + finding.contains("|CnameGroup|Properties.RecordSets.0.ResourceRecords|") + && finding.contains("at most 1 ResourceRecord") + })); + assert!(rego_findings.iter().any(|finding| { + finding.contains("|AddressGroup|Properties.RecordSets.0.ResourceRecords.1|") + && finding.contains("not a valid IPv4 address") + })); +} diff --git a/src/cfn-validate/tests/security_tests.rs b/src/cfn-validate/tests/security_tests.rs index 2673baea..c7f34dd1 100644 --- a/src/cfn-validate/tests/security_tests.rs +++ b/src/cfn-validate/tests/security_tests.rs @@ -655,3 +655,111 @@ fn deep_intrinsic_resolution_completes_within_budget() { finished.unwrap().unwrap_or_else(|e| panic!("{engine_name}: deep intrinsic resolution must not error: {e}")); } } + +/// Fixtures whose members are each gated by an independent condition. The joint +/// assignment count is 2^16 to 2^18, which is far beyond what may be enumerated +/// per value, yet every member is independently optional, so analysis must stay +/// complete and polynomial. +const INDEPENDENT_CONDITION_FIXTURES: [&str; 4] = [ + "independent_conditions_list_items.yaml", + "independent_conditions_properties.yaml", + "independent_conditions_object_keys.yaml", + "independent_conditions_statements.yaml", +]; + +/// Independent conditions on one value must not be enumerated jointly. The +/// fixtures are valid templates, so they must validate quickly with a complete +/// analysis and no curtailment, identically on every engine. +#[test] +fn independent_conditions_are_analyzed_completely_without_joint_expansion() { + const CURTAILED_ANALYSIS_ADVISORY: &str = "W9052"; + const PER_TEMPLATE_BUDGET: Duration = Duration::from_secs(10); + for fixture in INDEPENDENT_CONDITION_FIXTURES { + let bytes = common::load_security(fixture); + let mut engine_reports = Vec::new(); + for engine_name in ["rego", "cel", "composite"] { + let report = validate_report_within(PER_TEMPLATE_BUDGET, engine_name, bytes.clone()) + .unwrap_or_else(|| panic!("{engine_name}: {fixture} must validate within {PER_TEMPLATE_BUDGET:?}")) + .expect("validation must return a structured report"); + assert_eq!(report.status, ReportStatus::Ok, "{engine_name}: {fixture} analysis must be complete"); + assert!( + report.diagnostics.iter().all(|diagnostic| diagnostic.rule_id != CURTAILED_ANALYSIS_ADVISORY), + "{engine_name}: {fixture} must not report curtailment" + ); + assert!( + report.metadata.budget_exhaustions.is_none(), + "{engine_name}: {fixture} must not exhaust any budget" + ); + engine_reports.push(report); + } + let rule_ids = |report: &ValidationReport| -> Vec { + let mut ids: Vec = report.diagnostics.iter().map(|d| d.rule_id.clone()).collect(); + ids.sort(); + ids + }; + assert_eq!(rule_ids(&engine_reports[0]), rule_ids(&engine_reports[1]), "{fixture}: rego and cel must agree"); + assert_eq!( + rule_ids(&engine_reports[1]), + rule_ids(&engine_reports[2]), + "{fixture}: cel and composite must agree" + ); + } +} + +#[test] +fn conditional_scenario_checks_remain_exact_beyond_the_product_bound() { + let bytes = common::load_security("conditional_scenario_correctness.yaml"); + for engine_name in ["rego", "cel", "composite"] { + let report = validate_report_within(COMPLETION_BUDGET, engine_name, bytes.clone()) + .unwrap_or_else(|| panic!("{engine_name}: scenario correctness fixture must complete")) + .expect("validation must return a structured report"); + let has_diagnostic = |rule_id: &str, resource_id: &str| { + report.diagnostics.iter().any(|diagnostic| { + diagnostic.rule_id == rule_id && diagnostic.resource_logical_id() == Some(resource_id) + }) + }; + + assert!(has_diagnostic("E3023", "Record"), "{engine_name}: the three-literal address branch is reachable"); + assert!(has_diagnostic("F3037", "NestedUniqueFunction"), "{engine_name}: conditional tag values can collide"); + assert!(has_diagnostic("W2530", "SnapStartFunction"), "{engine_name}: false-branch SnapStart is enabled"); + assert!( + !has_diagnostic("F3032", "ComplementaryArchitectureFunction"), + "{engine_name}: one complementary dynamic member is always present" + ); + assert!( + !has_diagnostic("F3032", "RepeatedConditionFunction"), + "{engine_name}: an impossible nested member is never present" + ); + assert!( + !has_diagnostic("I9040", "TaggedTopic"), + "{engine_name}: Tags are present in every reachable Properties branch" + ); + assert_eq!(report.status, ReportStatus::Ok, "{engine_name}: analysis must remain complete"); + assert!( + report.metadata.budget_exhaustions.is_none(), + "{engine_name}: no validation budget should be exhausted" + ); + } +} + +#[test] +fn alias_expanded_depth_is_rejected_with_structured_error() { + let bytes = common::load_security("yaml_alias_expanded_depth.yaml"); + let error = match SemanticModel::from_bytes(&bytes) { + Err(error) => error, + Ok(_) => panic!("alias-expanded nesting must exceed the depth limit"), + }; + let message = error.to_string().to_lowercase(); + assert!(message.contains("nesting depth"), "error must reference nesting depth, got: {error}"); +} + +#[test] +fn exponential_yaml_alias_expansion_is_rejected_with_structured_error() { + let bytes = common::load_security("yaml_alias_expansion.yaml"); + let error = match SemanticModel::from_bytes(&bytes) { + Err(e) => e, + Ok(_) => panic!("a document whose aliases expand exponentially must fail with a parse error"), + }; + let msg = error.to_string().to_lowercase(); + assert!(msg.contains("alias expansion"), "error must reference alias expansion, got: {}", error); +} diff --git a/src/performance-harness/README.md b/src/performance-harness/README.md index b37123cb..a3b3acec 100644 --- a/src/performance-harness/README.md +++ b/src/performance-harness/README.md @@ -63,6 +63,11 @@ it is understood and accepted - normally with each new release, so that every re one. The anchor is a tag rather than recorded numbers, so it is independent of runner hardware and never needs measurements from a GitHub runner to update. +A security fixture that the anchored release cannot validate (it exhausts memory or needs tens of seconds per +validation) has no base measurement to pair with, so `UNCOMPARABLE_SECURITY_FIXTURES` in `src/measurement.rs` leaves +it out of the workloads. A unit test fails once the anchor reaches the release that measures those fixtures, so +advancing the anchor past it also removes the entries. + ## Run locally Build the base harness from a clean export of the base revision, then pass it to `compare`. Reusing the workspace diff --git a/src/performance-harness/src/measurement.rs b/src/performance-harness/src/measurement.rs index 9faf9759..ee46a7d6 100644 --- a/src/performance-harness/src/measurement.rs +++ b/src/performance-harness/src/measurement.rs @@ -225,6 +225,23 @@ fn collect_template_paths(directory: &Path, output: &mut Vec) -> Result Ok(()) } +/// Security fixtures the anchored release cannot measure, so no base launch exists to pair a head launch with: it +/// exhausts memory on the alias expansion and the conditional list items, aborts on alias-expanded nesting, and needs +/// over 20 s per validation of the conditional statements. Releases from `BOUNDED_EXPANSION_RELEASE` on complete them +/// at the fixed baseline; remove the entries when `drift-anchor.txt` reaches that release +/// (`uncomparable_fixtures_exist_until_the_anchor_measures_them`). +const UNCOMPARABLE_SECURITY_FIXTURES: [&str; 4] = [ + "independent_conditions_list_items.yaml", + "independent_conditions_statements.yaml", + "yaml_alias_expanded_depth.yaml", + "yaml_alias_expansion.yaml", +]; + +/// First release that bounds independent-condition and alias expansion, measured against `drift-anchor.txt` by the +/// unit test that retires `UNCOMPARABLE_SECURITY_FIXTURES`. +#[cfg(test)] +const BOUNDED_EXPANSION_RELEASE: (u64, u64, u64) = (1, 14, 0); + fn security_workloads(directory: &Path) -> Result, String> { let iteration_counts = BTreeMap::from([ ("condition_fusion.yaml", 2), @@ -239,6 +256,12 @@ fn security_workloads(directory: &Path) -> Result, String> { ]); let mut templates = Vec::new(); collect_template_paths(directory, &mut templates)?; + templates.retain(|template| { + !template + .file_name() + .and_then(|name| name.to_str()) + .is_some_and(|name| UNCOMPARABLE_SECURITY_FIXTURES.contains(&name)) + }); templates.sort(); templates .into_iter() @@ -470,10 +493,34 @@ mod tests { generate_fixtures(&project_root().join("tmp/performance-harness-unit-test/fixtures")).expect("fixtures"); let workloads = workload_matrix(&fixtures).expect("workloads"); let names: Vec<&str> = workloads.iter().map(|workload| workload.name.as_str()).collect(); - assert_eq!(workloads.len(), 19, "{names:?}"); + assert_eq!(workloads.len(), 22, "{names:?}"); assert!(names.contains(&"tiny") && names.contains(&"mixed-real"), "{names:?}"); assert!(names.contains(&"security-cross-reference-fanout"), "{names:?}"); - assert_eq!(ENGINES.len() * workloads.len(), 57); + assert!(names.contains(&"security-independent-conditions-properties"), "{names:?}"); + assert!(!names.contains(&"security-yaml-alias-expansion"), "{names:?}"); + assert!(!names.contains(&"security-yaml-alias-expanded-depth"), "{names:?}"); + assert!(names.contains(&"security-conditional-scenario-correctness"), "{names:?}"); + assert_eq!(ENGINES.len() * workloads.len(), 66); + } + + #[test] + fn uncomparable_fixtures_exist_until_the_anchor_measures_them() { + let security = project_root().join("src/resources/security"); + for fixture in UNCOMPARABLE_SECURITY_FIXTURES { + assert!(security.join(fixture).is_file(), "{fixture} is not a security fixture"); + } + let anchor = fs::read_to_string(project_root().join("src/performance-harness/drift-anchor.txt")) + .expect("drift anchor file"); + let release = anchor.trim().trim_end_matches("-beta"); + let numbers: Vec = release.split('.').map(|part| part.parse().expect("release number")).collect(); + let anchored = match numbers.as_slice() { + [major, minor, patch] => (*major, *minor, *patch), + other => panic!("expected MAJOR.MINOR.PATCH, found {other:?}"), + }; + assert!( + anchored < BOUNDED_EXPANSION_RELEASE, + "release {release} measures every security fixture: remove UNCOMPARABLE_SECURITY_FIXTURES" + ); } fn workload(name: &str, gate_process_lifecycle: bool) -> Workload { diff --git a/src/rego-engine/handwritten/rego/best_practices/tagging.rego b/src/rego-engine/handwritten/rego/best_practices/tagging.rego index 854ee6e8..c9034edd 100644 --- a/src/rego-engine/handwritten/rego/best_practices/tagging.rego +++ b/src/rego-engine/handwritten/rego/best_practices/tagging.rego @@ -19,9 +19,8 @@ _type_supports_tags(rtype) if { } _resource_missing_tags(name) if { - some scenario in properties_scenarios(name, ["Tags"]) - _tag_scenario_reachable(name, scenario.conditions) - object.get(scenario.properties, "Tags", null) == null + some conditions in property_absence_scenarios(name, "Tags") + _tag_scenario_reachable(name, conditions) } _tag_scenario_reachable(name, conditions) if { diff --git a/src/rego-engine/handwritten/rego/resources/lambda/snapstart_version.rego b/src/rego-engine/handwritten/rego/resources/lambda/snapstart_version.rego index a317fb21..060ce1b0 100644 --- a/src/rego-engine/handwritten/rego/resources/lambda/snapstart_version.rego +++ b/src/rego-engine/handwritten/rego/resources/lambda/snapstart_version.rego @@ -2,24 +2,70 @@ package resources import rego.v1 -# W2530: SnapStart enabled but no Lambda::Version resource attached -violation contains make_diag_full("W2530", "WARN", name, - "Properties.SnapStart", +_snapstart_apply_on_path := "Properties.SnapStart.ApplyOn" + +# SnapStart only takes effect on a published function version. Each reachable +# scenario that enables it is reported at its authored ApplyOn value unless a +# version publishing the function can be created in that same scenario. +violation contains make_diag_at_source_full("W2530", "WARN", name, _snapstart_apply_on_path, source_path, "SnapStart is enabled but no AWS::Lambda::Version resource is attached", "Add an AWS::Lambda::Version resource that references this function", - "") if { +) if { cfn_rule_active("W2530") some name in resources_of_type("AWS::Lambda::Function") - snap := resolve(name, "Properties.SnapStart") - is_object(snap) - apply_on := object.get(snap, "ApplyOn", "None") - apply_on == "PublishedVersions" - # Check if any Lambda::Version references this function - not _has_version_resource(name) + some scenario in resolve_scenarios(name, _snapstart_apply_on_path) + scenario.value == "PublishedVersions" + _resource_scenario_reachable(name, scenario.conditions) + not _snapstart_version_compatible(name, scenario.conditions) + source_path := scenario_source_path(name, _snapstart_apply_on_path, scenario.conditions) +} + +_snapstart_version_compatible(func_name, conditions) if { + some version_conditions in _snapstart_published_version_scenarios(func_name) + _scenario_conditions_compatible(func_name, conditions, version_conditions) +} + +# The condition assignments under which an AWS::Lambda::Version publishes a +# version of the function: the version is created and its FunctionName refers +# to the function. A reference from anywhere else in a version, such as +# DependsOn or Description, publishes nothing. +_snapstart_published_version_scenarios(func_name) := + _snapstart_reference_version_scenarios(func_name) | _snapstart_named_version_scenarios(func_name) + +_snapstart_reference_version_scenarios(func_name) := {conditions | + some version_name in resources_of_type("AWS::Lambda::Version") + some edge in input.resources[version_name].outgoingRefs + edge.target == func_name + regex.match(`^Properties(\.Fn::If\.[12])*\.FunctionName(\.|$)`, edge.sourcePath) + conditions := _snapstart_reference_activation_conditions(version_name, edge) } -_has_version_resource(func_name) if { - some ver_name in resources_of_type("AWS::Lambda::Version") - target := follow_ref(ver_name, "Properties.FunctionName") - target == func_name +_snapstart_named_version_scenarios(func_name) := {conditions | + function_name_identity := value_identity(func_name, "Properties.FunctionName") + some version_name in resources_of_type("AWS::Lambda::Version") + value_identity(version_name, "Properties.FunctionName") == function_name_identity + conditions := {literal[0]: literal[1] | some literal in _snapstart_creation_literals(version_name)} } + +# The conditions under which a reference is active: the Fn::If branches it is +# authored in and the condition that creates its resource. Undefined when they +# contradict each other, so the reference is never active. +_snapstart_reference_activation_conditions(resource_name, edge) := conditions if { + literals := _snapstart_branch_literals(edge) | _snapstart_creation_literals(resource_name) + count({literal[0] | some literal in literals}) == count(literals) + conditions := {literal[0]: literal[1] | some literal in literals} +} + +# A reference's branch context lists the Fn::If conditions enclosing it, +# separated by commas, with a false branch marked by a leading "!". +_snapstart_branch_literals(edge) := {[condition, value] | + some literal in split(object.get(edge, "conditionContext", ""), ",") + literal != "" + condition := trim_prefix(literal, "!") + value := literal == condition +} + +_snapstart_creation_literals(resource_name) := {[condition, true]} if { + condition := resource_condition(resource_name) + condition != null +} else := set() diff --git a/src/rego-engine/handwritten/rego/resources/route53/recordset.rego b/src/rego-engine/handwritten/rego/resources/route53/recordset.rego index 017a87d5..991e6159 100644 --- a/src/rego-engine/handwritten/rego/resources/route53/recordset.rego +++ b/src/rego-engine/handwritten/rego/resources/route53/recordset.rego @@ -15,12 +15,68 @@ _route53_scenario_reachable(name, conditions) if { is_satisfiable(object.union(conditions, {resource_condition: true})) } -_route53_record_set_scenarios(name) := {scenario | - some scenario in properties_scenarios(name, ["HostedZoneName", "Name", "ResourceRecords", "Type"]) +_route53_record_identity_scenarios(name) := {scenario | + some scenario in properties_scenarios(name, ["HostedZoneName", "Name", "Type"]) _route53_scenario_reachable(name, scenario.conditions) } -_route53_effective_record_count(records) := count([record | some record in records; record != null]) +_route53_typed_record_scenarios(name) := {scenario | + some type_scenario in resolve_scenarios(name, "Properties.Type") + some record_scenario in list_member_scenarios(name, "Properties.ResourceRecords") + _scenario_conditions_compatible(name, type_scenario.conditions, record_scenario.conditions) + conditions := object.union(type_scenario.conditions, record_scenario.conditions) + scenario := { + "record_type": type_scenario.value, + "record": record_scenario.value, + "record_index": record_scenario.index, + "conditions": conditions, + } +} + +_route53_cname_multiple_record_source_paths(name) := {source_path | + some type_scenario in resolve_scenarios(name, "Properties.Type") + type_scenario.value == "CNAME" + some source_path in list_member_pair_source_paths( + name, "Properties.ResourceRecords", type_scenario.conditions) +} + +_route53_group_typed_record_scenarios(name) := {scenario | + some record_set_scenario in list_member_scenarios(name, "Properties.RecordSets") + is_object(record_set_scenario.value) + set_index := record_set_scenario.index + type_path := sprintf("Properties.RecordSets.%d.Type", [set_index]) + records_path := sprintf("Properties.RecordSets.%d.ResourceRecords", [set_index]) + some type_scenario in resolve_scenarios(name, type_path) + _scenario_conditions_compatible(name, record_set_scenario.conditions, type_scenario.conditions) + record_set_and_type := object.union(record_set_scenario.conditions, type_scenario.conditions) + some record_scenario in list_member_scenarios(name, records_path) + _scenario_conditions_compatible(name, record_set_and_type, record_scenario.conditions) + conditions := object.union(record_set_and_type, record_scenario.conditions) + scenario := { + "record_set_index": set_index, + "record_type": type_scenario.value, + "record": record_scenario.value, + "record_index": record_scenario.index, + "conditions": conditions, + } +} + +_route53_group_cname_multiple_record_scenarios(name) := {scenario | + some record_set_scenario in list_member_scenarios(name, "Properties.RecordSets") + is_object(record_set_scenario.value) + set_index := record_set_scenario.index + type_path := sprintf("Properties.RecordSets.%d.Type", [set_index]) + records_path := sprintf("Properties.RecordSets.%d.ResourceRecords", [set_index]) + some type_scenario in resolve_scenarios(name, type_path) + type_scenario.value == "CNAME" + _scenario_conditions_compatible(name, record_set_scenario.conditions, type_scenario.conditions) + record_set_and_type := object.union(record_set_scenario.conditions, type_scenario.conditions) + some source_path in list_member_pair_source_paths(name, records_path, record_set_and_type) + scenario := { + "record_set_index": set_index, + "source_path": source_path, + } +} # E3023: Route53 RecordSet - A record must have valid IPv4 violation contains make_diag_at_source("E3023", "ERROR", name, @@ -29,13 +85,10 @@ violation contains make_diag_at_source("E3023", "ERROR", name, sprintf("'%s' is not a valid IPv4 address for record type 'A'", [rec])) if { cfn_rule_active("E3023") some name in resources_of_type("AWS::Route53::RecordSet") - some scenario in _route53_record_set_scenarios(name) - properties := scenario.properties - rtype := object.get(properties, "Type", null) - rtype == "A" - records := object.get(properties, "ResourceRecords", null) - is_array(records) - some i, rec in records + some scenario in _route53_typed_record_scenarios(name) + scenario.record_type == "A" + rec := scenario.record + i := scenario.record_index property_path := sprintf("Properties.ResourceRecords.%d", [i]) source_path := scenario_source_path(name, property_path, scenario.conditions) is_string(rec) @@ -51,13 +104,10 @@ violation contains make_diag_at_source("E3023", "ERROR", name, sprintf("'%s' is not a valid IPv6 address for record type 'AAAA'", [rec])) if { cfn_rule_active("E3023") some name in resources_of_type("AWS::Route53::RecordSet") - some scenario in _route53_record_set_scenarios(name) - properties := scenario.properties - rtype := object.get(properties, "Type", null) - rtype == "AAAA" - records := object.get(properties, "ResourceRecords", null) - is_array(records) - some i, rec in records + some scenario in _route53_typed_record_scenarios(name) + scenario.record_type == "AAAA" + rec := scenario.record + i := scenario.record_index property_path := sprintf("Properties.ResourceRecords.%d", [i]) source_path := scenario_source_path(name, property_path, scenario.conditions) is_string(rec) @@ -147,7 +197,7 @@ violation contains make_diag_at_source("E3023", "ERROR", name, sprintf("CNAME record Name '%s' must not match HostedZoneName '%s' exactly", [rec_name, hz_name])) if { cfn_rule_active("E3023") some name in resources_of_type("AWS::Route53::RecordSet") - some scenario in _route53_record_set_scenarios(name) + some scenario in _route53_record_identity_scenarios(name) properties := scenario.properties rtype := object.get(properties, "Type", null) rtype == "CNAME" @@ -166,15 +216,7 @@ violation contains make_diag_at_source("E3023", "ERROR", name, "CNAME records must have at most 1 ResourceRecord") if { cfn_rule_active("E3023") some name in resources_of_type("AWS::Route53::RecordSet") - some scenario in _route53_record_set_scenarios(name) - properties := scenario.properties - rtype := object.get(properties, "Type", null) - rtype == "CNAME" - records := object.get(properties, "ResourceRecords", null) - is_array(records) - _route53_effective_record_count(records) > 1 - source_path := scenario_source_path( - name, "Properties.ResourceRecords", scenario.conditions) + some source_path in _route53_cname_multiple_record_source_paths(name) } # E3023: TXT record values must be double-quoted strings @@ -184,13 +226,10 @@ violation contains make_diag_at_source("E3023", "ERROR", name, sprintf("TXT record value '%s' must be enclosed in double quotes", [rec])) if { cfn_rule_active("E3023") some name in resources_of_type("AWS::Route53::RecordSet") - some scenario in _route53_record_set_scenarios(name) - properties := scenario.properties - rtype := object.get(properties, "Type", null) - rtype == "TXT" - records := object.get(properties, "ResourceRecords", null) - is_array(records) - some i, rec in records + some scenario in _route53_typed_record_scenarios(name) + scenario.record_type == "TXT" + rec := scenario.record + i := scenario.record_index property_path := sprintf("Properties.ResourceRecords.%d", [i]) source_path := scenario_source_path(name, property_path, scenario.conditions) is_string(rec) @@ -204,13 +243,10 @@ violation contains make_diag_at_source("E3023", "ERROR", name, sprintf("CAA record value '%s' must match format: flag tag 'value'", [rec])) if { cfn_rule_active("E3023") some name in resources_of_type("AWS::Route53::RecordSet") - some scenario in _route53_record_set_scenarios(name) - properties := scenario.properties - rtype := object.get(properties, "Type", null) - rtype == "CAA" - records := object.get(properties, "ResourceRecords", null) - is_array(records) - some i, rec in records + some scenario in _route53_typed_record_scenarios(name) + scenario.record_type == "CAA" + rec := scenario.record + i := scenario.record_index property_path := sprintf("Properties.ResourceRecords.%d", [i]) source_path := scenario_source_path(name, property_path, scenario.conditions) is_string(rec) @@ -224,13 +260,10 @@ violation contains make_diag_at_source("E3023", "ERROR", name, sprintf("MX record value '%s' must match format: priority domain", [rec])) if { cfn_rule_active("E3023") some name in resources_of_type("AWS::Route53::RecordSet") - some scenario in _route53_record_set_scenarios(name) - properties := scenario.properties - rtype := object.get(properties, "Type", null) - rtype == "MX" - records := object.get(properties, "ResourceRecords", null) - is_array(records) - some i, rec in records + some scenario in _route53_typed_record_scenarios(name) + scenario.record_type == "MX" + rec := scenario.record + i := scenario.record_index property_path := sprintf("Properties.ResourceRecords.%d", [i]) source_path := scenario_source_path(name, property_path, scenario.conditions) is_string(rec) @@ -245,15 +278,11 @@ violation contains make_diag_at_source("E3023", "ERROR", name, sprintf("'%s' is not a valid IPv4 address for record type 'A'", [rec])) if { cfn_rule_active("E3023") some name in resources_of_type("AWS::Route53::RecordSetGroup") - some scenario in properties_scenarios(name, ["RecordSets"]) - _route53_scenario_reachable(name, scenario.conditions) - rsets := object.get(scenario.properties, "RecordSets", null) - is_array(rsets) - some si, rset in rsets - is_object(rset) - rset.Type == "A" - is_array(rset.ResourceRecords) - some ri, rec in rset.ResourceRecords + some scenario in _route53_group_typed_record_scenarios(name) + scenario.record_type == "A" + si := scenario.record_set_index + ri := scenario.record_index + rec := scenario.record property_path := sprintf("Properties.RecordSets.%d.ResourceRecords.%d", [si, ri]) source_path := scenario_source_path(name, property_path, scenario.conditions) is_string(rec) @@ -267,15 +296,11 @@ violation contains make_diag_at_source("E3023", "ERROR", name, sprintf("'%s' is not a valid IPv6 address for record type 'AAAA'", [rec])) if { cfn_rule_active("E3023") some name in resources_of_type("AWS::Route53::RecordSetGroup") - some scenario in properties_scenarios(name, ["RecordSets"]) - _route53_scenario_reachable(name, scenario.conditions) - rsets := object.get(scenario.properties, "RecordSets", null) - is_array(rsets) - some si, rset in rsets - is_object(rset) - rset.Type == "AAAA" - is_array(rset.ResourceRecords) - some ri, rec in rset.ResourceRecords + some scenario in _route53_group_typed_record_scenarios(name) + scenario.record_type == "AAAA" + si := scenario.record_set_index + ri := scenario.record_index + rec := scenario.record property_path := sprintf("Properties.RecordSets.%d.ResourceRecords.%d", [si, ri]) source_path := scenario_source_path(name, property_path, scenario.conditions) is_string(rec) @@ -289,15 +314,11 @@ violation contains make_diag_at_source("E3023", "ERROR", name, sprintf("TXT record value '%s' must be enclosed in double quotes", [rec])) if { cfn_rule_active("E3023") some name in resources_of_type("AWS::Route53::RecordSetGroup") - some scenario in properties_scenarios(name, ["RecordSets"]) - _route53_scenario_reachable(name, scenario.conditions) - rsets := object.get(scenario.properties, "RecordSets", null) - is_array(rsets) - some si, rset in rsets - is_object(rset) - rset.Type == "TXT" - is_array(rset.ResourceRecords) - some ri, rec in rset.ResourceRecords + some scenario in _route53_group_typed_record_scenarios(name) + scenario.record_type == "TXT" + si := scenario.record_set_index + ri := scenario.record_index + rec := scenario.record property_path := sprintf("Properties.RecordSets.%d.ResourceRecords.%d", [si, ri]) source_path := scenario_source_path(name, property_path, scenario.conditions) is_string(rec) @@ -311,15 +332,11 @@ violation contains make_diag_at_source("E3023", "ERROR", name, sprintf("CAA record value '%s' must match format: flag tag 'value'", [rec])) if { cfn_rule_active("E3023") some name in resources_of_type("AWS::Route53::RecordSetGroup") - some scenario in properties_scenarios(name, ["RecordSets"]) - _route53_scenario_reachable(name, scenario.conditions) - rsets := object.get(scenario.properties, "RecordSets", null) - is_array(rsets) - some si, rset in rsets - is_object(rset) - rset.Type == "CAA" - is_array(rset.ResourceRecords) - some ri, rec in rset.ResourceRecords + some scenario in _route53_group_typed_record_scenarios(name) + scenario.record_type == "CAA" + si := scenario.record_set_index + ri := scenario.record_index + rec := scenario.record property_path := sprintf("Properties.RecordSets.%d.ResourceRecords.%d", [si, ri]) source_path := scenario_source_path(name, property_path, scenario.conditions) is_string(rec) @@ -333,15 +350,11 @@ violation contains make_diag_at_source("E3023", "ERROR", name, sprintf("MX record value '%s' must match format: priority domain", [rec])) if { cfn_rule_active("E3023") some name in resources_of_type("AWS::Route53::RecordSetGroup") - some scenario in properties_scenarios(name, ["RecordSets"]) - _route53_scenario_reachable(name, scenario.conditions) - rsets := object.get(scenario.properties, "RecordSets", null) - is_array(rsets) - some si, rset in rsets - is_object(rset) - rset.Type == "MX" - is_array(rset.ResourceRecords) - some ri, rec in rset.ResourceRecords + some scenario in _route53_group_typed_record_scenarios(name) + scenario.record_type == "MX" + si := scenario.record_set_index + ri := scenario.record_index + rec := scenario.record property_path := sprintf("Properties.RecordSets.%d.ResourceRecords.%d", [si, ri]) source_path := scenario_source_path(name, property_path, scenario.conditions) is_string(rec) @@ -355,15 +368,8 @@ violation contains make_diag_at_source("E3023", "ERROR", name, "CNAME records must have at most 1 ResourceRecord") if { cfn_rule_active("E3023") some name in resources_of_type("AWS::Route53::RecordSetGroup") - some scenario in properties_scenarios(name, ["RecordSets"]) - _route53_scenario_reachable(name, scenario.conditions) - rsets := object.get(scenario.properties, "RecordSets", null) - is_array(rsets) - some si, rset in rsets - is_object(rset) - rset.Type == "CNAME" - is_array(rset.ResourceRecords) - _route53_effective_record_count(rset.ResourceRecords) > 1 + some scenario in _route53_group_cname_multiple_record_scenarios(name) + si := scenario.record_set_index property_path := sprintf("Properties.RecordSets.%d.ResourceRecords", [si]) - source_path := scenario_source_path(name, property_path, scenario.conditions) + source_path := scenario.source_path } diff --git a/src/rego-engine/src/builtins.rs b/src/rego-engine/src/builtins.rs index 13bd7bdf..0f8cc7b2 100644 --- a/src/rego-engine/src/builtins.rs +++ b/src/rego-engine/src/builtins.rs @@ -24,7 +24,10 @@ use template_model::region_enums; use template_model::resolved_value::json_contains_markers; use template_model::resolver::{MapEntry, RefKind, ResolvedValue}; use template_model::{MARKER_DYNAMIC, MARKER_PARAM_TYPE, MARKER_REF}; -use template_model::{SourceSpan, UNKNOWN_SPAN, primary_identifier_conflict_message, render_value, render_value_list}; +use template_model::{ + SourceSpan, UNKNOWN_SPAN, primary_identifier_conflict_message, render_value, render_value_list, + resolved_value_to_json, +}; use validation_engine::DIAGNOSTIC_SOURCE_PATH_FIELD; pub(crate) fn serde_json_to_rego_value(v: &serde_json::Value) -> Value { @@ -73,6 +76,7 @@ pub(crate) fn register_all( register_make_diag(rego); register_make_diag_at(rego); register_make_diag_at_source(rego); + register_make_diag_at_source_full(rego); register_make_diag_full(rego); register_make_diag_related(rego); register_make_diag_conditional(rego); @@ -81,6 +85,9 @@ pub(crate) fn register_all( register_scenario_source_path(rego); register_scenario_uses_unresolved_parameter(rego); register_properties_scenarios(rego); + register_list_member_scenarios(rego); + register_list_member_pair_source_paths(rego); + register_property_absence_scenarios(rego); register_dynamodb_scenario_analysis(rego); register_is_satisfiable(rego); register_get_resource(rego); @@ -750,6 +757,26 @@ fn project_selected_properties( projected } +fn register_property_absence_scenarios(rego: &mut regorus::Engine) { + let _ = rego.add_extension( + "property_absence_scenarios".into(), + 2, + Box::new(move |params: Vec| { + let Some(model) = current_model() else { + return Ok(Value::Undefined); + }; + let rid = params[0].as_string()?; + let property_name = params[1].as_string()?; + let results: Vec = model + .property_absence_scenarios(rid.as_ref(), property_name.as_ref()) + .iter() + .map(|conditions| json_to_value(&serde_json::json!(conditions))) + .collect(); + Ok(Value::from(results)) + }), + ); +} + fn register_properties_scenarios(rego: &mut regorus::Engine) { let _ = rego.add_extension( "properties_scenarios".into(), @@ -765,8 +792,9 @@ fn register_properties_scenarios(rego: &mut regorus::Engine) { selected_fields.insert(field.as_string()?.to_string()); } + let requested_names: Vec<&str> = selected_fields.iter().map(String::as_str).collect(); let results: Vec = model - .resolve_properties_scenarios_shared(rid.as_ref()) + .resolve_properties_scenarios_projected(rid.as_ref(), &requested_names) .iter() .map(|(properties, conditions)| { let properties = project_selected_properties(properties, &selected_fields); @@ -781,6 +809,53 @@ fn register_properties_scenarios(rego: &mut regorus::Engine) { ); } +fn register_list_member_scenarios(rego: &mut regorus::Engine) { + let _ = rego.add_extension( + "list_member_scenarios".into(), + 2, + Box::new(move |params: Vec| { + let Some(model) = current_model() else { + return Ok(Value::Undefined); + }; + let resource_id = params[0].as_string()?; + let path = params[1].as_string()?; + let results: Vec = model + .resolve_list_member_scenarios_shared(resource_id.as_ref(), path.as_ref()) + .iter() + .map(|scenario| { + json_to_value(&serde_json::json!({ + "index": scenario.index, + "value": resolved_value_to_json(&scenario.value), + "conditions": &scenario.conditions, + })) + }) + .collect(); + Ok(Value::from(results)) + }), + ); +} + +fn register_list_member_pair_source_paths(rego: &mut regorus::Engine) { + let _ = rego.add_extension( + "list_member_pair_source_paths".into(), + 3, + Box::new(move |params: Vec| { + let Some(model) = current_model() else { + return Ok(Value::Undefined); + }; + let resource_id = params[0].as_string()?; + let path = params[1].as_string()?; + let base_conditions: HashMap = condition_assumptions(¶ms[2]).into_iter().collect(); + let source_paths: Vec = model + .list_member_pair_source_paths(resource_id.as_ref(), path.as_ref(), &base_conditions) + .iter() + .map(|source_path| Value::from(source_path.as_str())) + .collect(); + Ok(Value::from(source_paths)) + }), + ); +} + fn register_dynamodb_scenario_analysis(rego: &mut regorus::Engine) { let _ = rego.add_extension( "dynamodb_scenario_analysis".into(), @@ -2301,6 +2376,43 @@ fn register_make_diag_at_source(rego: &mut regorus::Engine) { ); } +fn register_make_diag_at_source_full(rego: &mut regorus::Engine) { + let _ = rego.add_extension( + "make_diag_at_source_full".into(), + 7, + Box::new(move |params: Vec| { + let Some(model) = current_model() else { + return Ok(Value::Undefined); + }; + let rule_id = params[0].as_string()?; + let severity = params[1].as_string()?; + let resource_id = params[2].as_string()?; + let prop_path = params[3].as_string()?; + let source_path = params[4].as_string()?; + let message = params[5].as_string()?; + let fix = params[6].as_string()?; + let span = resolve_span(&model, resource_id, source_path); + let fix_value = + if fix.is_empty() { serde_json::Value::Null } else { serde_json::Value::String(fix.to_string()) }; + let mut diagnostic = serde_json::json!({ + "rule_id": rule_id.as_ref(), "severity": severity.as_ref(), + "message": message.as_ref(), "resource_id": resource_id.as_ref(), + "resource_path": prop_path.as_ref(), + (DIAGNOSTIC_SOURCE_PATH_FIELD): source_path.as_ref(), + "suggested_fix": fix_value, + }); + if span != UNKNOWN_SPAN { + let fields = diagnostic.as_object_mut().unwrap(); + fields.insert("start_line".into(), span.start_line.into()); + fields.insert("start_column".into(), span.start_column.into()); + fields.insert("end_line".into(), span.end_line.into()); + fields.insert("end_column".into(), span.end_column.into()); + } + Ok(json_to_value(&diagnostic)) + }), + ); +} + fn register_make_diag_full(rego: &mut regorus::Engine) { let _ = rego.add_extension( "make_diag_full".into(), diff --git a/src/resources/expected/validation_reports1.json b/src/resources/expected/validation_reports1.json index cf5374d6..5b90a5a8 100644 --- a/src/resources/expected/validation_reports1.json +++ b/src/resources/expected/validation_reports1.json @@ -331,12 +331,12 @@ "entityType": "Resource", "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.SnapStart", + "propertyPath": "Properties.SnapStart.ApplyOn", "suggestedFix": "Add an AWS::Lambda::Version resource that references this function", "category": "Best Practice", - "startLine": 39, - "startColumn": 7, - "endLine": 39, + "startLine": 40, + "startColumn": 9, + "endLine": 40, "endColumn": 16, "ruleDescription": "Validate that SnapStart is properly configured", "phase": "LINT" @@ -351,12 +351,12 @@ "entityType": "Resource", "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.SnapStart", + "propertyPath": "Properties.SnapStart.ApplyOn", "suggestedFix": "Add an AWS::Lambda::Version resource that references this function", "category": "Best Practice", - "startLine": 50, - "startColumn": 7, - "endLine": 50, + "startLine": 51, + "startColumn": 9, + "endLine": 51, "endColumn": 16, "ruleDescription": "Validate that SnapStart is properly configured", "phase": "LINT" @@ -1544,6 +1544,208 @@ } ] }, + "bad/E3023_cname_conditional_record_counts.yaml": { + "filePath": "bad/E3023_cname_conditional_record_counts.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 3, + "counts": { + "fatal": 0, + "errors": 4, + "warnings": 0, + "informational": 2, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "E3023", + "severity": "ERROR", + "message": "CNAME records must have at most 1 ResourceRecord", + "source": "CFN_LINT", + "entity": { + "logicalId": "ConditionalList", + "entityType": "Resource", + "resourceType": "AWS::Route53::RecordSet" + }, + "propertyPath": "Properties.ResourceRecords", + "category": "Resource", + "startLine": 19, + "startColumn": 11, + "endLine": 19, + "endColumn": 12, + "ruleDescription": "Validate Route53 RecordSets", + "phase": "LINT" + }, + { + "ruleId": "E3023", + "severity": "ERROR", + "message": "CNAME records must have at most 1 ResourceRecord", + "source": "CFN_LINT", + "entity": { + "logicalId": "ConditionalList", + "entityType": "Resource", + "resourceType": "AWS::Route53::RecordSet" + }, + "propertyPath": "Properties.ResourceRecords", + "category": "Resource", + "startLine": 20, + "startColumn": 11, + "endLine": 20, + "endColumn": 12, + "ruleDescription": "Validate Route53 RecordSets", + "phase": "LINT" + }, + { + "ruleId": "E3023", + "severity": "ERROR", + "message": "CNAME records must have at most 1 ResourceRecord", + "source": "CFN_LINT", + "entity": { + "logicalId": "ConditionalProperties", + "entityType": "Resource", + "resourceType": "AWS::Route53::RecordSet" + }, + "propertyPath": "Properties.ResourceRecords", + "category": "Resource", + "startLine": 29, + "startColumn": 9, + "endLine": 29, + "endColumn": 24, + "ruleDescription": "Validate Route53 RecordSets", + "phase": "LINT" + }, + { + "ruleId": "E3023", + "severity": "ERROR", + "message": "CNAME records must have at most 1 ResourceRecord", + "source": "CFN_LINT", + "entity": { + "logicalId": "ConditionalProperties", + "entityType": "Resource", + "resourceType": "AWS::Route53::RecordSet" + }, + "propertyPath": "Properties.ResourceRecords", + "category": "Resource", + "startLine": 34, + "startColumn": 9, + "endLine": 34, + "endColumn": 24, + "ruleDescription": "Validate Route53 RecordSets", + "phase": "LINT" + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'HostedZoneName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConditionalList", + "entityType": "Resource", + "resourceType": "AWS::Route53::RecordSet" + }, + "propertyPath": "Properties.HostedZoneName", + "category": "Best Practice", + "startLine": 13, + "startColumn": 7, + "endLine": 13, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53-recordset", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'HostedZoneName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "SingleRecordBranches", + "entityType": "Resource", + "resourceType": "AWS::Route53::RecordSet" + }, + "propertyPath": "Properties.HostedZoneName", + "category": "Best Practice", + "startLine": 38, + "startColumn": 7, + "endLine": 38, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53-recordset", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + } + ] + }, + "bad/E3023_cname_projection_covering.yaml": { + "filePath": "bad/E3023_cname_projection_covering.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 1, + "warnings": 0, + "informational": 1, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "E3023", + "severity": "ERROR", + "message": "CNAME record Name 'example.com.' must not match HostedZoneName 'example.com.' exactly", + "source": "CFN_LINT", + "entity": { + "logicalId": "Record", + "entityType": "Resource", + "resourceType": "AWS::Route53::RecordSet" + }, + "propertyPath": "Properties.Name", + "category": "Resource", + "startLine": 76, + "startColumn": 50, + "endLine": 76, + "endColumn": 51, + "ruleDescription": "Validate Route53 RecordSets", + "phase": "LINT" + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'HostedZoneName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "Record", + "entityType": "Resource", + "resourceType": "AWS::Route53::RecordSet" + }, + "propertyPath": "Properties.HostedZoneName", + "category": "Best Practice", + "startLine": 75, + "startColumn": 7, + "endLine": 75, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53-recordset", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + } + ] + }, "bad/E3023_conditional_record_items.yaml": { "filePath": "bad/E3023_conditional_record_items.yaml", "status": "OK", @@ -1646,16 +1848,16 @@ } ] }, - "bad/E3031_cognito_user_pool_domain_pattern.yaml": { - "filePath": "bad/E3031_cognito_user_pool_domain_pattern.yaml", + "bad/E3023_record_value_projection_covering.yaml": { + "filePath": "bad/E3023_record_value_projection_covering.yaml", "status": "OK", "metadata": { - "resourcesScanned": 7, + "resourcesScanned": 2, "counts": { "fatal": 0, - "errors": 6, + "errors": 2, "warnings": 0, - "informational": 12, + "informational": 2, "debug": 0 }, "suppressed": 0, @@ -1664,299 +1866,494 @@ }, "diagnostics": [ { - "ruleId": "E3031", + "ruleId": "E3023", "severity": "ERROR", - "message": "'-myprefix' does not match pattern '^[a-z0-9](?:[a-z0-9\\-]{0,61}[a-z0-9])?$'", + "message": "CNAME records must have at most 1 ResourceRecord", "source": "CFN_LINT", "entity": { - "logicalId": "PrefixLeadingHyphen", + "logicalId": "CnameCountRecord", "entityType": "Resource", - "resourceType": "AWS::Cognito::UserPoolDomain" + "resourceType": "AWS::Route53::RecordSet" }, - "propertyPath": "Properties.Domain", - "category": "Schema", - "startLine": 18, + "propertyPath": "Properties.ResourceRecords", + "category": "Resource", + "startLine": 69, "startColumn": 7, - "endLine": 18, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Check if property values adhere to a specific pattern", - "phase": "SCHEMA", - "context": { - "actualValue": "-myprefix" - } + "endLine": 69, + "endColumn": 22, + "ruleDescription": "Validate Route53 RecordSets", + "phase": "LINT" }, { - "ruleId": "E3031", + "ruleId": "E3023", "severity": "ERROR", - "message": "'myprefix-' does not match pattern '^[a-z0-9](?:[a-z0-9\\-]{0,61}[a-z0-9])?$'", + "message": "'not-an-ip' is not a valid IPv4 address for record type 'A'", "source": "CFN_LINT", "entity": { - "logicalId": "PrefixTrailingHyphen", + "logicalId": "AddressRecord", "entityType": "Resource", - "resourceType": "AWS::Cognito::UserPoolDomain" + "resourceType": "AWS::Route53::RecordSet" }, - "propertyPath": "Properties.Domain", - "category": "Schema", - "startLine": 23, - "startColumn": 7, - "endLine": 23, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Check if property values adhere to a specific pattern", - "phase": "SCHEMA", - "context": { - "actualValue": "myprefix-" - } + "propertyPath": "Properties.ResourceRecords.1", + "category": "Resource", + "startLine": 91, + "startColumn": 43, + "endLine": 91, + "endColumn": 44, + "ruleDescription": "Validate Route53 RecordSets", + "phase": "LINT" }, { - "ruleId": "E3031", - "severity": "ERROR", - "message": "'---' does not match pattern '^[a-z0-9](?:[a-z0-9\\-]{0,61}[a-z0-9])?$'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'HostedZoneName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "PrefixOnlyHyphens", + "logicalId": "CnameCountRecord", "entityType": "Resource", - "resourceType": "AWS::Cognito::UserPoolDomain" + "resourceType": "AWS::Route53::RecordSet" }, - "propertyPath": "Properties.Domain", - "category": "Schema", - "startLine": 28, + "propertyPath": "Properties.HostedZoneName", + "category": "Best Practice", + "startLine": 65, "startColumn": 7, - "endLine": 28, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Check if property values adhere to a specific pattern", + "endLine": 65, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53-recordset", + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "actualValue": "---" + "lifecycle": "create-only" } }, { - "ruleId": "E3031", - "severity": "ERROR", - "message": "'MyPrefix' does not match pattern '^[a-z0-9](?:[a-z0-9\\-]{0,61}[a-z0-9])?$'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'HostedZoneName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "PrefixUppercase", + "logicalId": "AddressRecord", "entityType": "Resource", - "resourceType": "AWS::Cognito::UserPoolDomain" + "resourceType": "AWS::Route53::RecordSet" }, - "propertyPath": "Properties.Domain", - "category": "Schema", - "startLine": 33, + "propertyPath": "Properties.HostedZoneName", + "category": "Best Practice", + "startLine": 85, "startColumn": 7, - "endLine": 33, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Check if property values adhere to a specific pattern", + "endLine": 85, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53-recordset", + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "actualValue": "MyPrefix" + "lifecycle": "create-only" } + } + ] + }, + "bad/E3023_recordsetgroup_projection_covering.yaml": { + "filePath": "bad/E3023_recordsetgroup_projection_covering.yaml", + "status": "ANALYSIS_INCOMPLETE", + "metadata": { + "resourcesScanned": 2, + "counts": { + "fatal": 0, + "errors": 2, + "warnings": 1, + "informational": 2, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG", + "budgetExhaustions": [ + { + "kind": "schemaScenarioAssignments", + "description": "Checking resource schemas required more conditional value assignments than the supported limit.", + "limit": 256, + "analysisIncomplete": true + } + ] + }, + "diagnostics": [ { - "ruleId": "E3031", + "ruleId": "E3023", "severity": "ERROR", - "message": "'nodots' does not match pattern '^[a-z0-9](?:[a-z0-9\\-]*[a-z0-9])?(?:\\.[a-z0-9](?:[a-z0-9\\-]*[a-z0-9])?)+$'", + "message": "CNAME records must have at most 1 ResourceRecord", "source": "CFN_LINT", "entity": { - "logicalId": "CustomDomainWithoutDots", + "logicalId": "CnameGroup", "entityType": "Resource", - "resourceType": "AWS::Cognito::UserPoolDomain" + "resourceType": "AWS::Route53::RecordSetGroup" }, - "propertyPath": "Properties.Domain", - "category": "Schema", - "startLine": 38, - "startColumn": 7, - "endLine": 38, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Check if property values adhere to a specific pattern", - "phase": "SCHEMA", - "context": { - "actualValue": "nodots" - } + "propertyPath": "Properties.RecordSets.0.ResourceRecords", + "category": "Resource", + "startLine": 42, + "startColumn": 11, + "endLine": 42, + "endColumn": 26, + "ruleDescription": "Validate Route53 RecordSets", + "phase": "LINT" }, { - "ruleId": "E3031", + "ruleId": "E3023", "severity": "ERROR", - "message": "'-auth.example.com' does not match pattern '^[a-z0-9](?:[a-z0-9\\-]*[a-z0-9])?(?:\\.[a-z0-9](?:[a-z0-9\\-]*[a-z0-9])?)+$'", + "message": "'not-an-ip' is not a valid IPv4 address for record type 'A'", "source": "CFN_LINT", "entity": { - "logicalId": "CustomDomainLeadingHyphen", + "logicalId": "AddressGroup", "entityType": "Resource", - "resourceType": "AWS::Cognito::UserPoolDomain" + "resourceType": "AWS::Route53::RecordSetGroup" }, - "propertyPath": "Properties.Domain", - "category": "Schema", - "startLine": 45, - "startColumn": 7, - "endLine": 45, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Check if property values adhere to a specific pattern", - "phase": "SCHEMA", + "propertyPath": "Properties.RecordSets.0.ResourceRecords.1", + "category": "Resource", + "startLine": 65, + "startColumn": 47, + "endLine": 65, + "endColumn": 48, + "ruleDescription": "Validate Route53 RecordSets", + "phase": "LINT" + }, + { + "ruleId": "W9052", + "severity": "WARN", + "message": "Deterministic validation budgets were exhausted; analysis may be incomplete and some findings may be omitted", + "source": "ENGINE", + "category": "Structure", + "ruleDescription": "Deterministic validation budgets were exhausted; see report metadata for completeness impact", + "phase": "LINT", "context": { - "actualValue": "-auth.example.com" + "extra": { + "budgetExhaustions": [ + { + "kind": "schemaScenarioAssignments", + "description": "Checking resource schemas required more conditional value assignments than the supported limit.", + "limit": 256, + "analysisIncomplete": true + } + ] + } } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'UserPoolId' is create-only; updating it will cause resource replacement", + "message": "Property 'HostedZoneName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "PrefixLeadingHyphen", + "logicalId": "CnameGroup", "entityType": "Resource", - "resourceType": "AWS::Cognito::UserPoolDomain" + "resourceType": "AWS::Route53::RecordSetGroup" }, - "propertyPath": "Properties.UserPoolId", + "propertyPath": "Properties.HostedZoneName", "category": "Best Practice", - "startLine": 17, + "startLine": 37, "startColumn": 7, - "endLine": 17, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "endLine": 37, + "endColumn": 21, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'UserPool'" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Domain' is create-only; updating it will cause resource replacement", + "message": "Property 'HostedZoneName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "PrefixLeadingHyphen", + "logicalId": "AddressGroup", "entityType": "Resource", - "resourceType": "AWS::Cognito::UserPoolDomain" + "resourceType": "AWS::Route53::RecordSetGroup" }, - "propertyPath": "Properties.Domain", + "propertyPath": "Properties.HostedZoneName", "category": "Best Practice", - "startLine": 18, + "startLine": 58, "startColumn": 7, - "endLine": 18, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "endLine": 58, + "endColumn": 21, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only" } + } + ] + }, + "bad/E3029_alias_projection_covering.yaml": { + "filePath": "bad/E3029_alias_projection_covering.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 2, + "warnings": 0, + "informational": 2, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'UserPoolId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E3029", + "severity": "ERROR", + "message": "TTL must not be set when AliasTarget is specified", + "source": "CFN_LINT", "entity": { - "logicalId": "PrefixTrailingHyphen", + "logicalId": "Record", "entityType": "Resource", - "resourceType": "AWS::Cognito::UserPoolDomain" + "resourceType": "AWS::Route53::RecordSet" }, - "propertyPath": "Properties.UserPoolId", - "category": "Best Practice", - "startLine": 22, + "propertyPath": "Properties.TTL", + "category": "Resource", + "startLine": 30, "startColumn": 7, - "endLine": 22, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'UserPool'" - } + "endLine": 30, + "endColumn": 10, + "ruleDescription": "Validate Route53 record set aliases", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Domain' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E3029", + "severity": "ERROR", + "message": "AliasTarget cannot be used with record type 'NS'", + "source": "CFN_LINT", "entity": { - "logicalId": "PrefixTrailingHyphen", + "logicalId": "Record", "entityType": "Resource", - "resourceType": "AWS::Cognito::UserPoolDomain" + "resourceType": "AWS::Route53::RecordSet" }, - "propertyPath": "Properties.Domain", - "category": "Best Practice", - "startLine": 23, + "propertyPath": "Properties.AliasTarget", + "category": "Resource", + "startLine": 31, "startColumn": 7, - "endLine": 23, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "endLine": 31, + "endColumn": 18, + "ruleDescription": "Validate Route53 record set aliases", + "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'UserPoolId' is create-only; updating it will cause resource replacement", + "message": "Property 'HostedZoneName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "PrefixOnlyHyphens", + "logicalId": "Record", "entityType": "Resource", - "resourceType": "AWS::Cognito::UserPoolDomain" + "resourceType": "AWS::Route53::RecordSet" }, - "propertyPath": "Properties.UserPoolId", + "propertyPath": "Properties.HostedZoneName", "category": "Best Practice", "startLine": 27, "startColumn": 7, "endLine": 27, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53-recordset", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'UserPool'" + "lifecycle": "create-only" } }, { - "ruleId": "I9001", + "ruleId": "I9002", "severity": "INFO", - "message": "Property 'Domain' is create-only; updating it will cause resource replacement", + "message": "'TTL' is ignored in this configuration (from extension)", "source": "ENGINE", "entity": { - "logicalId": "PrefixOnlyHyphens", + "logicalId": "Record", "entityType": "Resource", - "resourceType": "AWS::Cognito::UserPoolDomain" + "resourceType": "AWS::Route53::RecordSet" }, - "propertyPath": "Properties.Domain", + "propertyPath": "Properties.TTL", "category": "Best Practice", - "startLine": 28, + "startLine": 30, "startColumn": 7, - "endLine": 28, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", + "endLine": 30, + "endColumn": 10, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53-recordset", + "ruleDescription": "Property is ignored in this configuration (from extension)", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "resolutionSource": "parameter with AllowedValues" } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'UserPoolId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "PrefixUppercase", - "entityType": "Resource", + } + ] + }, + "bad/E3031_cognito_user_pool_domain_pattern.yaml": { + "filePath": "bad/E3031_cognito_user_pool_domain_pattern.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 7, + "counts": { + "fatal": 0, + "errors": 6, + "warnings": 0, + "informational": 12, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "E3031", + "severity": "ERROR", + "message": "'-myprefix' does not match pattern '^[a-z0-9](?:[a-z0-9\\-]{0,61}[a-z0-9])?$'", + "source": "CFN_LINT", + "entity": { + "logicalId": "PrefixLeadingHyphen", + "entityType": "Resource", + "resourceType": "AWS::Cognito::UserPoolDomain" + }, + "propertyPath": "Properties.Domain", + "category": "Schema", + "startLine": 18, + "startColumn": 7, + "endLine": 18, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Check if property values adhere to a specific pattern", + "phase": "SCHEMA", + "context": { + "actualValue": "-myprefix" + } + }, + { + "ruleId": "E3031", + "severity": "ERROR", + "message": "'myprefix-' does not match pattern '^[a-z0-9](?:[a-z0-9\\-]{0,61}[a-z0-9])?$'", + "source": "CFN_LINT", + "entity": { + "logicalId": "PrefixTrailingHyphen", + "entityType": "Resource", + "resourceType": "AWS::Cognito::UserPoolDomain" + }, + "propertyPath": "Properties.Domain", + "category": "Schema", + "startLine": 23, + "startColumn": 7, + "endLine": 23, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Check if property values adhere to a specific pattern", + "phase": "SCHEMA", + "context": { + "actualValue": "myprefix-" + } + }, + { + "ruleId": "E3031", + "severity": "ERROR", + "message": "'---' does not match pattern '^[a-z0-9](?:[a-z0-9\\-]{0,61}[a-z0-9])?$'", + "source": "CFN_LINT", + "entity": { + "logicalId": "PrefixOnlyHyphens", + "entityType": "Resource", + "resourceType": "AWS::Cognito::UserPoolDomain" + }, + "propertyPath": "Properties.Domain", + "category": "Schema", + "startLine": 28, + "startColumn": 7, + "endLine": 28, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Check if property values adhere to a specific pattern", + "phase": "SCHEMA", + "context": { + "actualValue": "---" + } + }, + { + "ruleId": "E3031", + "severity": "ERROR", + "message": "'MyPrefix' does not match pattern '^[a-z0-9](?:[a-z0-9\\-]{0,61}[a-z0-9])?$'", + "source": "CFN_LINT", + "entity": { + "logicalId": "PrefixUppercase", + "entityType": "Resource", + "resourceType": "AWS::Cognito::UserPoolDomain" + }, + "propertyPath": "Properties.Domain", + "category": "Schema", + "startLine": 33, + "startColumn": 7, + "endLine": 33, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Check if property values adhere to a specific pattern", + "phase": "SCHEMA", + "context": { + "actualValue": "MyPrefix" + } + }, + { + "ruleId": "E3031", + "severity": "ERROR", + "message": "'nodots' does not match pattern '^[a-z0-9](?:[a-z0-9\\-]*[a-z0-9])?(?:\\.[a-z0-9](?:[a-z0-9\\-]*[a-z0-9])?)+$'", + "source": "CFN_LINT", + "entity": { + "logicalId": "CustomDomainWithoutDots", + "entityType": "Resource", + "resourceType": "AWS::Cognito::UserPoolDomain" + }, + "propertyPath": "Properties.Domain", + "category": "Schema", + "startLine": 38, + "startColumn": 7, + "endLine": 38, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Check if property values adhere to a specific pattern", + "phase": "SCHEMA", + "context": { + "actualValue": "nodots" + } + }, + { + "ruleId": "E3031", + "severity": "ERROR", + "message": "'-auth.example.com' does not match pattern '^[a-z0-9](?:[a-z0-9\\-]*[a-z0-9])?(?:\\.[a-z0-9](?:[a-z0-9\\-]*[a-z0-9])?)+$'", + "source": "CFN_LINT", + "entity": { + "logicalId": "CustomDomainLeadingHyphen", + "entityType": "Resource", + "resourceType": "AWS::Cognito::UserPoolDomain" + }, + "propertyPath": "Properties.Domain", + "category": "Schema", + "startLine": 45, + "startColumn": 7, + "endLine": 45, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Check if property values adhere to a specific pattern", + "phase": "SCHEMA", + "context": { + "actualValue": "-auth.example.com" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'UserPoolId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "PrefixLeadingHyphen", + "entityType": "Resource", "resourceType": "AWS::Cognito::UserPoolDomain" }, "propertyPath": "Properties.UserPoolId", "category": "Best Practice", - "startLine": 32, + "startLine": 17, "startColumn": 7, - "endLine": 32, + "endLine": 17, "endColumn": 17, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -1972,15 +2369,15 @@ "message": "Property 'Domain' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "PrefixUppercase", + "logicalId": "PrefixLeadingHyphen", "entityType": "Resource", "resourceType": "AWS::Cognito::UserPoolDomain" }, "propertyPath": "Properties.Domain", "category": "Best Practice", - "startLine": 33, + "startLine": 18, "startColumn": 7, - "endLine": 33, + "endLine": 18, "endColumn": 13, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -1995,15 +2392,15 @@ "message": "Property 'UserPoolId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "CustomDomainWithoutDots", + "logicalId": "PrefixTrailingHyphen", "entityType": "Resource", "resourceType": "AWS::Cognito::UserPoolDomain" }, "propertyPath": "Properties.UserPoolId", "category": "Best Practice", - "startLine": 37, + "startLine": 22, "startColumn": 7, - "endLine": 37, + "endLine": 22, "endColumn": 17, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -2019,15 +2416,15 @@ "message": "Property 'Domain' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "CustomDomainWithoutDots", + "logicalId": "PrefixTrailingHyphen", "entityType": "Resource", "resourceType": "AWS::Cognito::UserPoolDomain" }, "propertyPath": "Properties.Domain", "category": "Best Practice", - "startLine": 38, + "startLine": 23, "startColumn": 7, - "endLine": 38, + "endLine": 23, "endColumn": 13, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -2042,15 +2439,15 @@ "message": "Property 'UserPoolId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "CustomDomainLeadingHyphen", + "logicalId": "PrefixOnlyHyphens", "entityType": "Resource", "resourceType": "AWS::Cognito::UserPoolDomain" }, "propertyPath": "Properties.UserPoolId", "category": "Best Practice", - "startLine": 44, + "startLine": 27, "startColumn": 7, - "endLine": 44, + "endLine": 27, "endColumn": 17, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -2066,15 +2463,15 @@ "message": "Property 'Domain' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "CustomDomainLeadingHyphen", + "logicalId": "PrefixOnlyHyphens", "entityType": "Resource", "resourceType": "AWS::Cognito::UserPoolDomain" }, "propertyPath": "Properties.Domain", "category": "Best Practice", - "startLine": 45, + "startLine": 28, "startColumn": 7, - "endLine": 45, + "endLine": 28, "endColumn": 13, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -2082,54 +2479,195 @@ "context": { "lifecycle": "create-only" } - } - ] - }, - "bad/E3032_E3002_E3689_conditional_constraints.yaml": { - "filePath": "bad/E3032_E3002_E3689_conditional_constraints.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 5, - "counts": { - "fatal": 0, - "errors": 8, - "warnings": 1, - "informational": 26, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "E3002", - "severity": "ERROR", - "message": "'admin' must not be one of ['admin'] for a PostgreSQL-compatible engine, where it is a reserved word", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'UserPoolId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ClusterReservedMasterUsername", + "logicalId": "PrefixUppercase", "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" + "resourceType": "AWS::Cognito::UserPoolDomain" }, - "propertyPath": "Properties.MasterUsername", - "category": "Schema", - "startLine": 53, + "propertyPath": "Properties.UserPoolId", + "category": "Best Practice", + "startLine": 32, "startColumn": 7, - "endLine": 53, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", - "ruleDescription": "Resource properties are invalid", + "endLine": 32, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "property": "MasterUsername" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'UserPool'" } }, { - "ruleId": "E3032", - "severity": "ERROR", - "message": "Array length 1 is below minimum 2 for a table with local secondary indexes", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Domain' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "PrefixUppercase", + "entityType": "Resource", + "resourceType": "AWS::Cognito::UserPoolDomain" + }, + "propertyPath": "Properties.Domain", + "category": "Best Practice", + "startLine": 33, + "startColumn": 7, + "endLine": 33, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'UserPoolId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "CustomDomainWithoutDots", + "entityType": "Resource", + "resourceType": "AWS::Cognito::UserPoolDomain" + }, + "propertyPath": "Properties.UserPoolId", + "category": "Best Practice", + "startLine": 37, + "startColumn": 7, + "endLine": 37, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'UserPool'" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Domain' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "CustomDomainWithoutDots", + "entityType": "Resource", + "resourceType": "AWS::Cognito::UserPoolDomain" + }, + "propertyPath": "Properties.Domain", + "category": "Best Practice", + "startLine": 38, + "startColumn": 7, + "endLine": 38, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'UserPoolId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "CustomDomainLeadingHyphen", + "entityType": "Resource", + "resourceType": "AWS::Cognito::UserPoolDomain" + }, + "propertyPath": "Properties.UserPoolId", + "category": "Best Practice", + "startLine": 44, + "startColumn": 7, + "endLine": 44, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'UserPool'" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Domain' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "CustomDomainLeadingHyphen", + "entityType": "Resource", + "resourceType": "AWS::Cognito::UserPoolDomain" + }, + "propertyPath": "Properties.Domain", + "category": "Best Practice", + "startLine": 45, + "startColumn": 7, + "endLine": 45, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + } + ] + }, + "bad/E3032_E3002_E3689_conditional_constraints.yaml": { + "filePath": "bad/E3032_E3002_E3689_conditional_constraints.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 5, + "counts": { + "fatal": 0, + "errors": 8, + "warnings": 1, + "informational": 26, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "E3002", + "severity": "ERROR", + "message": "'admin' must not be one of ['admin'] for a PostgreSQL-compatible engine, where it is a reserved word", + "source": "CFN_LINT", + "entity": { + "logicalId": "ClusterReservedMasterUsername", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBCluster" + }, + "propertyPath": "Properties.MasterUsername", + "category": "Schema", + "startLine": 53, + "startColumn": 7, + "endLine": 53, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", + "ruleDescription": "Resource properties are invalid", + "phase": "SCHEMA", + "context": { + "property": "MasterUsername" + } + }, + { + "ruleId": "E3032", + "severity": "ERROR", + "message": "Array length 1 is below minimum 2 for a table with local secondary indexes", + "source": "CFN_LINT", "entity": { "logicalId": "TableWithLsiSingleKey", "entityType": "Resource", @@ -2820,16 +3358,16 @@ } ] }, - "bad/E3059_subnet_outside_every_vpc_cidr.yaml": { - "filePath": "bad/E3059_subnet_outside_every_vpc_cidr.yaml", + "bad/E3048_fargate_projection_covering.yaml": { + "filePath": "bad/E3048_fargate_projection_covering.yaml", "status": "OK", "metadata": { - "resourcesScanned": 6, + "resourcesScanned": 1, "counts": { "fatal": 0, - "errors": 3, + "errors": 1, "warnings": 0, - "informational": 15, + "informational": 7, "debug": 0 }, "suppressed": 0, @@ -2838,116 +3376,317 @@ }, "diagnostics": [ { - "ruleId": "E3059", - "severity": "ERROR", - "message": "Subnet CIDR '10.2.0.0/24' is not within any VPC CIDR ['10.0.0.0/16', '10.1.0.0/16']", - "source": "CFN_LINT", - "entity": { - "logicalId": "OutsideBothBlocks", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.CidrBlock", - "category": "Resource", - "startLine": 25, - "startColumn": 7, - "endLine": 25, - "endColumn": 16, - "ruleDescription": "Validate subnet CIDRs are within the CIDRs of the VPC", - "phase": "LINT" - }, - { - "ruleId": "E3059", - "severity": "ERROR", - "message": "Subnet CIDR '172.16.0.0/24' is not within any VPC CIDR ['10.0.0.0/16', '10.1.0.0/16']", - "source": "CFN_LINT", - "entity": { - "logicalId": "OutsideOnlyInProd", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.CidrBlock", - "category": "Resource", - "startLine": 30, - "startColumn": 7, - "endLine": 30, - "endColumn": 16, - "ruleDescription": "Validate subnet CIDRs are within the CIDRs of the VPC", - "phase": "LINT" - }, - { - "ruleId": "E3059", + "ruleId": "E3048", "severity": "ERROR", - "message": "Subnet CIDR '10.6.0.0/24' is not within VPC CIDR '10.5.0.0/16'", + "message": "Fargate requires NetworkMode to be specified as 'awsvpc'", "source": "CFN_LINT", "entity": { - "logicalId": "OutsidePlainVpc", + "logicalId": "Task", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Properties", + "suggestedFix": "Set NetworkMode to 'awsvpc'", "category": "Resource", - "startLine": 39, - "startColumn": 7, - "endLine": 39, - "endColumn": 16, - "ruleDescription": "Validate subnet CIDRs are within the CIDRs of the VPC", + "startLine": 69, + "startColumn": 5, + "endLine": 69, + "endColumn": 15, + "ruleDescription": "Validate ECS Fargate tasks have required properties and values", "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Vpc", + "logicalId": "Task", "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 15, + "startLine": 70, "startColumn": 7, - "endLine": 15, - "endColumn": 16, + "endLine": 70, + "endColumn": 30, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "Fn::If on condition 'IsFargate'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SecondaryBlock", + "logicalId": "Task", "entityType": "Resource", - "resourceType": "AWS::EC2::VPCCidrBlock" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.Cpu", "category": "Best Practice", - "startLine": 19, + "startLine": 71, "startColumn": 7, - "endLine": 19, - "endColumn": 12, + "endLine": 71, + "endColumn": 10, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "Ref to 'Vpc'" + "resolutionSource": "Fn::If on condition 'IsNotFargate'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Property 'Memory' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SecondaryBlock", + "logicalId": "Task", "entityType": "Resource", - "resourceType": "AWS::EC2::VPCCidrBlock" + "resourceType": "AWS::ECS::TaskDefinition" + }, + "propertyPath": "Properties.Memory", + "category": "Best Practice", + "startLine": 72, + "startColumn": 7, + "endLine": 72, + "endColumn": 13, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "Task", + "entityType": "Resource", + "resourceType": "AWS::ECS::TaskDefinition" + }, + "propertyPath": "Properties.NetworkMode", + "category": "Best Practice", + "startLine": 73, + "startColumn": 7, + "endLine": 73, + "endColumn": 18, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Fn::If on condition 'NetworkFirst'" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "Task", + "entityType": "Resource", + "resourceType": "AWS::ECS::TaskDefinition" + }, + "propertyPath": "Properties.ContainerDefinitions", + "category": "Best Practice", + "startLine": 74, + "startColumn": 7, + "endLine": 74, + "endColumn": 27, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'PlacementConstraints' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "Task", + "entityType": "Resource", + "resourceType": "AWS::ECS::TaskDefinition" + }, + "propertyPath": "Properties.PlacementConstraints", + "category": "Best Practice", + "startLine": 78, + "startColumn": 7, + "endLine": 78, + "endColumn": 27, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Fn::If on condition 'IsNotFargate'" + } + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Task' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "Task", + "entityType": "Resource", + "resourceType": "AWS::ECS::TaskDefinition" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 69, + "startColumn": 5, + "endLine": 69, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "bad/E3059_subnet_outside_every_vpc_cidr.yaml": { + "filePath": "bad/E3059_subnet_outside_every_vpc_cidr.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 6, + "counts": { + "fatal": 0, + "errors": 3, + "warnings": 0, + "informational": 15, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "E3059", + "severity": "ERROR", + "message": "Subnet CIDR '10.2.0.0/24' is not within any VPC CIDR ['10.0.0.0/16', '10.1.0.0/16']", + "source": "CFN_LINT", + "entity": { + "logicalId": "OutsideBothBlocks", + "entityType": "Resource", + "resourceType": "AWS::EC2::Subnet" + }, + "propertyPath": "Properties.CidrBlock", + "category": "Resource", + "startLine": 25, + "startColumn": 7, + "endLine": 25, + "endColumn": 16, + "ruleDescription": "Validate subnet CIDRs are within the CIDRs of the VPC", + "phase": "LINT" + }, + { + "ruleId": "E3059", + "severity": "ERROR", + "message": "Subnet CIDR '172.16.0.0/24' is not within any VPC CIDR ['10.0.0.0/16', '10.1.0.0/16']", + "source": "CFN_LINT", + "entity": { + "logicalId": "OutsideOnlyInProd", + "entityType": "Resource", + "resourceType": "AWS::EC2::Subnet" + }, + "propertyPath": "Properties.CidrBlock", + "category": "Resource", + "startLine": 30, + "startColumn": 7, + "endLine": 30, + "endColumn": 16, + "ruleDescription": "Validate subnet CIDRs are within the CIDRs of the VPC", + "phase": "LINT" + }, + { + "ruleId": "E3059", + "severity": "ERROR", + "message": "Subnet CIDR '10.6.0.0/24' is not within VPC CIDR '10.5.0.0/16'", + "source": "CFN_LINT", + "entity": { + "logicalId": "OutsidePlainVpc", + "entityType": "Resource", + "resourceType": "AWS::EC2::Subnet" + }, + "propertyPath": "Properties.CidrBlock", + "category": "Resource", + "startLine": 39, + "startColumn": 7, + "endLine": 39, + "endColumn": 16, + "ruleDescription": "Validate subnet CIDRs are within the CIDRs of the VPC", + "phase": "LINT" + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "Vpc", + "entityType": "Resource", + "resourceType": "AWS::EC2::VPC" + }, + "propertyPath": "Properties.CidrBlock", + "category": "Best Practice", + "startLine": 15, + "startColumn": 7, + "endLine": 15, + "endColumn": 16, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "SecondaryBlock", + "entityType": "Resource", + "resourceType": "AWS::EC2::VPCCidrBlock" + }, + "propertyPath": "Properties.VpcId", + "category": "Best Practice", + "startLine": 19, + "startColumn": 7, + "endLine": 19, + "endColumn": 12, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'Vpc'" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "SecondaryBlock", + "entityType": "Resource", + "resourceType": "AWS::EC2::VPCCidrBlock" }, "propertyPath": "Properties.CidrBlock", "category": "Best Practice", @@ -6222,16 +6961,16 @@ } ] }, - "bad/F6101_getatt_ref_typed_object_attribute.yaml": { - "filePath": "bad/F6101_getatt_ref_typed_object_attribute.yaml", + "bad/F3032_whole_properties_item_cardinality.yaml": { + "filePath": "bad/F3032_whole_properties_item_cardinality.yaml", "status": "OK", "metadata": { - "resourcesScanned": 2, + "resourcesScanned": 1, "counts": { - "fatal": 2, + "fatal": 1, "errors": 0, "warnings": 0, - "informational": 7, + "informational": 0, "debug": 0 }, "suppressed": 0, @@ -6240,27 +6979,92 @@ }, "diagnostics": [ { - "ruleId": "F3012", + "ruleId": "F3032", "severity": "FATAL", - "message": "GetAtt Database.Endpoint (AWS::RDS::DBInstance) returns 'object', but property expects 'string'", + "message": "expected maximum item count: 16, found: 17", "source": "SCHEMA", "entity": { - "logicalId": "Parameter", + "logicalId": "Function", "entityType": "Resource", - "resourceType": "AWS::SSM::Parameter" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.Value", + "propertyPath": "Properties.VpcConfig.SubnetIds", "category": "Schema", - "startLine": 28, - "startColumn": 7, - "endLine": 28, - "endColumn": 12, - "ruleDescription": "Property type mismatch", + "startLine": 80, + "startColumn": 5, + "endLine": 80, + "endColumn": 15, + "conditionScenario": { + "Enabled00": true, + "Enabled01": true, + "Enabled02": true, + "Enabled03": true, + "Enabled04": true, + "Enabled05": true, + "Enabled06": true, + "Enabled07": true, + "Enabled08": true, + "Enabled09": false, + "Enabled10": false, + "Enabled11": false, + "Enabled12": false, + "Enabled13": false, + "Enabled14": false, + "Enabled15": false, + "Enabled16": false, + "OuterEnabled": true + }, + "ruleDescription": "Array item count out of bounds", "phase": "SCHEMA", "context": { - "expectedConstraint": "string", - "resolutionSource": "GetAtt Database.Endpoint" - } + "extra": { + "actual_count": 17, + "max_items": 16, + "min_items": 0 + } + } + } + ] + }, + "bad/F6101_getatt_ref_typed_object_attribute.yaml": { + "filePath": "bad/F6101_getatt_ref_typed_object_attribute.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 2, + "counts": { + "fatal": 2, + "errors": 0, + "warnings": 0, + "informational": 7, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "F3012", + "severity": "FATAL", + "message": "GetAtt Database.Endpoint (AWS::RDS::DBInstance) returns 'object', but property expects 'string'", + "source": "SCHEMA", + "entity": { + "logicalId": "Parameter", + "entityType": "Resource", + "resourceType": "AWS::SSM::Parameter" + }, + "propertyPath": "Properties.Value", + "category": "Schema", + "startLine": 28, + "startColumn": 7, + "endLine": 28, + "endColumn": 12, + "ruleDescription": "Property type mismatch", + "phase": "SCHEMA", + "context": { + "expectedConstraint": "string", + "resolutionSource": "GetAtt Database.Endpoint" + } }, { "ruleId": "F6101", @@ -7979,16 +8783,16 @@ } ] }, - "bad/W3010_full_coverage.yaml": { - "filePath": "bad/W3010_full_coverage.yaml", + "bad/W2530_snapstart_conditional_apply_on.yaml": { + "filePath": "bad/W2530_snapstart_conditional_apply_on.yaml", "status": "OK", "metadata": { - "resourcesScanned": 9, + "resourcesScanned": 7, "counts": { "fatal": 0, "errors": 0, - "warnings": 12, - "informational": 29, + "warnings": 8, + "informational": 7, "debug": 0 }, "suppressed": 0, @@ -7997,688 +8801,535 @@ }, "diagnostics": [ { - "ruleId": "W3010", + "ruleId": "W2530", "severity": "WARN", - "message": "Avoid hardcoding availability zones 'us-east-1a'", + "message": "SnapStart is enabled but no AWS::Lambda::Version resource is attached", "source": "CFN_LINT", "entity": { - "logicalId": "Asg", + "logicalId": "PropertiesTrueBranch", "entityType": "Resource", - "resourceType": "AWS::AutoScaling::AutoScalingGroup" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.AvailabilityZones.0", + "propertyPath": "Properties.SnapStart.ApplyOn", + "suggestedFix": "Add an AWS::Lambda::Version resource that references this function", "category": "Best Practice", - "startLine": 9, + "startLine": 17, "startColumn": 11, - "endLine": 9, - "endColumn": 12, - "ruleDescription": "Availability zone properties should not be hardcoded", + "endLine": 17, + "endColumn": 18, + "ruleDescription": "Validate that SnapStart is properly configured", "phase": "LINT" }, { - "ruleId": "W3010", + "ruleId": "W2530", "severity": "WARN", - "message": "Avoid hardcoding availability zones 'us-east-1b'", + "message": "SnapStart is enabled but no AWS::Lambda::Version resource is attached", "source": "CFN_LINT", "entity": { - "logicalId": "Asg", + "logicalId": "PropertiesFalseBranch", "entityType": "Resource", - "resourceType": "AWS::AutoScaling::AutoScalingGroup" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.AvailabilityZones.1", + "propertyPath": "Properties.SnapStart.ApplyOn", + "suggestedFix": "Add an AWS::Lambda::Version resource that references this function", "category": "Best Practice", - "startLine": 10, + "startLine": 41, "startColumn": 11, - "endLine": 10, - "endColumn": 12, - "ruleDescription": "Availability zone properties should not be hardcoded", + "endLine": 41, + "endColumn": 18, + "ruleDescription": "Validate that SnapStart is properly configured", "phase": "LINT" }, { - "ruleId": "W3010", + "ruleId": "W2530", "severity": "WARN", - "message": "Avoid hardcoding availability zones 'us-east-1a'", + "message": "SnapStart is enabled but no AWS::Lambda::Version resource is attached", "source": "CFN_LINT", "entity": { - "logicalId": "Host", + "logicalId": "ApplyOnTrueBranch", "entityType": "Resource", - "resourceType": "AWS::EC2::Host" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.AvailabilityZone", + "propertyPath": "Properties.SnapStart.ApplyOn", + "suggestedFix": "Add an AWS::Lambda::Version resource that references this function", "category": "Best Practice", - "startLine": 17, - "startColumn": 7, - "endLine": 17, - "endColumn": 23, - "ruleDescription": "Availability zone properties should not be hardcoded", + "startLine": 52, + "startColumn": 34, + "endLine": 52, + "endColumn": 35, + "ruleDescription": "Validate that SnapStart is properly configured", "phase": "LINT" }, { - "ruleId": "W3010", + "ruleId": "W2530", "severity": "WARN", - "message": "Avoid hardcoding availability zones 'us-east-1a'", + "message": "SnapStart is enabled but no AWS::Lambda::Version resource is attached", "source": "CFN_LINT", "entity": { - "logicalId": "Instance", + "logicalId": "ApplyOnFalseBranch", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.AvailabilityZone", + "propertyPath": "Properties.SnapStart.ApplyOn", + "suggestedFix": "Add an AWS::Lambda::Version resource that references this function", "category": "Best Practice", - "startLine": 22, - "startColumn": 7, - "endLine": 22, - "endColumn": 23, - "ruleDescription": "Availability zone properties should not be hardcoded", + "startLine": 63, + "startColumn": 40, + "endLine": 63, + "endColumn": 41, + "ruleDescription": "Validate that SnapStart is properly configured", "phase": "LINT" }, { - "ruleId": "W3010", + "ruleId": "W2530", "severity": "WARN", - "message": "Avoid hardcoding availability zones 'us-east-1a'", + "message": "SnapStart is enabled but no AWS::Lambda::Version resource is attached", "source": "CFN_LINT", "entity": { - "logicalId": "Lt", + "logicalId": "ApplyOnBesideNoValue", "entityType": "Resource", - "resourceType": "AWS::EC2::LaunchTemplate" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.LaunchTemplateData.Placement.AvailabilityZone", + "propertyPath": "Properties.SnapStart.ApplyOn", + "suggestedFix": "Add an AWS::Lambda::Version resource that references this function", "category": "Best Practice", - "startLine": 30, - "startColumn": 11, - "endLine": 30, - "endColumn": 27, - "ruleDescription": "Availability zone properties should not be hardcoded", + "startLine": 74, + "startColumn": 53, + "endLine": 74, + "endColumn": 54, + "ruleDescription": "Validate that SnapStart is properly configured", "phase": "LINT" }, { - "ruleId": "W3010", + "ruleId": "W2530", "severity": "WARN", - "message": "Avoid hardcoding availability zones 'us-east-1a'", + "message": "SnapStart is enabled but no AWS::Lambda::Version resource is attached", "source": "CFN_LINT", "entity": { - "logicalId": "Subnet", + "logicalId": "SnapStartBesideNoValue", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.AvailabilityZone", + "propertyPath": "Properties.SnapStart.ApplyOn", + "suggestedFix": "Add an AWS::Lambda::Version resource that references this function", "category": "Best Practice", - "startLine": 36, - "startColumn": 7, - "endLine": 36, - "endColumn": 23, - "ruleDescription": "Availability zone properties should not be hardcoded", + "startLine": 87, + "startColumn": 11, + "endLine": 87, + "endColumn": 18, + "ruleDescription": "Validate that SnapStart is properly configured", "phase": "LINT" }, { - "ruleId": "W3010", + "ruleId": "W2530", "severity": "WARN", - "message": "Avoid hardcoding availability zones 'us-east-1a'", + "message": "SnapStart is enabled but no AWS::Lambda::Version resource is attached", "source": "CFN_LINT", "entity": { - "logicalId": "Volume", + "logicalId": "EveryBranchEnables", "entityType": "Resource", - "resourceType": "AWS::EC2::Volume" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.AvailabilityZone", + "propertyPath": "Properties.SnapStart.ApplyOn", + "suggestedFix": "Add an AWS::Lambda::Version resource that references this function", "category": "Best Practice", - "startLine": 40, - "startColumn": 7, - "endLine": 40, - "endColumn": 23, - "ruleDescription": "Availability zone properties should not be hardcoded", + "startLine": 99, + "startColumn": 11, + "endLine": 99, + "endColumn": 18, + "ruleDescription": "Validate that SnapStart is properly configured", "phase": "LINT" }, { - "ruleId": "W3010", + "ruleId": "W2530", "severity": "WARN", - "message": "Avoid hardcoding availability zones 'us-east-1a'", + "message": "SnapStart is enabled but no AWS::Lambda::Version resource is attached", "source": "CFN_LINT", "entity": { - "logicalId": "Elb", + "logicalId": "EveryBranchEnables", "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancing::LoadBalancer" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.AvailabilityZones.0", + "propertyPath": "Properties.SnapStart.ApplyOn", + "suggestedFix": "Add an AWS::Lambda::Version resource that references this function", "category": "Best Practice", - "startLine": 46, + "startLine": 100, "startColumn": 11, - "endLine": 46, - "endColumn": 12, - "ruleDescription": "Availability zone properties should not be hardcoded", + "endLine": 100, + "endColumn": 18, + "ruleDescription": "Validate that SnapStart is properly configured", "phase": "LINT" }, { - "ruleId": "W3010", - "severity": "WARN", - "message": "Avoid hardcoding availability zones 'us-east-1a'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'PropertiesTrueBranch' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Tg", + "logicalId": "PropertiesTrueBranch", "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancingV2::TargetGroup" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.Targets.0.AvailabilityZone", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 59, - "startColumn": 11, - "endLine": 59, - "endColumn": 27, - "ruleDescription": "Availability zone properties should not be hardcoded", + "startLine": 8, + "startColumn": 5, + "endLine": 8, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "W3010", - "severity": "WARN", - "message": "Avoid hardcoding availability zones 'us-east-1a'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'PropertiesFalseBranch' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Rds", + "logicalId": "PropertiesFalseBranch", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.AvailabilityZone", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 63, - "startColumn": 7, - "endLine": 63, - "endColumn": 23, - "ruleDescription": "Availability zone properties should not be hardcoded", + "startLine": 26, + "startColumn": 5, + "endLine": 26, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "W9008", - "severity": "WARN", - "message": "RDS instance should have StorageEncrypted set to true", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'ApplyOnTrueBranch' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Rds", + "logicalId": "ApplyOnTrueBranch", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.StorageEncrypted", - "suggestedFix": "Set StorageEncrypted to true", - "category": "Security", - "startLine": 62, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 44, "startColumn": 5, - "endLine": 62, + "endLine": 44, "endColumn": 15, - "ruleDescription": "RDS instance should have StorageEncrypted", + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "W9010", - "severity": "WARN", - "message": "Hardcoded AMI ID - use a parameter or mapping for portability", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'ApplyOnFalseBranch' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Instance", + "logicalId": "ApplyOnFalseBranch", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.ImageId", - "category": "Security", - "startLine": 23, - "startColumn": 7, - "endLine": 23, - "endColumn": 14, - "ruleDescription": "Hardcoded AMI ID", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 55, + "startColumn": 5, + "endLine": 55, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "I3011", + "ruleId": "I9040", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Resource 'ApplyOnBesideNoValue' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Volume", + "logicalId": "ApplyOnBesideNoValue", "entityType": "Resource", - "resourceType": "AWS::EC2::Volume" + "resourceType": "AWS::Lambda::Function" }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 37, - "startColumn": 3, - "endLine": 37, - "endColumn": 9, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "startLine": 66, + "startColumn": 5, + "endLine": 66, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "I3011", + "ruleId": "I9040", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Resource 'SnapStartBesideNoValue' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Volume", + "logicalId": "SnapStartBesideNoValue", "entityType": "Resource", - "resourceType": "AWS::EC2::Volume" + "resourceType": "AWS::Lambda::Function" }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 37, - "startColumn": 3, - "endLine": 37, - "endColumn": 9, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "startLine": 77, + "startColumn": 5, + "endLine": 77, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "I3011", + "ruleId": "I9040", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "message": "Resource 'EveryBranchEnables' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "EveryBranchEnables", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 90, + "startColumn": 5, + "endLine": 90, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "bad/W2530_snapstart_version_not_coexisting.yaml": { + "filePath": "bad/W2530_snapstart_version_not_coexisting.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 9, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 4, + "informational": 10, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "W2530", + "severity": "WARN", + "message": "SnapStart is enabled but no AWS::Lambda::Version resource is attached", "source": "CFN_LINT", "entity": { - "logicalId": "Rds", + "logicalId": "VersionOnlyDependsOnFunction", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Function" }, + "propertyPath": "Properties.SnapStart.ApplyOn", + "suggestedFix": "Add an AWS::Lambda::Version resource that references this function", "category": "Best Practice", - "startLine": 60, - "startColumn": 3, - "endLine": 60, - "endColumn": 6, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "startLine": 32, + "startColumn": 9, + "endLine": 32, + "endColumn": 16, + "ruleDescription": "Validate that SnapStart is properly configured", "phase": "LINT" }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "ruleId": "W2530", + "severity": "WARN", + "message": "SnapStart is enabled but no AWS::Lambda::Version resource is attached", "source": "CFN_LINT", "entity": { - "logicalId": "Rds", + "logicalId": "VersionOnlyDescribesFunction", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Function" }, + "propertyPath": "Properties.SnapStart.ApplyOn", + "suggestedFix": "Add an AWS::Lambda::Version resource that references this function", "category": "Best Practice", - "startLine": 60, - "startColumn": 3, - "endLine": 60, - "endColumn": 6, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "startLine": 48, + "startColumn": 9, + "endLine": 48, + "endColumn": 16, + "ruleDescription": "Validate that SnapStart is properly configured", "phase": "LINT" }, { - "ruleId": "I3013", - "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "ruleId": "W2530", + "severity": "WARN", + "message": "SnapStart is enabled but no AWS::Lambda::Version resource is attached", "source": "CFN_LINT", "entity": { - "logicalId": "Rds", + "logicalId": "VersionInOtherEnvironment", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties", + "propertyPath": "Properties.SnapStart.ApplyOn", + "suggestedFix": "Add an AWS::Lambda::Version resource that references this function", "category": "Best Practice", - "startLine": 62, - "startColumn": 5, - "endLine": 62, - "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "startLine": 65, + "startColumn": 11, + "endLine": 65, + "endColumn": 18, + "ruleDescription": "Validate that SnapStart is properly configured", "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'LaunchConfigurationName' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W2530", + "severity": "WARN", + "message": "SnapStart is enabled but no AWS::Lambda::Version resource is attached", + "source": "CFN_LINT", "entity": { - "logicalId": "Asg", + "logicalId": "VersionNamesOtherFunctionWhenEnabled", "entityType": "Resource", - "resourceType": "AWS::AutoScaling::AutoScalingGroup" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.LaunchConfigurationName", + "propertyPath": "Properties.SnapStart.ApplyOn", + "suggestedFix": "Add an AWS::Lambda::Version resource that references this function", "category": "Best Practice", - "startLine": 13, - "startColumn": 7, - "endLine": 13, - "endColumn": 30, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 82, + "startColumn": 34, + "endLine": 82, + "endColumn": 35, + "ruleDescription": "Validate that SnapStart is properly configured", + "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Host", + "logicalId": "OrderedVersion", "entityType": "Resource", - "resourceType": "AWS::EC2::Host" + "resourceType": "AWS::Lambda::Version" }, - "propertyPath": "Properties.AvailabilityZone", + "propertyPath": "Properties.FunctionName", "category": "Best Practice", - "startLine": 17, + "startLine": 37, "startColumn": 7, - "endLine": 17, - "endColumn": 23, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 37, + "endColumn": 19, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'PublishedFunction'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'InstanceType' is create-only; updating it will cause resource replacement", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Host", + "logicalId": "DescribedVersion", "entityType": "Resource", - "resourceType": "AWS::EC2::Host" + "resourceType": "AWS::Lambda::Version" }, - "propertyPath": "Properties.InstanceType", + "propertyPath": "Properties.FunctionName", "category": "Best Practice", - "startLine": 18, + "startLine": 52, "startColumn": 7, - "endLine": 18, + "endLine": 52, "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'PublishedFunction'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", + "message": "Property 'Description' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Instance", + "logicalId": "DescribedVersion", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::Lambda::Version" }, - "propertyPath": "Properties.AvailabilityZone", + "propertyPath": "Properties.Description", "category": "Best Practice", - "startLine": 22, + "startLine": 53, "startColumn": 7, - "endLine": 22, - "endColumn": 23, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 53, + "endColumn": 18, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'VersionOnlyDescribesFunction'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Instance", + "logicalId": "DevOnlyVersion", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::Lambda::Version" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Properties.FunctionName", "category": "Best Practice", - "startLine": 23, + "startLine": 71, "startColumn": 7, - "endLine": 23, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 71, + "endColumn": 19, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'VersionInOtherEnvironment'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Instance", + "logicalId": "SwitchedVersion", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::Lambda::Version" }, - "propertyPath": "Properties.InstanceType", + "propertyPath": "Properties.FunctionName", "category": "Best Practice", - "startLine": 24, + "startLine": 86, "startColumn": 7, - "endLine": 24, + "endLine": 86, "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Subnet", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.VpcId", - "category": "Best Practice", - "startLine": 34, - "startColumn": 7, - "endLine": 34, - "endColumn": 12, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Subnet", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.CidrBlock", - "category": "Best Practice", - "startLine": 35, - "startColumn": 7, - "endLine": 35, - "endColumn": 16, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Subnet", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.AvailabilityZone", - "category": "Best Practice", - "startLine": 36, - "startColumn": 7, - "endLine": 36, - "endColumn": 23, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'AvailabilityZones' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Elb", - "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancing::LoadBalancer" - }, - "propertyPath": "Properties.AvailabilityZones", - "category": "Best Practice", - "startLine": 45, - "startColumn": 7, - "endLine": 45, - "endColumn": 24, - "documentationUrl": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Port' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Tg", - "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancingV2::TargetGroup" - }, - "propertyPath": "Properties.Port", - "category": "Best Practice", - "startLine": 54, - "startColumn": 7, - "endLine": 54, - "endColumn": 11, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Protocol' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Tg", - "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancingV2::TargetGroup" - }, - "propertyPath": "Properties.Protocol", - "category": "Best Practice", - "startLine": 55, - "startColumn": 7, - "endLine": 55, - "endColumn": 15, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Tg", - "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancingV2::TargetGroup" - }, - "propertyPath": "Properties.VpcId", - "category": "Best Practice", - "startLine": 56, - "startColumn": 7, - "endLine": 56, - "endColumn": 12, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'AvailabilityZone' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Rds", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" - }, - "propertyPath": "Properties.AvailabilityZone", - "category": "Best Practice", - "startLine": 63, - "startColumn": 7, - "endLine": 63, - "endColumn": 23, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Rds", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" - }, - "propertyPath": "Properties.Engine", - "category": "Best Practice", - "startLine": 65, - "startColumn": 7, - "endLine": 65, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only", + "resolutionSource": "Fn::If on condition 'IsUsEast1'" } }, - { - "ruleId": "I9003", - "severity": "INFO", - "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", - "source": "ENGINE", - "category": "Best Practice", - "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", - "phase": "LINT" - }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Asg' of type 'AWS::AutoScaling::AutoScalingGroup' supports Tags but none are configured", + "message": "Resource 'PublishedFunction' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Asg", + "logicalId": "PublishedFunction", "entityType": "Resource", - "resourceType": "AWS::AutoScaling::AutoScalingGroup" + "resourceType": "AWS::Lambda::Function" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 7, + "startLine": 15, "startColumn": 5, - "endLine": 7, + "endLine": 15, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -8686,19 +9337,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Host' of type 'AWS::EC2::Host' supports Tags but none are configured", + "message": "Resource 'VersionOnlyDependsOnFunction' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Host", + "logicalId": "VersionOnlyDependsOnFunction", "entityType": "Resource", - "resourceType": "AWS::EC2::Host" + "resourceType": "AWS::Lambda::Function" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 16, + "startLine": 24, "startColumn": 5, - "endLine": 16, + "endLine": 24, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -8706,19 +9357,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Instance' of type 'AWS::EC2::Instance' supports Tags but none are configured", + "message": "Resource 'VersionOnlyDescribesFunction' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Instance", + "logicalId": "VersionOnlyDescribesFunction", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::Lambda::Function" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 21, + "startLine": 40, "startColumn": 5, - "endLine": 21, + "endLine": 40, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -8726,19 +9377,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Subnet' of type 'AWS::EC2::Subnet' supports Tags but none are configured", + "message": "Resource 'VersionInOtherEnvironment' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Subnet", + "logicalId": "VersionInOtherEnvironment", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::Lambda::Function" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 33, + "startLine": 56, "startColumn": 5, - "endLine": 33, + "endLine": 56, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -8746,95 +9397,35 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Volume' of type 'AWS::EC2::Volume' supports Tags but none are configured", + "message": "Resource 'VersionNamesOtherFunctionWhenEnabled' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Volume", + "logicalId": "VersionNamesOtherFunctionWhenEnabled", "entityType": "Resource", - "resourceType": "AWS::EC2::Volume" + "resourceType": "AWS::Lambda::Function" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 39, + "startLine": 74, "startColumn": 5, - "endLine": 39, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Elb' of type 'AWS::ElasticLoadBalancing::LoadBalancer' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "Elb", - "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancing::LoadBalancer" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 44, - "startColumn": 5, - "endLine": 44, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Tg' of type 'AWS::ElasticLoadBalancingV2::TargetGroup' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "Tg", - "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancingV2::TargetGroup" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 53, - "startColumn": 5, - "endLine": 53, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Rds' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "Rds", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 62, - "startColumn": 5, - "endLine": 62, + "endLine": 74, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "bad/W3030_enum_case_insensitive_mismatch.yaml": { - "filePath": "bad/W3030_enum_case_insensitive_mismatch.yaml", + "bad/W3010_full_coverage.yaml": { + "filePath": "bad/W3010_full_coverage.yaml", "status": "OK", "metadata": { - "resourcesScanned": 1, + "resourcesScanned": 9, "counts": { "fatal": 0, "errors": 0, - "warnings": 1, - "informational": 2, + "warnings": 12, + "informational": 29, "debug": 0 }, "suppressed": 0, @@ -8843,251 +9434,364 @@ }, "diagnostics": [ { - "ruleId": "W3030", + "ruleId": "W3010", "severity": "WARN", - "message": "'BOGUS' is not one of ['managed', 'unmanaged'] (case-insensitive)", + "message": "Avoid hardcoding availability zones 'us-east-1a'", "source": "CFN_LINT", "entity": { - "logicalId": "ComputeEnvironment", + "logicalId": "Asg", "entityType": "Resource", - "resourceType": "AWS::Batch::ComputeEnvironment" + "resourceType": "AWS::AutoScaling::AutoScalingGroup" }, - "propertyPath": "Properties.Type", - "category": "Schema", - "startLine": 13, - "startColumn": 7, - "endLine": 13, - "endColumn": 11, - "ruleDescription": "Value not in allowed enum", - "phase": "SCHEMA", - "context": { - "actualValue": "BOGUS", - "extra": { - "allowed_values": [ - "managed", - "unmanaged" - ] - } - } + "propertyPath": "Properties.AvailabilityZones.0", + "category": "Best Practice", + "startLine": 9, + "startColumn": 11, + "endLine": 9, + "endColumn": 12, + "ruleDescription": "Availability zone properties should not be hardcoded", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Type' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W3010", + "severity": "WARN", + "message": "Avoid hardcoding availability zones 'us-east-1b'", + "source": "CFN_LINT", "entity": { - "logicalId": "ComputeEnvironment", + "logicalId": "Asg", "entityType": "Resource", - "resourceType": "AWS::Batch::ComputeEnvironment" + "resourceType": "AWS::AutoScaling::AutoScalingGroup" }, - "propertyPath": "Properties.Type", + "propertyPath": "Properties.AvailabilityZones.1", "category": "Best Practice", - "startLine": 13, - "startColumn": 7, - "endLine": 13, - "endColumn": 11, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 10, + "startColumn": 11, + "endLine": 10, + "endColumn": 12, + "ruleDescription": "Availability zone properties should not be hardcoded", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Tags' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W3010", + "severity": "WARN", + "message": "Avoid hardcoding availability zones 'us-east-1a'", + "source": "CFN_LINT", "entity": { - "logicalId": "ComputeEnvironment", + "logicalId": "Host", "entityType": "Resource", - "resourceType": "AWS::Batch::ComputeEnvironment" + "resourceType": "AWS::EC2::Host" }, - "propertyPath": "Properties.Tags", + "propertyPath": "Properties.AvailabilityZone", "category": "Best Practice", - "startLine": 15, + "startLine": 17, "startColumn": 7, - "endLine": 15, - "endColumn": 11, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - } - ] - }, - "bad/W3660_api_gateway_body_mixing.yaml": { - "filePath": "bad/W3660_api_gateway_body_mixing.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 7, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 6, - "informational": 13, - "debug": 0 + "endLine": 17, + "endColumn": 23, + "ruleDescription": "Availability zone properties should not be hardcoded", + "phase": "LINT" }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "W3660", + "ruleId": "W3010", "severity": "WARN", - "message": "Defining 'Body' with a relation to resource 'Authorizer' of type 'AWS::ApiGateway::Authorizer' may result in drift and orphaned resources", + "message": "Avoid hardcoding availability zones 'us-east-1a'", "source": "CFN_LINT", "entity": { - "logicalId": "Api", + "logicalId": "Instance", "entityType": "Resource", - "resourceType": "AWS::ApiGateway::RestApi" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Body", + "propertyPath": "Properties.AvailabilityZone", "category": "Best Practice", - "startLine": 6, + "startLine": 22, "startColumn": 7, - "endLine": 6, - "endColumn": 11, - "ruleDescription": "Validate if multiple resources are modifying a Rest API definition", + "endLine": 22, + "endColumn": 23, + "ruleDescription": "Availability zone properties should not be hardcoded", "phase": "LINT" }, { - "ruleId": "W3660", + "ruleId": "W3010", "severity": "WARN", - "message": "Defining 'Body' with a relation to resource 'Method' of type 'AWS::ApiGateway::Method' may result in drift and orphaned resources", + "message": "Avoid hardcoding availability zones 'us-east-1a'", "source": "CFN_LINT", "entity": { - "logicalId": "Api", + "logicalId": "Lt", "entityType": "Resource", - "resourceType": "AWS::ApiGateway::RestApi" + "resourceType": "AWS::EC2::LaunchTemplate" }, - "propertyPath": "Properties.Body", + "propertyPath": "Properties.LaunchTemplateData.Placement.AvailabilityZone", "category": "Best Practice", - "startLine": 6, - "startColumn": 7, - "endLine": 6, - "endColumn": 11, - "ruleDescription": "Validate if multiple resources are modifying a Rest API definition", + "startLine": 30, + "startColumn": 11, + "endLine": 30, + "endColumn": 27, + "ruleDescription": "Availability zone properties should not be hardcoded", "phase": "LINT" }, { - "ruleId": "W3660", + "ruleId": "W3010", "severity": "WARN", - "message": "Defining 'Body' with a relation to resource 'Model' of type 'AWS::ApiGateway::Model' may result in drift and orphaned resources", + "message": "Avoid hardcoding availability zones 'us-east-1a'", "source": "CFN_LINT", "entity": { - "logicalId": "Api", + "logicalId": "Subnet", "entityType": "Resource", - "resourceType": "AWS::ApiGateway::RestApi" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.Body", + "propertyPath": "Properties.AvailabilityZone", "category": "Best Practice", - "startLine": 6, + "startLine": 36, "startColumn": 7, - "endLine": 6, - "endColumn": 11, - "ruleDescription": "Validate if multiple resources are modifying a Rest API definition", + "endLine": 36, + "endColumn": 23, + "ruleDescription": "Availability zone properties should not be hardcoded", "phase": "LINT" }, { - "ruleId": "W3660", + "ruleId": "W3010", "severity": "WARN", - "message": "Defining 'Body' with a relation to resource 'Resource' of type 'AWS::ApiGateway::Resource' may result in drift and orphaned resources", + "message": "Avoid hardcoding availability zones 'us-east-1a'", "source": "CFN_LINT", "entity": { - "logicalId": "Api", + "logicalId": "Volume", "entityType": "Resource", - "resourceType": "AWS::ApiGateway::RestApi" + "resourceType": "AWS::EC2::Volume" }, - "propertyPath": "Properties.Body", + "propertyPath": "Properties.AvailabilityZone", "category": "Best Practice", - "startLine": 6, + "startLine": 40, "startColumn": 7, - "endLine": 6, - "endColumn": 11, - "ruleDescription": "Validate if multiple resources are modifying a Rest API definition", + "endLine": 40, + "endColumn": 23, + "ruleDescription": "Availability zone properties should not be hardcoded", "phase": "LINT" }, { - "ruleId": "W3660", + "ruleId": "W3010", "severity": "WARN", - "message": "Defining 'Body' with a relation to resource 'Response' of type 'AWS::ApiGateway::GatewayResponse' may result in drift and orphaned resources", + "message": "Avoid hardcoding availability zones 'us-east-1a'", "source": "CFN_LINT", "entity": { - "logicalId": "Api", + "logicalId": "Elb", "entityType": "Resource", - "resourceType": "AWS::ApiGateway::RestApi" + "resourceType": "AWS::ElasticLoadBalancing::LoadBalancer" }, - "propertyPath": "Properties.Body", + "propertyPath": "Properties.AvailabilityZones.0", "category": "Best Practice", - "startLine": 6, - "startColumn": 7, - "endLine": 6, - "endColumn": 11, - "ruleDescription": "Validate if multiple resources are modifying a Rest API definition", + "startLine": 46, + "startColumn": 11, + "endLine": 46, + "endColumn": 12, + "ruleDescription": "Availability zone properties should not be hardcoded", "phase": "LINT" }, { - "ruleId": "W3660", + "ruleId": "W3010", "severity": "WARN", - "message": "Defining 'Body' with a relation to resource 'Validator' of type 'AWS::ApiGateway::RequestValidator' may result in drift and orphaned resources", + "message": "Avoid hardcoding availability zones 'us-east-1a'", "source": "CFN_LINT", "entity": { - "logicalId": "Api", + "logicalId": "Tg", "entityType": "Resource", - "resourceType": "AWS::ApiGateway::RestApi" + "resourceType": "AWS::ElasticLoadBalancingV2::TargetGroup" }, - "propertyPath": "Properties.Body", + "propertyPath": "Properties.Targets.0.AvailabilityZone", "category": "Best Practice", - "startLine": 6, + "startLine": 59, + "startColumn": 11, + "endLine": 59, + "endColumn": 27, + "ruleDescription": "Availability zone properties should not be hardcoded", + "phase": "LINT" + }, + { + "ruleId": "W3010", + "severity": "WARN", + "message": "Avoid hardcoding availability zones 'us-east-1a'", + "source": "CFN_LINT", + "entity": { + "logicalId": "Rds", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.AvailabilityZone", + "category": "Best Practice", + "startLine": 63, "startColumn": 7, - "endLine": 6, - "endColumn": 11, - "ruleDescription": "Validate if multiple resources are modifying a Rest API definition", + "endLine": 63, + "endColumn": 23, + "ruleDescription": "Availability zone properties should not be hardcoded", + "phase": "LINT" + }, + { + "ruleId": "W9008", + "severity": "WARN", + "message": "RDS instance should have StorageEncrypted set to true", + "source": "ENGINE", + "entity": { + "logicalId": "Rds", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.StorageEncrypted", + "suggestedFix": "Set StorageEncrypted to true", + "category": "Security", + "startLine": 62, + "startColumn": 5, + "endLine": 62, + "endColumn": 15, + "ruleDescription": "RDS instance should have StorageEncrypted", + "phase": "LINT" + }, + { + "ruleId": "W9010", + "severity": "WARN", + "message": "Hardcoded AMI ID - use a parameter or mapping for portability", + "source": "ENGINE", + "entity": { + "logicalId": "Instance", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Properties.ImageId", + "category": "Security", + "startLine": 23, + "startColumn": 7, + "endLine": 23, + "endColumn": 14, + "ruleDescription": "Hardcoded AMI ID", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "Volume", + "entityType": "Resource", + "resourceType": "AWS::EC2::Volume" + }, + "category": "Best Practice", + "startLine": 37, + "startColumn": 3, + "endLine": 37, + "endColumn": 9, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "Volume", + "entityType": "Resource", + "resourceType": "AWS::EC2::Volume" + }, + "category": "Best Practice", + "startLine": 37, + "startColumn": 3, + "endLine": 37, + "endColumn": 9, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "Rds", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 60, + "startColumn": 3, + "endLine": 60, + "endColumn": 6, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "Rds", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 60, + "startColumn": 3, + "endLine": 60, + "endColumn": 6, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3013", + "severity": "INFO", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "Rds", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties", + "category": "Best Practice", + "startLine": 62, + "startColumn": 5, + "endLine": 62, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'RestApiId' is create-only; updating it will cause resource replacement", + "message": "Property 'LaunchConfigurationName' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Method", + "logicalId": "Asg", "entityType": "Resource", - "resourceType": "AWS::ApiGateway::Method" + "resourceType": "AWS::AutoScaling::AutoScalingGroup" }, - "propertyPath": "Properties.RestApiId", + "propertyPath": "Properties.LaunchConfigurationName", "category": "Best Practice", - "startLine": 14, + "startLine": 13, "startColumn": 7, - "endLine": 14, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway.git", + "endLine": 13, + "endColumn": 30, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'Api'" + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ResourceId' is create-only; updating it will cause resource replacement", + "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Method", + "logicalId": "Host", "entityType": "Resource", - "resourceType": "AWS::ApiGateway::Method" + "resourceType": "AWS::EC2::Host" }, - "propertyPath": "Properties.ResourceId", + "propertyPath": "Properties.AvailabilityZone", "category": "Best Practice", - "startLine": 15, + "startLine": 17, "startColumn": 7, - "endLine": 15, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway.git", + "endLine": 17, + "endColumn": 23, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -9097,20 +9801,20 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'HttpMethod' is create-only; updating it will cause resource replacement", + "message": "Property 'InstanceType' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Method", + "logicalId": "Host", "entityType": "Resource", - "resourceType": "AWS::ApiGateway::Method" + "resourceType": "AWS::EC2::Host" }, - "propertyPath": "Properties.HttpMethod", + "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 16, + "startLine": 18, "startColumn": 7, - "endLine": 16, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway.git", + "endLine": 18, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -9120,44 +9824,43 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'RestApiId' is create-only; updating it will cause resource replacement", + "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Model", + "logicalId": "Instance", "entityType": "Resource", - "resourceType": "AWS::ApiGateway::Model" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.RestApiId", + "propertyPath": "Properties.AvailabilityZone", "category": "Best Practice", - "startLine": 21, + "startLine": 22, "startColumn": 7, - "endLine": 21, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway", + "endLine": 22, + "endColumn": 23, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'Api'" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ContentType' is create-only; updating it will cause resource replacement", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Model", + "logicalId": "Instance", "entityType": "Resource", - "resourceType": "AWS::ApiGateway::Model" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.ContentType", + "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 22, + "startLine": 23, "startColumn": 7, - "endLine": 22, - "endColumn": 18, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway", + "endLine": 23, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -9167,44 +9870,42 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'RestApiId' is create-only; updating it will cause resource replacement", + "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource", + "logicalId": "Instance", "entityType": "Resource", - "resourceType": "AWS::ApiGateway::Resource" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.RestApiId", + "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 26, + "startLine": 24, "startColumn": 7, - "endLine": 26, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway", + "endLine": 24, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'Api'" + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ParentId' is create-only; updating it will cause resource replacement", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource", + "logicalId": "Subnet", "entityType": "Resource", - "resourceType": "AWS::ApiGateway::Resource" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.ParentId", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 27, + "startLine": 34, "startColumn": 7, - "endLine": 27, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway", + "endLine": 34, + "endColumn": 12, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -9214,20 +9915,19 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'PathPart' is create-only; updating it will cause resource replacement", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource", + "logicalId": "Subnet", "entityType": "Resource", - "resourceType": "AWS::ApiGateway::Resource" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.PathPart", + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 28, + "startLine": 35, "startColumn": 7, - "endLine": 28, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway", + "endLine": 35, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -9237,518 +9937,617 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'RestApiId' is create-only; updating it will cause resource replacement", + "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Response", + "logicalId": "Subnet", "entityType": "Resource", - "resourceType": "AWS::ApiGateway::GatewayResponse" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.RestApiId", + "propertyPath": "Properties.AvailabilityZone", "category": "Best Practice", - "startLine": 32, + "startLine": 36, "startColumn": 7, - "endLine": 32, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "endLine": 36, + "endColumn": 23, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'Api'" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ResponseType' is create-only; updating it will cause resource replacement", + "message": "Property 'AvailabilityZones' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Response", + "logicalId": "Elb", "entityType": "Resource", - "resourceType": "AWS::ApiGateway::GatewayResponse" + "resourceType": "AWS::ElasticLoadBalancing::LoadBalancer" }, - "propertyPath": "Properties.ResponseType", + "propertyPath": "Properties.AvailabilityZones", "category": "Best Practice", - "startLine": 33, + "startLine": 45, "startColumn": 7, - "endLine": 33, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "endLine": 45, + "endColumn": 24, + "documentationUrl": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'RestApiId' is create-only; updating it will cause resource replacement", + "message": "Property 'Port' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Validator", + "logicalId": "Tg", "entityType": "Resource", - "resourceType": "AWS::ApiGateway::RequestValidator" + "resourceType": "AWS::ElasticLoadBalancingV2::TargetGroup" }, - "propertyPath": "Properties.RestApiId", + "propertyPath": "Properties.Port", "category": "Best Practice", - "startLine": 37, + "startLine": 54, "startColumn": 7, - "endLine": 37, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway", + "endLine": 54, + "endColumn": 11, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'Api'" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'RestApiId' is create-only; updating it will cause resource replacement", + "message": "Property 'Protocol' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Authorizer", + "logicalId": "Tg", "entityType": "Resource", - "resourceType": "AWS::ApiGateway::Authorizer" + "resourceType": "AWS::ElasticLoadBalancingV2::TargetGroup" }, - "propertyPath": "Properties.RestApiId", + "propertyPath": "Properties.Protocol", "category": "Best Practice", - "startLine": 41, + "startLine": 55, "startColumn": 7, - "endLine": 41, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway.git", + "endLine": 55, + "endColumn": 15, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'Api'" + "lifecycle": "create-only" } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'Api' of type 'AWS::ApiGateway::RestApi' supports Tags but none are configured", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Api", - "entityType": "Resource", - "resourceType": "AWS::ApiGateway::RestApi" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "bad/W3671_spotfleet_ebs_iops.yaml": { - "filePath": "bad/W3671_spotfleet_ebs_iops.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 1, - "informational": 3, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "W3671", - "severity": "WARN", - "message": "Iops is ignored when VolumeType is 'gp2'", - "source": "CFN_LINT", - "entity": { - "logicalId": "Fleet", + "logicalId": "Tg", "entityType": "Resource", - "resourceType": "AWS::EC2::SpotFleet" + "resourceType": "AWS::ElasticLoadBalancingV2::TargetGroup" }, - "propertyPath": "Properties.SpotFleetRequestConfigData.LaunchSpecifications.0.BlockDeviceMappings.0.Ebs.Iops", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 16, - "startColumn": 19, - "endLine": 16, - "endColumn": 23, - "ruleDescription": "Iops is ignored for certain EBS volume types", - "phase": "LINT" + "startLine": 56, + "startColumn": 7, + "endLine": 56, + "endColumn": 12, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'SpotFleetRequestConfigData.IamFleetRole' is create-only; updating it will cause resource replacement", + "message": "Property 'AvailabilityZone' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Fleet", + "logicalId": "Rds", "entityType": "Resource", - "resourceType": "AWS::EC2::SpotFleet" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.SpotFleetRequestConfigData.IamFleetRole", + "propertyPath": "Properties.AvailabilityZone", "category": "Best Practice", - "startLine": 7, - "startColumn": 9, - "endLine": 7, - "endColumn": 21, + "startLine": 63, + "startColumn": 7, + "endLine": 63, + "endColumn": 23, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'SpotFleetRequestConfigData.LaunchSpecifications' is create-only; updating it will cause resource replacement", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Fleet", + "logicalId": "Rds", "entityType": "Resource", - "resourceType": "AWS::EC2::SpotFleet" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.SpotFleetRequestConfigData.LaunchSpecifications", + "propertyPath": "Properties.Engine", "category": "Best Practice", - "startLine": 9, - "startColumn": 9, - "endLine": 9, - "endColumn": 29, + "startLine": 65, + "startColumn": 7, + "endLine": 65, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } }, + { + "ruleId": "I9003", + "severity": "INFO", + "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", + "source": "ENGINE", + "category": "Best Practice", + "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", + "phase": "LINT" + }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Fleet' of type 'AWS::EC2::SpotFleet' supports Tags but none are configured", + "message": "Resource 'Asg' of type 'AWS::AutoScaling::AutoScalingGroup' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Fleet", + "logicalId": "Asg", "entityType": "Resource", - "resourceType": "AWS::EC2::SpotFleet" + "resourceType": "AWS::AutoScaling::AutoScalingGroup" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 5, + "startLine": 7, "startColumn": 5, - "endLine": 5, + "endLine": 7, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" - } - ] - }, - "bad/W3687_ports_ignored_by_protocol.yaml": { - "filePath": "bad/W3687_ports_ignored_by_protocol.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 4, - "counts": { - "fatal": 0, - "errors": 3, - "warnings": 6, - "informational": 13, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "E3687", - "severity": "ERROR", - "message": "['FromPort', 'ToPort'] are required properties when using 'IpProtocol' value icmp", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Host' of type 'AWS::EC2::Host' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "SecurityGroup", + "logicalId": "Host", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::EC2::Host" }, - "propertyPath": "Properties.SecurityGroupIngress.3", - "category": "Resource", - "startLine": 28, - "startColumn": 21, - "endLine": 28, - "endColumn": 22, - "ruleDescription": "Validate to and from ports based on the protocol", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 16, + "startColumn": 5, + "endLine": 16, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "E3687", - "severity": "ERROR", - "message": "['FromPort', 'ToPort'] are required properties when using 'IpProtocol' value udp", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Instance' of type 'AWS::EC2::Instance' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "SecurityGroup", + "logicalId": "Instance", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.SecurityGroupEgress.1", - "category": "Resource", - "startLine": 35, - "startColumn": 21, - "endLine": 35, - "endColumn": 22, - "ruleDescription": "Validate to and from ports based on the protocol", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 21, + "startColumn": 5, + "endLine": 21, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "E3687", - "severity": "ERROR", - "message": "['FromPort', 'ToPort'] are required properties when using 'IpProtocol' value tcp", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Subnet' of type 'AWS::EC2::Subnet' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "StandaloneEgressTcpWithoutPorts", + "logicalId": "Subnet", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupEgress" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties", - "category": "Resource", - "startLine": 47, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 33, "startColumn": 5, - "endLine": 47, + "endLine": 33, "endColumn": 15, - "ruleDescription": "Validate to and from ports based on the protocol", + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "W3687", - "severity": "WARN", - "message": "['FromPort', 'ToPort'] are ignored when using 'IpProtocol' value 'esp'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Volume' of type 'AWS::EC2::Volume' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "SecurityGroup", + "logicalId": "Volume", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::EC2::Volume" }, - "propertyPath": "Properties.SecurityGroupIngress.0.FromPort", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 17, - "startColumn": 11, - "endLine": 17, - "endColumn": 19, - "ruleDescription": "Validate that ports aren't specified for certain protocols", + "startLine": 39, + "startColumn": 5, + "endLine": 39, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "W3687", - "severity": "WARN", - "message": "['FromPort', 'ToPort'] are ignored when using 'IpProtocol' value '50'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Elb' of type 'AWS::ElasticLoadBalancing::LoadBalancer' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "SecurityGroup", + "logicalId": "Elb", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::ElasticLoadBalancing::LoadBalancer" }, - "propertyPath": "Properties.SecurityGroupIngress.1.FromPort", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 21, - "startColumn": 11, - "endLine": 21, - "endColumn": 19, - "ruleDescription": "Validate that ports aren't specified for certain protocols", + "startLine": 44, + "startColumn": 5, + "endLine": 44, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "W3687", - "severity": "WARN", - "message": "['FromPort', 'ToPort'] are ignored when using 'IpProtocol' value '-1'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Tg' of type 'AWS::ElasticLoadBalancingV2::TargetGroup' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "SecurityGroup", + "logicalId": "Tg", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::ElasticLoadBalancingV2::TargetGroup" }, - "propertyPath": "Properties.SecurityGroupIngress.2.FromPort", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 25, - "startColumn": 11, - "endLine": 25, - "endColumn": 19, - "ruleDescription": "Validate that ports aren't specified for certain protocols", + "startLine": 53, + "startColumn": 5, + "endLine": 53, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "W3687", - "severity": "WARN", - "message": "['FromPort', 'ToPort'] are ignored when using 'IpProtocol' value 'gre'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Rds' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "SecurityGroup", + "logicalId": "Rds", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.SecurityGroupEgress.0.FromPort", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 32, - "startColumn": 11, - "endLine": 32, - "endColumn": 19, - "ruleDescription": "Validate that ports aren't specified for certain protocols", + "startLine": 62, + "startColumn": 5, + "endLine": 62, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "bad/W3030_enum_case_insensitive_mismatch.yaml": { + "filePath": "bad/W3030_enum_case_insensitive_mismatch.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 1, + "informational": 2, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "W3687", + "ruleId": "W3030", "severity": "WARN", - "message": "['FromPort', 'ToPort'] are ignored when using 'IpProtocol' value 'esp'", + "message": "'BOGUS' is not one of ['managed', 'unmanaged'] (case-insensitive)", "source": "CFN_LINT", "entity": { - "logicalId": "StandaloneIngressEsp", + "logicalId": "ComputeEnvironment", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" + "resourceType": "AWS::Batch::ComputeEnvironment" }, - "propertyPath": "Properties.FromPort", - "category": "Best Practice", - "startLine": 42, + "propertyPath": "Properties.Type", + "category": "Schema", + "startLine": 13, "startColumn": 7, - "endLine": 42, - "endColumn": 15, - "ruleDescription": "Validate that ports aren't specified for certain protocols", - "phase": "LINT" + "endLine": 13, + "endColumn": 11, + "ruleDescription": "Value not in allowed enum", + "phase": "SCHEMA", + "context": { + "actualValue": "BOGUS", + "extra": { + "allowed_values": [ + "managed", + "unmanaged" + ] + } + } }, { - "ruleId": "W9003", - "severity": "WARN", - "message": "50 is not of type 'string' - automatically coerced (number to string)", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Type' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "SecurityGroup", + "logicalId": "ComputeEnvironment", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::Batch::ComputeEnvironment" }, - "propertyPath": "Properties.SecurityGroupIngress.1.IpProtocol", + "propertyPath": "Properties.Type", "category": "Best Practice", - "startLine": 20, - "startColumn": 11, - "endLine": 20, - "endColumn": 21, - "ruleDescription": "Property type coercion warning", - "phase": "SCHEMA" + "startLine": 13, + "startColumn": 7, + "endLine": 13, + "endColumn": 11, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Property 'Tags' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Vpc", + "logicalId": "ComputeEnvironment", "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" + "resourceType": "AWS::Batch::ComputeEnvironment" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Properties.Tags", "category": "Best Practice", - "startLine": 9, + "startLine": 15, "startColumn": 7, - "endLine": 9, - "endColumn": 16, + "endLine": 15, + "endColumn": 11, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only" } + } + ] + }, + "bad/W3660_api_gateway_body_mixing.yaml": { + "filePath": "bad/W3660_api_gateway_body_mixing.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 7, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 6, + "informational": 13, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W3660", + "severity": "WARN", + "message": "Defining 'Body' with a relation to resource 'Authorizer' of type 'AWS::ApiGateway::Authorizer' may result in drift and orphaned resources", + "source": "CFN_LINT", "entity": { - "logicalId": "SecurityGroup", + "logicalId": "Api", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::ApiGateway::RestApi" }, - "propertyPath": "Properties.GroupDescription", + "propertyPath": "Properties.Body", "category": "Best Practice", - "startLine": 13, + "startLine": 6, "startColumn": 7, - "endLine": 13, - "endColumn": 23, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "endLine": 6, + "endColumn": 11, + "ruleDescription": "Validate if multiple resources are modifying a Rest API definition", + "phase": "LINT" + }, + { + "ruleId": "W3660", + "severity": "WARN", + "message": "Defining 'Body' with a relation to resource 'Method' of type 'AWS::ApiGateway::Method' may result in drift and orphaned resources", + "source": "CFN_LINT", + "entity": { + "logicalId": "Api", + "entityType": "Resource", + "resourceType": "AWS::ApiGateway::RestApi" + }, + "propertyPath": "Properties.Body", + "category": "Best Practice", + "startLine": 6, + "startColumn": 7, + "endLine": 6, + "endColumn": 11, + "ruleDescription": "Validate if multiple resources are modifying a Rest API definition", + "phase": "LINT" + }, + { + "ruleId": "W3660", + "severity": "WARN", + "message": "Defining 'Body' with a relation to resource 'Model' of type 'AWS::ApiGateway::Model' may result in drift and orphaned resources", + "source": "CFN_LINT", + "entity": { + "logicalId": "Api", + "entityType": "Resource", + "resourceType": "AWS::ApiGateway::RestApi" + }, + "propertyPath": "Properties.Body", + "category": "Best Practice", + "startLine": 6, + "startColumn": 7, + "endLine": 6, + "endColumn": 11, + "ruleDescription": "Validate if multiple resources are modifying a Rest API definition", + "phase": "LINT" + }, + { + "ruleId": "W3660", + "severity": "WARN", + "message": "Defining 'Body' with a relation to resource 'Resource' of type 'AWS::ApiGateway::Resource' may result in drift and orphaned resources", + "source": "CFN_LINT", + "entity": { + "logicalId": "Api", + "entityType": "Resource", + "resourceType": "AWS::ApiGateway::RestApi" + }, + "propertyPath": "Properties.Body", + "category": "Best Practice", + "startLine": 6, + "startColumn": 7, + "endLine": 6, + "endColumn": 11, + "ruleDescription": "Validate if multiple resources are modifying a Rest API definition", + "phase": "LINT" + }, + { + "ruleId": "W3660", + "severity": "WARN", + "message": "Defining 'Body' with a relation to resource 'Response' of type 'AWS::ApiGateway::GatewayResponse' may result in drift and orphaned resources", + "source": "CFN_LINT", + "entity": { + "logicalId": "Api", + "entityType": "Resource", + "resourceType": "AWS::ApiGateway::RestApi" + }, + "propertyPath": "Properties.Body", + "category": "Best Practice", + "startLine": 6, + "startColumn": 7, + "endLine": 6, + "endColumn": 11, + "ruleDescription": "Validate if multiple resources are modifying a Rest API definition", + "phase": "LINT" + }, + { + "ruleId": "W3660", + "severity": "WARN", + "message": "Defining 'Body' with a relation to resource 'Validator' of type 'AWS::ApiGateway::RequestValidator' may result in drift and orphaned resources", + "source": "CFN_LINT", + "entity": { + "logicalId": "Api", + "entityType": "Resource", + "resourceType": "AWS::ApiGateway::RestApi" + }, + "propertyPath": "Properties.Body", + "category": "Best Practice", + "startLine": 6, + "startColumn": 7, + "endLine": 6, + "endColumn": 11, + "ruleDescription": "Validate if multiple resources are modifying a Rest API definition", + "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "message": "Property 'RestApiId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SecurityGroup", + "logicalId": "Method", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::ApiGateway::Method" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.RestApiId", "category": "Best Practice", "startLine": 14, "startColumn": 7, "endLine": 14, - "endColumn": 12, + "endColumn": 16, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "Ref to 'Vpc'" + "resolutionSource": "Ref to 'Api'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'GroupId' is create-only; updating it will cause resource replacement", + "message": "Property 'ResourceId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "StandaloneIngressEsp", + "logicalId": "Method", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" + "resourceType": "AWS::ApiGateway::Method" }, - "propertyPath": "Properties.GroupId", + "propertyPath": "Properties.ResourceId", "category": "Best Practice", - "startLine": 40, + "startLine": 15, "startColumn": 7, - "endLine": 40, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 15, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'SecurityGroup'" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'IpProtocol' is create-only; updating it will cause resource replacement", + "message": "Property 'HttpMethod' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "StandaloneIngressEsp", + "logicalId": "Method", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" + "resourceType": "AWS::ApiGateway::Method" }, - "propertyPath": "Properties.IpProtocol", + "propertyPath": "Properties.HttpMethod", "category": "Best Practice", - "startLine": 41, + "startLine": 16, "startColumn": 7, - "endLine": 41, + "endLine": 16, "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -9758,43 +10557,44 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'FromPort' is create-only; updating it will cause resource replacement", + "message": "Property 'RestApiId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "StandaloneIngressEsp", + "logicalId": "Model", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" + "resourceType": "AWS::ApiGateway::Model" }, - "propertyPath": "Properties.FromPort", + "propertyPath": "Properties.RestApiId", "category": "Best Practice", - "startLine": 42, + "startLine": 21, "startColumn": 7, - "endLine": 42, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 21, + "endColumn": 16, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'Api'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ToPort' is create-only; updating it will cause resource replacement", + "message": "Property 'ContentType' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "StandaloneIngressEsp", + "logicalId": "Model", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" + "resourceType": "AWS::ApiGateway::Model" }, - "propertyPath": "Properties.ToPort", + "propertyPath": "Properties.ContentType", "category": "Best Practice", - "startLine": 43, + "startLine": 22, "startColumn": 7, - "endLine": 43, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 22, + "endColumn": 18, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -9804,20 +10604,44 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'CidrIp' is create-only; updating it will cause resource replacement", + "message": "Property 'RestApiId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "StandaloneIngressEsp", + "logicalId": "Resource", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" + "resourceType": "AWS::ApiGateway::Resource" }, - "propertyPath": "Properties.CidrIp", + "propertyPath": "Properties.RestApiId", "category": "Best Practice", - "startLine": 44, + "startLine": 26, "startColumn": 7, - "endLine": 44, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 26, + "endColumn": 16, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'Api'" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ParentId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "Resource", + "entityType": "Resource", + "resourceType": "AWS::ApiGateway::Resource" + }, + "propertyPath": "Properties.ParentId", + "category": "Best Practice", + "startLine": 27, + "startColumn": 7, + "endLine": 27, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -9827,44 +10651,67 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'GroupId' is create-only; updating it will cause resource replacement", + "message": "Property 'PathPart' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "StandaloneEgressTcpWithoutPorts", + "logicalId": "Resource", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupEgress" + "resourceType": "AWS::ApiGateway::Resource" }, - "propertyPath": "Properties.GroupId", + "propertyPath": "Properties.PathPart", "category": "Best Practice", - "startLine": 48, + "startLine": 28, "startColumn": 7, - "endLine": 48, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 28, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'RestApiId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "Response", + "entityType": "Resource", + "resourceType": "AWS::ApiGateway::GatewayResponse" + }, + "propertyPath": "Properties.RestApiId", + "category": "Best Practice", + "startLine": 32, + "startColumn": 7, + "endLine": 32, + "endColumn": 16, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "Ref to 'SecurityGroup'" + "resolutionSource": "Ref to 'Api'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'IpProtocol' is create-only; updating it will cause resource replacement", + "message": "Property 'ResponseType' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "StandaloneEgressTcpWithoutPorts", + "logicalId": "Response", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupEgress" + "resourceType": "AWS::ApiGateway::GatewayResponse" }, - "propertyPath": "Properties.IpProtocol", + "propertyPath": "Properties.ResponseType", "category": "Best Practice", - "startLine": 49, + "startLine": 33, "startColumn": 7, - "endLine": 49, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 33, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -9874,78 +10721,83 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'CidrIp' is create-only; updating it will cause resource replacement", + "message": "Property 'RestApiId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "StandaloneEgressTcpWithoutPorts", + "logicalId": "Validator", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupEgress" + "resourceType": "AWS::ApiGateway::RequestValidator" }, - "propertyPath": "Properties.CidrIp", + "propertyPath": "Properties.RestApiId", "category": "Best Practice", - "startLine": 50, + "startLine": 37, "startColumn": 7, - "endLine": 50, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 37, + "endColumn": 16, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'Api'" } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'Vpc' of type 'AWS::EC2::VPC' supports Tags but none are configured", + "message": "Property 'RestApiId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Vpc", + "logicalId": "Authorizer", "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" + "resourceType": "AWS::ApiGateway::Authorizer" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.RestApiId", "category": "Best Practice", - "startLine": 8, - "startColumn": 5, - "endLine": 8, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 41, + "startColumn": 7, + "endLine": 41, + "endColumn": 16, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'Api'" + } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'SecurityGroup' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", + "message": "Resource 'Api' of type 'AWS::ApiGateway::RestApi' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "SecurityGroup", + "logicalId": "Api", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::ApiGateway::RestApi" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 12, + "startLine": 5, "startColumn": 5, - "endLine": 12, + "endLine": 5, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "bad/W3688_snapshot_identifier_from_parameter.yaml": { - "filePath": "bad/W3688_snapshot_identifier_from_parameter.yaml", + "bad/W3671_spotfleet_ebs_iops.yaml": { + "filePath": "bad/W3671_spotfleet_ebs_iops.yaml", "status": "OK", "metadata": { - "resourcesScanned": 2, + "resourcesScanned": 1, "counts": { "fatal": 0, "errors": 0, - "warnings": 3, - "informational": 11, + "warnings": 1, + "informational": 3, "debug": 0 }, "suppressed": 0, @@ -9954,257 +10806,525 @@ }, "diagnostics": [ { - "ruleId": "W3688", + "ruleId": "W3671", "severity": "WARN", - "message": "MasterUsername is ignored when SnapshotIdentifier is present", + "message": "Iops is ignored when VolumeType is 'gp2'", "source": "CFN_LINT", "entity": { - "logicalId": "Restored", + "logicalId": "Fleet", "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" + "resourceType": "AWS::EC2::SpotFleet" }, - "propertyPath": "Properties.MasterUsername", + "propertyPath": "Properties.SpotFleetRequestConfigData.LaunchSpecifications.0.BlockDeviceMappings.0.Ebs.Iops", "category": "Best Practice", - "startLine": 17, - "startColumn": 7, - "endLine": 17, - "endColumn": 21, - "ruleDescription": "When restoring DBCluster certain properties are ignored", + "startLine": 16, + "startColumn": 19, + "endLine": 16, + "endColumn": 23, + "ruleDescription": "Iops is ignored for certain EBS volume types", "phase": "LINT" }, { - "ruleId": "W3689", - "severity": "WARN", - "message": "'MasterUsername' is ignored when SourceDBClusterIdentifier is present", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'SpotFleetRequestConfigData.IamFleetRole' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Cloned", + "logicalId": "Fleet", "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" + "resourceType": "AWS::EC2::SpotFleet" }, - "propertyPath": "Properties.MasterUsername", + "propertyPath": "Properties.SpotFleetRequestConfigData.IamFleetRole", "category": "Best Practice", - "startLine": 25, - "startColumn": 7, - "endLine": 25, + "startLine": 7, + "startColumn": 9, + "endLine": 7, "endColumn": 21, - "ruleDescription": "When using a source DB certain properties are ignored", - "phase": "LINT" + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W3689", - "severity": "WARN", - "message": "'StorageEncrypted' is ignored when SourceDBClusterIdentifier is present", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'SpotFleetRequestConfigData.LaunchSpecifications' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Cloned", + "logicalId": "Fleet", "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" + "resourceType": "AWS::EC2::SpotFleet" }, - "propertyPath": "Properties.StorageEncrypted", + "propertyPath": "Properties.SpotFleetRequestConfigData.LaunchSpecifications", "category": "Best Practice", - "startLine": 26, - "startColumn": 7, - "endLine": 26, - "endColumn": 23, - "ruleDescription": "When using a source DB certain properties are ignored", - "phase": "LINT" + "startLine": 9, + "startColumn": 9, + "endLine": 9, + "endColumn": 29, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3013", + "ruleId": "I9040", "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", + "message": "Resource 'Fleet' of type 'AWS::EC2::SpotFleet' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Restored", + "logicalId": "Fleet", "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" + "resourceType": "AWS::EC2::SpotFleet" }, - "propertyPath": "Properties", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 14, + "startLine": 5, "startColumn": 5, - "endLine": 14, + "endLine": 5, "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "bad/W3687_ports_ignored_by_protocol.yaml": { + "filePath": "bad/W3687_ports_ignored_by_protocol.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 4, + "counts": { + "fatal": 0, + "errors": 3, + "warnings": 6, + "informational": 13, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I3013", - "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "ruleId": "E3687", + "severity": "ERROR", + "message": "['FromPort', 'ToPort'] are required properties when using 'IpProtocol' value icmp", "source": "CFN_LINT", "entity": { - "logicalId": "Cloned", + "logicalId": "SecurityGroup", "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" + "resourceType": "AWS::EC2::SecurityGroup" + }, + "propertyPath": "Properties.SecurityGroupIngress.3", + "category": "Resource", + "startLine": 28, + "startColumn": 21, + "endLine": 28, + "endColumn": 22, + "ruleDescription": "Validate to and from ports based on the protocol", + "phase": "LINT" + }, + { + "ruleId": "E3687", + "severity": "ERROR", + "message": "['FromPort', 'ToPort'] are required properties when using 'IpProtocol' value udp", + "source": "CFN_LINT", + "entity": { + "logicalId": "SecurityGroup", + "entityType": "Resource", + "resourceType": "AWS::EC2::SecurityGroup" + }, + "propertyPath": "Properties.SecurityGroupEgress.1", + "category": "Resource", + "startLine": 35, + "startColumn": 21, + "endLine": 35, + "endColumn": 22, + "ruleDescription": "Validate to and from ports based on the protocol", + "phase": "LINT" + }, + { + "ruleId": "E3687", + "severity": "ERROR", + "message": "['FromPort', 'ToPort'] are required properties when using 'IpProtocol' value tcp", + "source": "CFN_LINT", + "entity": { + "logicalId": "StandaloneEgressTcpWithoutPorts", + "entityType": "Resource", + "resourceType": "AWS::EC2::SecurityGroupEgress" }, "propertyPath": "Properties", - "category": "Best Practice", - "startLine": 22, + "category": "Resource", + "startLine": 47, "startColumn": 5, - "endLine": 22, + "endLine": 47, "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "ruleDescription": "Validate to and from ports based on the protocol", "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W3687", + "severity": "WARN", + "message": "['FromPort', 'ToPort'] are ignored when using 'IpProtocol' value 'esp'", + "source": "CFN_LINT", "entity": { - "logicalId": "Restored", + "logicalId": "SecurityGroup", "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.SecurityGroupIngress.0.FromPort", "category": "Best Practice", - "startLine": 15, + "startLine": 17, + "startColumn": 11, + "endLine": 17, + "endColumn": 19, + "ruleDescription": "Validate that ports aren't specified for certain protocols", + "phase": "LINT" + }, + { + "ruleId": "W3687", + "severity": "WARN", + "message": "['FromPort', 'ToPort'] are ignored when using 'IpProtocol' value '50'", + "source": "CFN_LINT", + "entity": { + "logicalId": "SecurityGroup", + "entityType": "Resource", + "resourceType": "AWS::EC2::SecurityGroup" + }, + "propertyPath": "Properties.SecurityGroupIngress.1.FromPort", + "category": "Best Practice", + "startLine": 21, + "startColumn": 11, + "endLine": 21, + "endColumn": 19, + "ruleDescription": "Validate that ports aren't specified for certain protocols", + "phase": "LINT" + }, + { + "ruleId": "W3687", + "severity": "WARN", + "message": "['FromPort', 'ToPort'] are ignored when using 'IpProtocol' value '-1'", + "source": "CFN_LINT", + "entity": { + "logicalId": "SecurityGroup", + "entityType": "Resource", + "resourceType": "AWS::EC2::SecurityGroup" + }, + "propertyPath": "Properties.SecurityGroupIngress.2.FromPort", + "category": "Best Practice", + "startLine": 25, + "startColumn": 11, + "endLine": 25, + "endColumn": 19, + "ruleDescription": "Validate that ports aren't specified for certain protocols", + "phase": "LINT" + }, + { + "ruleId": "W3687", + "severity": "WARN", + "message": "['FromPort', 'ToPort'] are ignored when using 'IpProtocol' value 'gre'", + "source": "CFN_LINT", + "entity": { + "logicalId": "SecurityGroup", + "entityType": "Resource", + "resourceType": "AWS::EC2::SecurityGroup" + }, + "propertyPath": "Properties.SecurityGroupEgress.0.FromPort", + "category": "Best Practice", + "startLine": 32, + "startColumn": 11, + "endLine": 32, + "endColumn": 19, + "ruleDescription": "Validate that ports aren't specified for certain protocols", + "phase": "LINT" + }, + { + "ruleId": "W3687", + "severity": "WARN", + "message": "['FromPort', 'ToPort'] are ignored when using 'IpProtocol' value 'esp'", + "source": "CFN_LINT", + "entity": { + "logicalId": "StandaloneIngressEsp", + "entityType": "Resource", + "resourceType": "AWS::EC2::SecurityGroupIngress" + }, + "propertyPath": "Properties.FromPort", + "category": "Best Practice", + "startLine": 42, "startColumn": 7, - "endLine": 15, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "endLine": 42, + "endColumn": 15, + "ruleDescription": "Validate that ports aren't specified for certain protocols", + "phase": "LINT" + }, + { + "ruleId": "W9003", + "severity": "WARN", + "message": "50 is not of type 'string' - automatically coerced (number to string)", + "source": "CFN_LINT", + "entity": { + "logicalId": "SecurityGroup", + "entityType": "Resource", + "resourceType": "AWS::EC2::SecurityGroup" + }, + "propertyPath": "Properties.SecurityGroupIngress.1.IpProtocol", + "category": "Best Practice", + "startLine": 20, + "startColumn": 11, + "endLine": 20, + "endColumn": 21, + "ruleDescription": "Property type coercion warning", + "phase": "SCHEMA" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'SnapshotIdentifier' is create-only; updating it will cause resource replacement", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Restored", + "logicalId": "Vpc", "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" + "resourceType": "AWS::EC2::VPC" }, - "propertyPath": "Properties.SnapshotIdentifier", + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 16, + "startLine": 9, "startColumn": 7, - "endLine": 16, - "endColumn": 25, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", + "endLine": 9, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter 'SnapshotId' (type String)" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'MasterUsername' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Restored", + "logicalId": "SecurityGroup", "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.MasterUsername", + "propertyPath": "Properties.GroupDescription", "category": "Best Practice", - "startLine": 17, + "startLine": 13, "startColumn": 7, - "endLine": 17, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", + "endLine": 13, + "endColumn": 23, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Cloned", + "logicalId": "SecurityGroup", "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 23, + "startLine": 14, "startColumn": 7, - "endLine": 23, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", + "endLine": 14, + "endColumn": 12, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'Vpc'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'SourceDBClusterIdentifier' is create-only; updating it will cause resource replacement", + "message": "Property 'GroupId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Cloned", + "logicalId": "StandaloneIngressEsp", "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" + "resourceType": "AWS::EC2::SecurityGroupIngress" }, - "propertyPath": "Properties.SourceDBClusterIdentifier", + "propertyPath": "Properties.GroupId", "category": "Best Practice", - "startLine": 24, + "startLine": 40, "startColumn": 7, - "endLine": 24, - "endColumn": 32, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", + "endLine": 40, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "parameter 'SourceClusterId' (type String)" + "resolutionSource": "Ref to 'SecurityGroup'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'MasterUsername' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'IpProtocol' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Cloned", + "logicalId": "StandaloneIngressEsp", "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" + "resourceType": "AWS::EC2::SecurityGroupIngress" }, - "propertyPath": "Properties.MasterUsername", + "propertyPath": "Properties.IpProtocol", "category": "Best Practice", - "startLine": 25, + "startLine": 41, "startColumn": 7, - "endLine": 25, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", + "endLine": 41, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'StorageEncrypted' is create-only; updating it will cause resource replacement", + "message": "Property 'FromPort' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Cloned", + "logicalId": "StandaloneIngressEsp", "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" + "resourceType": "AWS::EC2::SecurityGroupIngress" }, - "propertyPath": "Properties.StorageEncrypted", + "propertyPath": "Properties.FromPort", "category": "Best Practice", - "startLine": 26, + "startLine": 42, "startColumn": 7, - "endLine": 26, - "endColumn": 23, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", + "endLine": 42, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ToPort' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "StandaloneIngressEsp", + "entityType": "Resource", + "resourceType": "AWS::EC2::SecurityGroupIngress" + }, + "propertyPath": "Properties.ToPort", + "category": "Best Practice", + "startLine": 43, + "startColumn": 7, + "endLine": 43, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'CidrIp' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "StandaloneIngressEsp", + "entityType": "Resource", + "resourceType": "AWS::EC2::SecurityGroupIngress" + }, + "propertyPath": "Properties.CidrIp", + "category": "Best Practice", + "startLine": 44, + "startColumn": 7, + "endLine": 44, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'GroupId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "StandaloneEgressTcpWithoutPorts", + "entityType": "Resource", + "resourceType": "AWS::EC2::SecurityGroupEgress" + }, + "propertyPath": "Properties.GroupId", + "category": "Best Practice", + "startLine": 48, + "startColumn": 7, + "endLine": 48, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'SecurityGroup'" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'IpProtocol' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "StandaloneEgressTcpWithoutPorts", + "entityType": "Resource", + "resourceType": "AWS::EC2::SecurityGroupEgress" + }, + "propertyPath": "Properties.IpProtocol", + "category": "Best Practice", + "startLine": 49, + "startColumn": 7, + "endLine": 49, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'CidrIp' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "StandaloneEgressTcpWithoutPorts", + "entityType": "Resource", + "resourceType": "AWS::EC2::SecurityGroupEgress" + }, + "propertyPath": "Properties.CidrIp", + "category": "Best Practice", + "startLine": 50, + "startColumn": 7, + "endLine": 50, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -10214,19 +11334,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Restored' of type 'AWS::RDS::DBCluster' supports Tags but none are configured", + "message": "Resource 'Vpc' of type 'AWS::EC2::VPC' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Restored", + "logicalId": "Vpc", "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" + "resourceType": "AWS::EC2::VPC" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 14, + "startLine": 8, "startColumn": 5, - "endLine": 14, + "endLine": 8, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -10234,35 +11354,35 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Cloned' of type 'AWS::RDS::DBCluster' supports Tags but none are configured", + "message": "Resource 'SecurityGroup' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Cloned", + "logicalId": "SecurityGroup", "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" + "resourceType": "AWS::EC2::SecurityGroup" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 22, + "startLine": 12, "startColumn": 5, - "endLine": 22, + "endLine": 12, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "bad/W4011_context_missing_why.yaml": { - "filePath": "bad/W4011_context_missing_why.yaml", + "bad/W3688_snapshot_identifier_from_parameter.yaml": { + "filePath": "bad/W3688_snapshot_identifier_from_parameter.yaml", "status": "OK", "metadata": { - "resourcesScanned": 4, + "resourcesScanned": 2, "counts": { "fatal": 0, "errors": 0, "warnings": 3, - "informational": 12, + "informational": 11, "debug": 0 }, "suppressed": 0, @@ -10271,270 +11391,279 @@ }, "diagnostics": [ { - "ruleId": "W4011", + "ruleId": "W3688", "severity": "WARN", - "message": "Metadata.com.aws.cloudformation.Context has no 'why' and no trust declaration with conf 'low'.", - "source": "ENGINE", + "message": "MasterUsername is ignored when SnapshotIdentifier is present", + "source": "CFN_LINT", "entity": { - "logicalId": "OrderQueue", + "logicalId": "Restored", "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" + "resourceType": "AWS::RDS::DBCluster" }, - "propertyPath": "Metadata.com.aws.cloudformation.Context", - "suggestedFix": "Add 'why' stating the resource's purpose and notable design choices without restating its type or property values, or set trust to {src: infer, conf: low, note: \"rationale not documented\"} when the rationale is unknown.", + "propertyPath": "Properties.MasterUsername", "category": "Best Practice", - "startLine": 14, + "startLine": 17, "startColumn": 7, - "endLine": 14, - "endColumn": 37, - "ruleDescription": "Metadata Context block has no 'why' rationale and no low-confidence trust declaration", + "endLine": 17, + "endColumn": 21, + "ruleDescription": "When restoring DBCluster certain properties are ignored", "phase": "LINT" }, { - "ruleId": "W4011", + "ruleId": "W3689", "severity": "WARN", - "message": "Metadata.com.aws.cloudformation.Context has no 'why' and no trust declaration with conf 'low'.", - "source": "ENGINE", + "message": "'MasterUsername' is ignored when SourceDBClusterIdentifier is present", + "source": "CFN_LINT", "entity": { - "logicalId": "Notifier", + "logicalId": "Cloned", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::RDS::DBCluster" }, - "propertyPath": "Metadata.com.aws.cloudformation.Context", - "suggestedFix": "Add 'why' stating the resource's purpose and notable design choices without restating its type or property values, or set trust to {src: infer, conf: low, note: \"rationale not documented\"} when the rationale is unknown.", + "propertyPath": "Properties.MasterUsername", "category": "Best Practice", - "startLine": 21, + "startLine": 25, "startColumn": 7, - "endLine": 21, - "endColumn": 37, - "ruleDescription": "Metadata Context block has no 'why' rationale and no low-confidence trust declaration", + "endLine": 25, + "endColumn": 21, + "ruleDescription": "When using a source DB certain properties are ignored", "phase": "LINT" }, { - "ruleId": "W4011", + "ruleId": "W3689", "severity": "WARN", - "message": "Metadata.com.aws.cloudformation.Context has no 'why' and no trust declaration with conf 'low'.", - "source": "ENGINE", + "message": "'StorageEncrypted' is ignored when SourceDBClusterIdentifier is present", + "source": "CFN_LINT", "entity": { - "logicalId": "ServiceLogGroup", + "logicalId": "Cloned", "entityType": "Resource", - "resourceType": "AWS::Logs::LogGroup" + "resourceType": "AWS::RDS::DBCluster" }, - "propertyPath": "Metadata.com.aws.cloudformation.Context", - "suggestedFix": "Add 'why' stating the resource's purpose and notable design choices without restating its type or property values, or set trust to {src: infer, conf: low, note: \"rationale not documented\"} when the rationale is unknown.", + "propertyPath": "Properties.StorageEncrypted", "category": "Best Practice", - "startLine": 48, + "startLine": 26, "startColumn": 7, - "endLine": 48, - "endColumn": 37, - "ruleDescription": "Metadata Context block has no 'why' rationale and no low-confidence trust declaration", + "endLine": 26, + "endColumn": 23, + "ruleDescription": "When using a source DB certain properties are ignored", "phase": "LINT" }, { - "ruleId": "I3011", + "ruleId": "I3013", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "OrderQueue", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "category": "Best Practice", - "startLine": 11, - "startColumn": 3, - "endLine": 11, - "endColumn": 13, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", "source": "CFN_LINT", "entity": { - "logicalId": "OrderQueue", + "logicalId": "Restored", "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" + "resourceType": "AWS::RDS::DBCluster" }, + "propertyPath": "Properties", "category": "Best Practice", - "startLine": 11, - "startColumn": 3, - "endLine": 11, - "endColumn": 13, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "startLine": 14, + "startColumn": 5, + "endLine": 14, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", "phase": "LINT" }, { - "ruleId": "I3011", + "ruleId": "I3013", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", "source": "CFN_LINT", "entity": { - "logicalId": "LegacyTable", + "logicalId": "Cloned", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::RDS::DBCluster" }, + "propertyPath": "Properties", "category": "Best Practice", - "startLine": 27, - "startColumn": 3, - "endLine": 27, - "endColumn": 14, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "startLine": 22, + "startColumn": 5, + "endLine": 22, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", "phase": "LINT" }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "LegacyTable", + "logicalId": "Restored", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::RDS::DBCluster" }, + "propertyPath": "Properties.Engine", "category": "Best Practice", - "startLine": 27, - "startColumn": 3, - "endLine": 27, - "endColumn": 14, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 15, + "startColumn": 7, + "endLine": 15, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'SnapshotIdentifier' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ServiceLogGroup", + "logicalId": "Restored", "entityType": "Resource", - "resourceType": "AWS::Logs::LogGroup" + "resourceType": "AWS::RDS::DBCluster" }, + "propertyPath": "Properties.SnapshotIdentifier", "category": "Best Practice", - "startLine": 43, - "startColumn": 3, - "endLine": 43, - "endColumn": 18, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 16, + "startColumn": 7, + "endLine": 16, + "endColumn": 25, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "parameter 'SnapshotId' (type String)" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'MasterUsername' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ServiceLogGroup", + "logicalId": "Restored", "entityType": "Resource", - "resourceType": "AWS::Logs::LogGroup" + "resourceType": "AWS::RDS::DBCluster" }, + "propertyPath": "Properties.MasterUsername", "category": "Best Practice", - "startLine": 43, - "startColumn": 3, - "endLine": 43, - "endColumn": 18, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 17, + "startColumn": 7, + "endLine": 17, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "I3013", + "ruleId": "I9001", "severity": "INFO", - "message": "'MessageRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "OrderQueue", + "logicalId": "Cloned", "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" + "resourceType": "AWS::RDS::DBCluster" }, - "propertyPath": "Properties", + "propertyPath": "Properties.Engine", "category": "Best Practice", - "startLine": 11, - "startColumn": 3, - "endLine": 11, + "startLine": 23, + "startColumn": 7, + "endLine": 23, "endColumn": 13, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", - "phase": "LINT" + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'SourceDBClusterIdentifier' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "LegacyTable", + "logicalId": "Cloned", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::RDS::DBCluster" }, - "propertyPath": "Properties.KeySchema", + "propertyPath": "Properties.SourceDBClusterIdentifier", "category": "Best Practice", - "startLine": 30, + "startLine": 24, "startColumn": 7, - "endLine": 30, - "endColumn": 16, + "endLine": 24, + "endColumn": 32, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only", + "resolutionSource": "parameter 'SourceClusterId' (type String)" } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'OrderQueue' of type 'AWS::SQS::Queue' supports Tags but none are configured", + "message": "Property 'MasterUsername' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "OrderQueue", + "logicalId": "Cloned", "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" + "resourceType": "AWS::RDS::DBCluster" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.MasterUsername", "category": "Best Practice", - "startLine": 11, - "startColumn": 3, - "endLine": 11, - "endColumn": 13, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 25, + "startColumn": 7, + "endLine": 25, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'Notifier' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Property 'StorageEncrypted' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Notifier", + "logicalId": "Cloned", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::RDS::DBCluster" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.StorageEncrypted", "category": "Best Practice", - "startLine": 18, - "startColumn": 3, - "endLine": 18, - "endColumn": 11, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 26, + "startColumn": 7, + "endLine": 26, + "endColumn": 23, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'LegacyTable' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", + "message": "Resource 'Restored' of type 'AWS::RDS::DBCluster' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "LegacyTable", + "logicalId": "Restored", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::RDS::DBCluster" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 29, + "startLine": 14, "startColumn": 5, - "endLine": 29, + "endLine": 14, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -10542,35 +11671,35 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'ServiceLogGroup' of type 'AWS::Logs::LogGroup' supports Tags but none are configured", + "message": "Resource 'Cloned' of type 'AWS::RDS::DBCluster' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ServiceLogGroup", + "logicalId": "Cloned", "entityType": "Resource", - "resourceType": "AWS::Logs::LogGroup" + "resourceType": "AWS::RDS::DBCluster" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 45, + "startLine": 22, "startColumn": 5, - "endLine": 45, + "endLine": 22, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "bad/W4012_context_schema_violation.yaml": { - "filePath": "bad/W4012_context_schema_violation.yaml", + "bad/W4011_context_missing_why.yaml": { + "filePath": "bad/W4011_context_missing_why.yaml", "status": "OK", "metadata": { - "resourcesScanned": 2, + "resourcesScanned": 4, "counts": { "fatal": 0, "errors": 0, - "warnings": 16, - "informational": 5, + "warnings": 3, + "informational": 12, "debug": 0 }, "suppressed": 0, @@ -10584,407 +11713,301 @@ "message": "Metadata.com.aws.cloudformation.Context has no 'why' and no trust declaration with conf 'low'.", "source": "ENGINE", "entity": { - "logicalId": "Queue", + "logicalId": "OrderQueue", "entityType": "Resource", "resourceType": "AWS::SQS::Queue" }, "propertyPath": "Metadata.com.aws.cloudformation.Context", "suggestedFix": "Add 'why' stating the resource's purpose and notable design choices without restating its type or property values, or set trust to {src: infer, conf: low, note: \"rationale not documented\"} when the rationale is unknown.", "category": "Best Practice", - "startLine": 25, + "startLine": 14, "startColumn": 7, - "endLine": 25, + "endLine": 14, "endColumn": 37, "ruleDescription": "Metadata Context block has no 'why' rationale and no low-confidence trust declaration", "phase": "LINT" }, { - "ruleId": "W4012", + "ruleId": "W4011", "severity": "WARN", - "message": "'arch' is an array; it must be a string.", + "message": "Metadata.com.aws.cloudformation.Context has no 'why' and no trust declaration with conf 'low'.", "source": "ENGINE", "entity": { - "logicalId": "com.aws.cloudformation.Context", - "entityType": "Metadata" + "logicalId": "Notifier", + "entityType": "Resource", + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Metadata/com.aws.cloudformation.Context/arch", + "propertyPath": "Metadata.com.aws.cloudformation.Context", + "suggestedFix": "Add 'why' stating the resource's purpose and notable design choices without restating its type or property values, or set trust to {src: infer, conf: low, note: \"rationale not documented\"} when the rationale is unknown.", "category": "Best Practice", - "startLine": 9, - "startColumn": 5, - "endLine": 9, - "endColumn": 9, - "ruleDescription": "Metadata Context block does not match the Metadata Context schema", + "startLine": 21, + "startColumn": 7, + "endLine": 21, + "endColumn": 37, + "ruleDescription": "Metadata Context block has no 'why' rationale and no low-confidence trust declaration", "phase": "LINT" }, { - "ruleId": "W4012", + "ruleId": "W4011", "severity": "WARN", - "message": "'why' belongs at resource level, not template level. Template-level fields: arch, must, owner, ref; resource-level fields: deps, must, mutability, mutable, trust, why.", + "message": "Metadata.com.aws.cloudformation.Context has no 'why' and no trust declaration with conf 'low'.", "source": "ENGINE", "entity": { - "logicalId": "com.aws.cloudformation.Context", - "entityType": "Metadata" + "logicalId": "ServiceLogGroup", + "entityType": "Resource", + "resourceType": "AWS::Logs::LogGroup" }, - "propertyPath": "Metadata/com.aws.cloudformation.Context/why", + "propertyPath": "Metadata.com.aws.cloudformation.Context", + "suggestedFix": "Add 'why' stating the resource's purpose and notable design choices without restating its type or property values, or set trust to {src: infer, conf: low, note: \"rationale not documented\"} when the rationale is unknown.", "category": "Best Practice", - "startLine": 11, - "startColumn": 5, - "endLine": 11, - "endColumn": 8, - "ruleDescription": "Metadata Context block does not match the Metadata Context schema", + "startLine": 48, + "startColumn": 7, + "endLine": 48, + "endColumn": 37, + "ruleDescription": "Metadata Context block has no 'why' rationale and no low-confidence trust declaration", "phase": "LINT" }, { - "ruleId": "W4012", - "severity": "WARN", - "message": "'ref.0' is missing required field 'at'; 'ref' must be an array whose entries are each a string or an object with required 'at'.", - "source": "ENGINE", + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "com.aws.cloudformation.Context", - "entityType": "Metadata" + "logicalId": "OrderQueue", + "entityType": "Resource", + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Metadata/com.aws.cloudformation.Context/ref/0", "category": "Best Practice", - "startLine": 13, - "startColumn": 12, - "endLine": 13, + "startLine": 11, + "startColumn": 3, + "endLine": 11, "endColumn": 13, - "ruleDescription": "Metadata Context block does not match the Metadata Context schema", + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "W4012", - "severity": "WARN", - "message": "'ref.1' does not match any supported shape; 'ref' must be an array whose entries are each a string or an object with required 'at'.", - "source": "ENGINE", + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "com.aws.cloudformation.Context", - "entityType": "Metadata" + "logicalId": "OrderQueue", + "entityType": "Resource", + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Metadata/com.aws.cloudformation.Context/ref/1", "category": "Best Practice", - "startLine": 14, - "startColumn": 9, - "endLine": 14, - "endColumn": 10, - "ruleDescription": "Metadata Context block does not match the Metadata Context schema", + "startLine": 11, + "startColumn": 3, + "endLine": 11, + "endColumn": 13, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "W4012", - "severity": "WARN", - "message": "'gaps' is not a recognized template-level Context field; allowed fields: arch, must, owner, ref.", - "source": "ENGINE", + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "com.aws.cloudformation.Context", - "entityType": "Metadata" + "logicalId": "LegacyTable", + "entityType": "Resource", + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Metadata/com.aws.cloudformation.Context/gaps", "category": "Best Practice", - "startLine": 15, - "startColumn": 5, - "endLine": 15, - "endColumn": 9, - "ruleDescription": "Metadata Context block does not match the Metadata Context schema", + "startLine": 27, + "startColumn": 3, + "endLine": 27, + "endColumn": 14, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "W4012", - "severity": "WARN", - "message": "Metadata.com.aws.cloudformation.Context must be a mapping of Context fields; found a string.", - "source": "ENGINE", + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "Bucket", + "logicalId": "LegacyTable", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Metadata.com.aws.cloudformation.Context", "category": "Best Practice", - "startLine": 21, - "startColumn": 7, - "endLine": 21, - "endColumn": 37, - "ruleDescription": "Metadata Context block does not match the Metadata Context schema", + "startLine": 27, + "startColumn": 3, + "endLine": 27, + "endColumn": 14, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "W4012", - "severity": "WARN", - "message": "'why' is a number; it must be a string.", - "source": "ENGINE", + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "Queue", + "logicalId": "ServiceLogGroup", "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" + "resourceType": "AWS::Logs::LogGroup" }, - "propertyPath": "Metadata.com.aws.cloudformation.Context.why", "category": "Best Practice", - "startLine": 26, - "startColumn": 9, - "endLine": 26, - "endColumn": 12, - "ruleDescription": "Metadata Context block does not match the Metadata Context schema", + "startLine": 43, + "startColumn": 3, + "endLine": 43, + "endColumn": 18, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "W4012", - "severity": "WARN", - "message": "'must' is a string; it must be an array of strings.", - "source": "ENGINE", + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "Queue", + "logicalId": "ServiceLogGroup", "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" + "resourceType": "AWS::Logs::LogGroup" }, - "propertyPath": "Metadata.com.aws.cloudformation.Context.must", "category": "Best Practice", - "startLine": 27, - "startColumn": 9, - "endLine": 27, - "endColumn": 13, - "ruleDescription": "Metadata Context block does not match the Metadata Context schema", + "startLine": 43, + "startColumn": 3, + "endLine": 43, + "endColumn": 18, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "W4012", - "severity": "WARN", - "message": "'mutable' value 'sometimes' is not recognized; allowed values: must-never-change, change-with-constraints, review-required, free-to-tune.", - "source": "ENGINE", + "ruleId": "I3013", + "severity": "INFO", + "message": "'MessageRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "Queue", + "logicalId": "OrderQueue", "entityType": "Resource", "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Metadata.com.aws.cloudformation.Context.mutable", + "propertyPath": "Properties", "category": "Best Practice", - "startLine": 28, - "startColumn": 9, - "endLine": 28, - "endColumn": 16, - "ruleDescription": "Metadata Context block does not match the Metadata Context schema", + "startLine": 11, + "startColumn": 3, + "endLine": 11, + "endColumn": 13, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", "phase": "LINT" }, { - "ruleId": "W4012", - "severity": "WARN", - "message": "'mutability.QueueName' value 'never-ish' is not recognized; allowed values: must-never-change, change-with-constraints, review-required, free-to-tune.", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Queue", + "logicalId": "LegacyTable", "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Metadata.com.aws.cloudformation.Context.mutability.QueueName", + "propertyPath": "Properties.KeySchema", "category": "Best Practice", "startLine": 30, - "startColumn": 11, + "startColumn": 7, "endLine": 30, - "endColumn": 20, - "ruleDescription": "Metadata Context block does not match the Metadata Context schema", - "phase": "LINT" + "endColumn": 16, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "W4012", - "severity": "WARN", - "message": "'trust' is missing required field 'src'; 'trust' must be an object with required 'src' and 'conf'.", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'OrderQueue' of type 'AWS::SQS::Queue' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Queue", + "logicalId": "OrderQueue", "entityType": "Resource", "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Metadata.com.aws.cloudformation.Context.trust", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 31, - "startColumn": 9, - "endLine": 31, - "endColumn": 14, - "ruleDescription": "Metadata Context block does not match the Metadata Context schema", - "phase": "LINT" - }, - { - "ruleId": "W4012", - "severity": "WARN", - "message": "'trust.conf' value 'certain' is not recognized; allowed values: high, medium, low.", - "source": "ENGINE", - "entity": { - "logicalId": "Queue", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "propertyPath": "Metadata.com.aws.cloudformation.Context.trust.conf", - "category": "Best Practice", - "startLine": 32, - "startColumn": 11, - "endLine": 32, - "endColumn": 15, - "ruleDescription": "Metadata Context block does not match the Metadata Context schema", - "phase": "LINT" - }, - { - "ruleId": "W4012", - "severity": "WARN", - "message": "'trust.extra' is not a recognized field of 'trust'; allowed fields: cite, conf, note, src.", - "source": "ENGINE", - "entity": { - "logicalId": "Queue", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "propertyPath": "Metadata.com.aws.cloudformation.Context.trust.extra", - "category": "Best Practice", - "startLine": 33, - "startColumn": 11, - "endLine": 33, - "endColumn": 16, - "ruleDescription": "Metadata Context block does not match the Metadata Context schema", - "phase": "LINT" - }, - { - "ruleId": "W4012", - "severity": "WARN", - "message": "'ref' belongs at template level, not resource level. Template-level fields: arch, must, owner, ref; resource-level fields: deps, must, mutability, mutable, trust, why.", - "source": "ENGINE", - "entity": { - "logicalId": "Queue", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "propertyPath": "Metadata.com.aws.cloudformation.Context.ref", - "category": "Best Practice", - "startLine": 34, - "startColumn": 9, - "endLine": 34, - "endColumn": 12, - "ruleDescription": "Metadata Context block does not match the Metadata Context schema", - "phase": "LINT" - }, - { - "ruleId": "W4012", - "severity": "WARN", - "message": "'unknown' is not a recognized resource-level Context field; allowed fields: deps, must, mutability, mutable, trust, why.", - "source": "ENGINE", - "entity": { - "logicalId": "Queue", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "propertyPath": "Metadata.com.aws.cloudformation.Context.unknown", - "category": "Best Practice", - "startLine": 35, - "startColumn": 9, - "endLine": 35, - "endColumn": 16, - "ruleDescription": "Metadata Context block does not match the Metadata Context schema", - "phase": "LINT" - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "Queue", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "category": "Best Practice", - "startLine": 22, - "startColumn": 3, - "endLine": 22, - "endColumn": 8, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "Queue", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "category": "Best Practice", - "startLine": 22, + "startLine": 11, "startColumn": 3, - "endLine": 22, - "endColumn": 8, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "endLine": 11, + "endColumn": 13, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "I3013", + "ruleId": "I9040", "severity": "INFO", - "message": "'MessageRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", + "message": "Resource 'Notifier' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Queue", + "logicalId": "Notifier", "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 22, + "startLine": 18, "startColumn": 3, - "endLine": 22, - "endColumn": 8, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "endLine": 18, + "endColumn": 11, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Resource 'LegacyTable' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Bucket", + "logicalId": "LegacyTable", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::DynamoDB::Table" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 18, - "startColumn": 3, - "endLine": 18, - "endColumn": 9, + "startLine": 29, + "startColumn": 5, + "endLine": 29, + "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Queue' of type 'AWS::SQS::Queue' supports Tags but none are configured", + "message": "Resource 'ServiceLogGroup' of type 'AWS::Logs::LogGroup' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Queue", + "logicalId": "ServiceLogGroup", "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" + "resourceType": "AWS::Logs::LogGroup" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 22, - "startColumn": 3, - "endLine": 22, - "endColumn": 8, + "startLine": 45, + "startColumn": 5, + "endLine": 45, + "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "bad/W4012_resource_context_intrinsics.yaml": { - "filePath": "bad/W4012_resource_context_intrinsics.yaml", + "bad/W4012_context_schema_violation.yaml": { + "filePath": "bad/W4012_context_schema_violation.yaml", "status": "OK", "metadata": { - "resourcesScanned": 4, + "resourcesScanned": 2, "counts": { "fatal": 0, "errors": 0, - "warnings": 5, - "informational": 16, + "warnings": 16, + "informational": 5, "debug": 0 }, "suppressed": 0, @@ -10993,299 +12016,339 @@ }, "diagnostics": [ { - "ruleId": "W4012", + "ruleId": "W4011", "severity": "WARN", - "message": "Metadata.com.aws.cloudformation.Context uses intrinsic function 'Fn::If'; it must match the Context schema directly.", + "message": "Metadata.com.aws.cloudformation.Context has no 'why' and no trust declaration with conf 'low'.", "source": "ENGINE", "entity": { - "logicalId": "ConditionalContextQueue", + "logicalId": "Queue", "entityType": "Resource", "resourceType": "AWS::SQS::Queue" }, "propertyPath": "Metadata.com.aws.cloudformation.Context", + "suggestedFix": "Add 'why' stating the resource's purpose and notable design choices without restating its type or property values, or set trust to {src: infer, conf: low, note: \"rationale not documented\"} when the rationale is unknown.", "category": "Best Practice", - "startLine": 18, + "startLine": 25, "startColumn": 7, - "endLine": 18, + "endLine": 25, "endColumn": 37, - "ruleDescription": "Metadata Context block does not match the Metadata Context schema", + "ruleDescription": "Metadata Context block has no 'why' rationale and no low-confidence trust declaration", "phase": "LINT" }, { "ruleId": "W4012", "severity": "WARN", - "message": "'why' uses intrinsic function 'Fn::Sub'; 'why' must be a string.", + "message": "'arch' is an array; it must be a string.", "source": "ENGINE", "entity": { - "logicalId": "IntrinsicFieldQueue", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" + "logicalId": "com.aws.cloudformation.Context", + "entityType": "Metadata" }, - "propertyPath": "Metadata.com.aws.cloudformation.Context.why", + "propertyPath": "Metadata/com.aws.cloudformation.Context/arch", "category": "Best Practice", - "startLine": 26, - "startColumn": 9, - "endLine": 26, - "endColumn": 12, + "startLine": 9, + "startColumn": 5, + "endLine": 9, + "endColumn": 9, "ruleDescription": "Metadata Context block does not match the Metadata Context schema", "phase": "LINT" }, { "ruleId": "W4012", "severity": "WARN", - "message": "'must.0' uses intrinsic function 'Fn::Sub'; 'must' must be an array of strings.", + "message": "'why' belongs at resource level, not template level. Template-level fields: arch, must, owner, ref; resource-level fields: deps, must, mutability, mutable, trust, why.", "source": "ENGINE", "entity": { - "logicalId": "IntrinsicFieldQueue", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" + "logicalId": "com.aws.cloudformation.Context", + "entityType": "Metadata" }, - "propertyPath": "Metadata.com.aws.cloudformation.Context.must.0", + "propertyPath": "Metadata/com.aws.cloudformation.Context/why", "category": "Best Practice", - "startLine": 28, - "startColumn": 18, - "endLine": 28, - "endColumn": 19, + "startLine": 11, + "startColumn": 5, + "endLine": 11, + "endColumn": 8, "ruleDescription": "Metadata Context block does not match the Metadata Context schema", "phase": "LINT" }, { "ruleId": "W4012", "severity": "WARN", - "message": "'mutability' uses intrinsic function 'Fn::Sub'; 'mutability' must be a mapping of property name to one of: must-never-change, change-with-constraints, review-required, free-to-tune.", + "message": "'ref.0' is missing required field 'at'; 'ref' must be an array whose entries are each a string or an object with required 'at'.", "source": "ENGINE", "entity": { - "logicalId": "SubMutabilityQueue", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" + "logicalId": "com.aws.cloudformation.Context", + "entityType": "Metadata" }, - "propertyPath": "Metadata.com.aws.cloudformation.Context.mutability", + "propertyPath": "Metadata/com.aws.cloudformation.Context/ref/0", "category": "Best Practice", - "startLine": 37, - "startColumn": 9, - "endLine": 37, - "endColumn": 19, + "startLine": 13, + "startColumn": 12, + "endLine": 13, + "endColumn": 13, "ruleDescription": "Metadata Context block does not match the Metadata Context schema", "phase": "LINT" }, { "ruleId": "W4012", "severity": "WARN", - "message": "'mutability' uses intrinsic function 'Fn::If'; 'mutability' must be a mapping of property name to one of: must-never-change, change-with-constraints, review-required, free-to-tune.", + "message": "'ref.1' does not match any supported shape; 'ref' must be an array whose entries are each a string or an object with required 'at'.", "source": "ENGINE", "entity": { - "logicalId": "ConditionalMutabilityQueue", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" + "logicalId": "com.aws.cloudformation.Context", + "entityType": "Metadata" }, - "propertyPath": "Metadata.com.aws.cloudformation.Context.mutability", + "propertyPath": "Metadata/com.aws.cloudformation.Context/ref/1", "category": "Best Practice", - "startLine": 43, + "startLine": 14, "startColumn": 9, - "endLine": 43, - "endColumn": 19, + "endLine": 14, + "endColumn": 10, "ruleDescription": "Metadata Context block does not match the Metadata Context schema", "phase": "LINT" }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "ruleId": "W4012", + "severity": "WARN", + "message": "'gaps' is not a recognized template-level Context field; allowed fields: arch, must, owner, ref.", + "source": "ENGINE", "entity": { - "logicalId": "ConditionalContextQueue", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" + "logicalId": "com.aws.cloudformation.Context", + "entityType": "Metadata" }, + "propertyPath": "Metadata/com.aws.cloudformation.Context/gaps", "category": "Best Practice", "startLine": 15, - "startColumn": 3, + "startColumn": 5, "endLine": 15, - "endColumn": 26, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "endColumn": 9, + "ruleDescription": "Metadata Context block does not match the Metadata Context schema", "phase": "LINT" }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "ruleId": "W4012", + "severity": "WARN", + "message": "Metadata.com.aws.cloudformation.Context must be a mapping of Context fields; found a string.", + "source": "ENGINE", "entity": { - "logicalId": "ConditionalContextQueue", + "logicalId": "Bucket", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" + }, + "propertyPath": "Metadata.com.aws.cloudformation.Context", + "category": "Best Practice", + "startLine": 21, + "startColumn": 7, + "endLine": 21, + "endColumn": 37, + "ruleDescription": "Metadata Context block does not match the Metadata Context schema", + "phase": "LINT" + }, + { + "ruleId": "W4012", + "severity": "WARN", + "message": "'why' is a number; it must be a string.", + "source": "ENGINE", + "entity": { + "logicalId": "Queue", "entityType": "Resource", "resourceType": "AWS::SQS::Queue" }, + "propertyPath": "Metadata.com.aws.cloudformation.Context.why", "category": "Best Practice", - "startLine": 15, - "startColumn": 3, - "endLine": 15, - "endColumn": 26, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "startLine": 26, + "startColumn": 9, + "endLine": 26, + "endColumn": 12, + "ruleDescription": "Metadata Context block does not match the Metadata Context schema", "phase": "LINT" }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "ruleId": "W4012", + "severity": "WARN", + "message": "'must' is a string; it must be an array of strings.", + "source": "ENGINE", "entity": { - "logicalId": "IntrinsicFieldQueue", + "logicalId": "Queue", "entityType": "Resource", "resourceType": "AWS::SQS::Queue" }, + "propertyPath": "Metadata.com.aws.cloudformation.Context.must", "category": "Best Practice", - "startLine": 22, - "startColumn": 3, - "endLine": 22, - "endColumn": 22, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "startLine": 27, + "startColumn": 9, + "endLine": 27, + "endColumn": 13, + "ruleDescription": "Metadata Context block does not match the Metadata Context schema", "phase": "LINT" }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "ruleId": "W4012", + "severity": "WARN", + "message": "'mutable' value 'sometimes' is not recognized; allowed values: must-never-change, change-with-constraints, review-required, free-to-tune.", + "source": "ENGINE", "entity": { - "logicalId": "IntrinsicFieldQueue", + "logicalId": "Queue", "entityType": "Resource", "resourceType": "AWS::SQS::Queue" }, + "propertyPath": "Metadata.com.aws.cloudformation.Context.mutable", "category": "Best Practice", - "startLine": 22, - "startColumn": 3, - "endLine": 22, - "endColumn": 22, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "startLine": 28, + "startColumn": 9, + "endLine": 28, + "endColumn": 16, + "ruleDescription": "Metadata Context block does not match the Metadata Context schema", "phase": "LINT" }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "ruleId": "W4012", + "severity": "WARN", + "message": "'mutability.QueueName' value 'never-ish' is not recognized; allowed values: must-never-change, change-with-constraints, review-required, free-to-tune.", + "source": "ENGINE", "entity": { - "logicalId": "SubMutabilityQueue", + "logicalId": "Queue", "entityType": "Resource", "resourceType": "AWS::SQS::Queue" }, + "propertyPath": "Metadata.com.aws.cloudformation.Context.mutability.QueueName", "category": "Best Practice", - "startLine": 32, - "startColumn": 3, - "endLine": 32, - "endColumn": 21, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "startLine": 30, + "startColumn": 11, + "endLine": 30, + "endColumn": 20, + "ruleDescription": "Metadata Context block does not match the Metadata Context schema", "phase": "LINT" }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "ruleId": "W4012", + "severity": "WARN", + "message": "'trust' is missing required field 'src'; 'trust' must be an object with required 'src' and 'conf'.", + "source": "ENGINE", "entity": { - "logicalId": "SubMutabilityQueue", + "logicalId": "Queue", + "entityType": "Resource", + "resourceType": "AWS::SQS::Queue" + }, + "propertyPath": "Metadata.com.aws.cloudformation.Context.trust", + "category": "Best Practice", + "startLine": 31, + "startColumn": 9, + "endLine": 31, + "endColumn": 14, + "ruleDescription": "Metadata Context block does not match the Metadata Context schema", + "phase": "LINT" + }, + { + "ruleId": "W4012", + "severity": "WARN", + "message": "'trust.conf' value 'certain' is not recognized; allowed values: high, medium, low.", + "source": "ENGINE", + "entity": { + "logicalId": "Queue", "entityType": "Resource", "resourceType": "AWS::SQS::Queue" }, + "propertyPath": "Metadata.com.aws.cloudformation.Context.trust.conf", "category": "Best Practice", "startLine": 32, - "startColumn": 3, + "startColumn": 11, "endLine": 32, - "endColumn": 21, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "endColumn": 15, + "ruleDescription": "Metadata Context block does not match the Metadata Context schema", "phase": "LINT" }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "ruleId": "W4012", + "severity": "WARN", + "message": "'trust.extra' is not a recognized field of 'trust'; allowed fields: cite, conf, note, src.", + "source": "ENGINE", "entity": { - "logicalId": "ConditionalMutabilityQueue", + "logicalId": "Queue", "entityType": "Resource", "resourceType": "AWS::SQS::Queue" }, + "propertyPath": "Metadata.com.aws.cloudformation.Context.trust.extra", "category": "Best Practice", - "startLine": 38, - "startColumn": 3, - "endLine": 38, - "endColumn": 29, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "startLine": 33, + "startColumn": 11, + "endLine": 33, + "endColumn": 16, + "ruleDescription": "Metadata Context block does not match the Metadata Context schema", "phase": "LINT" }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "ruleId": "W4012", + "severity": "WARN", + "message": "'ref' belongs at template level, not resource level. Template-level fields: arch, must, owner, ref; resource-level fields: deps, must, mutability, mutable, trust, why.", + "source": "ENGINE", "entity": { - "logicalId": "ConditionalMutabilityQueue", + "logicalId": "Queue", "entityType": "Resource", "resourceType": "AWS::SQS::Queue" }, + "propertyPath": "Metadata.com.aws.cloudformation.Context.ref", "category": "Best Practice", - "startLine": 38, - "startColumn": 3, - "endLine": 38, - "endColumn": 29, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "startLine": 34, + "startColumn": 9, + "endLine": 34, + "endColumn": 12, + "ruleDescription": "Metadata Context block does not match the Metadata Context schema", "phase": "LINT" }, { - "ruleId": "I3013", - "severity": "INFO", - "message": "'MessageRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", + "ruleId": "W4012", + "severity": "WARN", + "message": "'unknown' is not a recognized resource-level Context field; allowed fields: deps, must, mutability, mutable, trust, why.", + "source": "ENGINE", "entity": { - "logicalId": "ConditionalContextQueue", + "logicalId": "Queue", "entityType": "Resource", "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Properties", + "propertyPath": "Metadata.com.aws.cloudformation.Context.unknown", "category": "Best Practice", - "startLine": 15, - "startColumn": 3, - "endLine": 15, - "endColumn": 26, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "startLine": 35, + "startColumn": 9, + "endLine": 35, + "endColumn": 16, + "ruleDescription": "Metadata Context block does not match the Metadata Context schema", "phase": "LINT" }, { - "ruleId": "I3013", + "ruleId": "I3011", "severity": "INFO", - "message": "'MessageRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "IntrinsicFieldQueue", + "logicalId": "Queue", "entityType": "Resource", "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Properties", "category": "Best Practice", "startLine": 22, "startColumn": 3, "endLine": 22, - "endColumn": 22, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "endColumn": 8, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "I3013", + "ruleId": "I3011", "severity": "INFO", - "message": "'MessageRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "SubMutabilityQueue", + "logicalId": "Queue", "entityType": "Resource", "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Properties", "category": "Best Practice", - "startLine": 32, + "startLine": 22, "startColumn": 3, - "endLine": 32, - "endColumn": 21, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "endLine": 22, + "endColumn": 8, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { @@ -11294,46 +12357,46 @@ "message": "'MessageRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", "source": "CFN_LINT", "entity": { - "logicalId": "ConditionalMutabilityQueue", + "logicalId": "Queue", "entityType": "Resource", "resourceType": "AWS::SQS::Queue" }, "propertyPath": "Properties", "category": "Best Practice", - "startLine": 38, + "startLine": 22, "startColumn": 3, - "endLine": 38, - "endColumn": 29, + "endLine": 22, + "endColumn": 8, "ruleDescription": "Check resources with auto expiring content have explicit retention period", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'ConditionalContextQueue' of type 'AWS::SQS::Queue' supports Tags but none are configured", + "message": "Resource 'Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ConditionalContextQueue", + "logicalId": "Bucket", "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" + "resourceType": "AWS::S3::Bucket" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 15, + "startLine": 18, "startColumn": 3, - "endLine": 15, - "endColumn": 26, + "endLine": 18, + "endColumn": 9, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'IntrinsicFieldQueue' of type 'AWS::SQS::Queue' supports Tags but none are configured", + "message": "Resource 'Queue' of type 'AWS::SQS::Queue' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "IntrinsicFieldQueue", + "logicalId": "Queue", "entityType": "Resource", "resourceType": "AWS::SQS::Queue" }, @@ -11343,102 +12406,121 @@ "startLine": 22, "startColumn": 3, "endLine": 22, - "endColumn": 22, + "endColumn": 8, "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "bad/W4012_resource_context_intrinsics.yaml": { + "filePath": "bad/W4012_resource_context_intrinsics.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 4, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 5, + "informational": 16, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'SubMutabilityQueue' of type 'AWS::SQS::Queue' supports Tags but none are configured", + "ruleId": "W4012", + "severity": "WARN", + "message": "Metadata.com.aws.cloudformation.Context uses intrinsic function 'Fn::If'; it must match the Context schema directly.", "source": "ENGINE", "entity": { - "logicalId": "SubMutabilityQueue", + "logicalId": "ConditionalContextQueue", "entityType": "Resource", "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Metadata.com.aws.cloudformation.Context", "category": "Best Practice", - "startLine": 32, - "startColumn": 3, - "endLine": 32, - "endColumn": 21, - "ruleDescription": "Resource should have Tags", + "startLine": 18, + "startColumn": 7, + "endLine": 18, + "endColumn": 37, + "ruleDescription": "Metadata Context block does not match the Metadata Context schema", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'ConditionalMutabilityQueue' of type 'AWS::SQS::Queue' supports Tags but none are configured", + "ruleId": "W4012", + "severity": "WARN", + "message": "'why' uses intrinsic function 'Fn::Sub'; 'why' must be a string.", "source": "ENGINE", "entity": { - "logicalId": "ConditionalMutabilityQueue", + "logicalId": "IntrinsicFieldQueue", "entityType": "Resource", "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Metadata.com.aws.cloudformation.Context.why", "category": "Best Practice", - "startLine": 38, - "startColumn": 3, - "endLine": 38, - "endColumn": 29, - "ruleDescription": "Resource should have Tags", + "startLine": 26, + "startColumn": 9, + "endLine": 26, + "endColumn": 12, + "ruleDescription": "Metadata Context block does not match the Metadata Context schema", "phase": "LINT" - } - ] - }, - "bad/W4012_template_context_intrinsic.yaml": { - "filePath": "bad/W4012_template_context_intrinsic.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 2, - "informational": 4, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "W2001", + "ruleId": "W4012", "severity": "WARN", - "message": "Parameter 'Environment' is not referenced anywhere in the template", - "source": "CFN_LINT", + "message": "'must.0' uses intrinsic function 'Fn::Sub'; 'must' must be an array of strings.", + "source": "ENGINE", "entity": { - "logicalId": "Environment", - "entityType": "Parameter" + "logicalId": "IntrinsicFieldQueue", + "entityType": "Resource", + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Parameters/Environment", + "propertyPath": "Metadata.com.aws.cloudformation.Context.must.0", "category": "Best Practice", - "startLine": 4, - "startColumn": 3, - "endLine": 4, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", + "startLine": 28, + "startColumn": 18, + "endLine": 28, + "endColumn": 19, + "ruleDescription": "Metadata Context block does not match the Metadata Context schema", "phase": "LINT" }, { "ruleId": "W4012", "severity": "WARN", - "message": "'arch' uses intrinsic function 'Fn::Sub'; 'arch' must be a string.", + "message": "'mutability' uses intrinsic function 'Fn::Sub'; 'mutability' must be a mapping of property name to one of: must-never-change, change-with-constraints, review-required, free-to-tune.", "source": "ENGINE", "entity": { - "logicalId": "com.aws.cloudformation.Context", - "entityType": "Metadata" + "logicalId": "SubMutabilityQueue", + "entityType": "Resource", + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Metadata/com.aws.cloudformation.Context/arch", + "propertyPath": "Metadata.com.aws.cloudformation.Context.mutability", "category": "Best Practice", - "startLine": 11, - "startColumn": 5, - "endLine": 11, - "endColumn": 9, + "startLine": 37, + "startColumn": 9, + "endLine": 37, + "endColumn": 19, + "ruleDescription": "Metadata Context block does not match the Metadata Context schema", + "phase": "LINT" + }, + { + "ruleId": "W4012", + "severity": "WARN", + "message": "'mutability' uses intrinsic function 'Fn::If'; 'mutability' must be a mapping of property name to one of: must-never-change, change-with-constraints, review-required, free-to-tune.", + "source": "ENGINE", + "entity": { + "logicalId": "ConditionalMutabilityQueue", + "entityType": "Resource", + "resourceType": "AWS::SQS::Queue" + }, + "propertyPath": "Metadata.com.aws.cloudformation.Context.mutability", + "category": "Best Practice", + "startLine": 43, + "startColumn": 9, + "endLine": 43, + "endColumn": 19, "ruleDescription": "Metadata Context block does not match the Metadata Context schema", "phase": "LINT" }, @@ -11448,15 +12530,15 @@ "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "Queue", + "logicalId": "ConditionalContextQueue", "entityType": "Resource", "resourceType": "AWS::SQS::Queue" }, "category": "Best Practice", - "startLine": 13, + "startLine": 15, "startColumn": 3, - "endLine": 13, - "endColumn": 8, + "endLine": 15, + "endColumn": 26, "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, @@ -11466,362 +12548,294 @@ "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "Queue", + "logicalId": "ConditionalContextQueue", "entityType": "Resource", "resourceType": "AWS::SQS::Queue" }, "category": "Best Practice", - "startLine": 13, + "startLine": 15, "startColumn": 3, - "endLine": 13, - "endColumn": 8, + "endLine": 15, + "endColumn": 26, "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "I3013", + "ruleId": "I3011", "severity": "INFO", - "message": "'MessageRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "Queue", + "logicalId": "IntrinsicFieldQueue", "entityType": "Resource", "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Properties", "category": "Best Practice", - "startLine": 13, + "startLine": 22, "startColumn": 3, - "endLine": 13, - "endColumn": 8, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "endLine": 22, + "endColumn": 22, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "I9040", + "ruleId": "I3011", "severity": "INFO", - "message": "Resource 'Queue' of type 'AWS::SQS::Queue' supports Tags but none are configured", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "Queue", + "logicalId": "IntrinsicFieldQueue", "entityType": "Resource", "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 13, + "startLine": 22, "startColumn": 3, - "endLine": 13, - "endColumn": 8, - "ruleDescription": "Resource should have Tags", + "endLine": 22, + "endColumn": 22, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" - } - ] - }, - "bad/W9006_every_allowed_value_too_long.json": { - "filePath": "bad/W9006_every_allowed_value_too_long.json", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 1, - "informational": 2, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "W9006", - "severity": "WARN", - "message": "String length 78 exceeds maximum 63 for property 'BucketName'", - "source": "ENGINE", + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "Bucket", + "logicalId": "SubMutabilityQueue", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Properties.BucketName", "category": "Best Practice", - "startLine": 14, - "startColumn": 23, - "endLine": 14, - "endColumn": 34, - "ruleDescription": "String length estimation through Fn::Sub", - "phase": "LINT", - "context": { - "actualValue": "this-allowed-value-is-deliberately-longer-than-the-sixty-three-character-limit", - "extra": { - "actual_length": 78 - } - } + "startLine": 32, + "startColumn": 3, + "endLine": 32, + "endColumn": 21, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "Bucket", + "logicalId": "SubMutabilityQueue", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Properties.BucketName", "category": "Best Practice", - "startLine": 14, - "startColumn": 23, - "endLine": 14, - "endColumn": 34, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter with AllowedValues" - } + "startLine": 32, + "startColumn": 3, + "endLine": 32, + "endColumn": 21, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9040", + "ruleId": "I3011", "severity": "INFO", - "message": "Resource 'Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", - "source": "ENGINE", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "Bucket", + "logicalId": "ConditionalMutabilityQueue", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 14, - "startColumn": 7, - "endLine": 14, - "endColumn": 18, - "ruleDescription": "Resource should have Tags", + "startLine": 38, + "startColumn": 3, + "endLine": 38, + "endColumn": 29, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" - } - ] - }, - "bad/W9007_duplicate_objects_different_key_order.yaml": { - "filePath": "bad/W9007_duplicate_objects_different_key_order.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 1, - "errors": 0, - "warnings": 1, - "informational": 3, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "F3037", - "severity": "FATAL", - "message": "Array items are not unique", - "source": "SCHEMA", + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "Task", + "logicalId": "ConditionalMutabilityQueue", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Properties.PlacementConstraints", - "category": "Schema", - "startLine": 10, - "startColumn": 7, - "endLine": 10, - "endColumn": 27, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Array items not unique", - "phase": "SCHEMA", - "context": { - "actualValue": [ - { - "Type": "memberOf", - "Expression": "attribute:ecs.instance-type =~ t3.*" - }, - { - "Expression": "attribute:ecs.instance-type =~ t3.*", - "Type": "memberOf" - } - ] - } + "category": "Best Practice", + "startLine": 38, + "startColumn": 3, + "endLine": 38, + "endColumn": 29, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "W9007", - "severity": "WARN", - "message": "Array property 'PlacementConstraints' contains duplicate values", - "source": "ENGINE", + "ruleId": "I3013", + "severity": "INFO", + "message": "'MessageRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "Task", + "logicalId": "ConditionalContextQueue", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Properties.PlacementConstraints", + "propertyPath": "Properties", "category": "Best Practice", - "startLine": 10, - "startColumn": 7, - "endLine": 10, - "endColumn": 27, - "ruleDescription": "Array items must be unique when required", + "startLine": 15, + "startColumn": 3, + "endLine": 15, + "endColumn": 26, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3013", "severity": "INFO", - "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'MessageRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "Task", + "logicalId": "IntrinsicFieldQueue", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Properties.ContainerDefinitions", + "propertyPath": "Properties", "category": "Best Practice", - "startLine": 6, - "startColumn": 7, - "endLine": 6, - "endColumn": 27, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 22, + "startColumn": 3, + "endLine": 22, + "endColumn": 22, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3013", "severity": "INFO", - "message": "Property 'PlacementConstraints' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'MessageRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "Task", + "logicalId": "SubMutabilityQueue", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Properties.PlacementConstraints", + "propertyPath": "Properties", "category": "Best Practice", - "startLine": 10, - "startColumn": 7, - "endLine": 10, - "endColumn": 27, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 32, + "startColumn": 3, + "endLine": 32, + "endColumn": 21, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "phase": "LINT" + }, + { + "ruleId": "I3013", + "severity": "INFO", + "message": "'MessageRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "ConditionalMutabilityQueue", + "entityType": "Resource", + "resourceType": "AWS::SQS::Queue" + }, + "propertyPath": "Properties", + "category": "Best Practice", + "startLine": 38, + "startColumn": 3, + "endLine": 38, + "endColumn": 29, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Task' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", + "message": "Resource 'ConditionalContextQueue' of type 'AWS::SQS::Queue' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Task", + "logicalId": "ConditionalContextQueue", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::SQS::Queue" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, + "startLine": 15, + "startColumn": 3, + "endLine": 15, + "endColumn": 26, "ruleDescription": "Resource should have Tags", "phase": "LINT" - } - ] - }, - "bad/W9053_equivalent_conditions.yaml": { - "filePath": "bad/W9053_equivalent_conditions.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 2, - "informational": 1, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "W8001", - "severity": "WARN", - "message": "Condition 'IsProd' is not used by any resource or Fn::If", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'IntrinsicFieldQueue' of type 'AWS::SQS::Queue' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "IsProd", - "entityType": "Condition" + "logicalId": "IntrinsicFieldQueue", + "entityType": "Resource", + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Conditions/IsProd", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 8, + "startLine": 22, "startColumn": 3, - "endLine": 8, - "endColumn": 9, - "ruleDescription": "Check if Conditions are Used", + "endLine": 22, + "endColumn": 22, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "W9053", - "severity": "WARN", - "message": "Condition 'IsProduction' is equivalent to condition 'IsProd' - consider consolidating", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'SubMutabilityQueue' of type 'AWS::SQS::Queue' supports Tags but none are configured", "source": "ENGINE", + "entity": { + "logicalId": "SubMutabilityQueue", + "entityType": "Resource", + "resourceType": "AWS::SQS::Queue" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 6, + "startLine": 32, "startColumn": 3, - "endLine": 6, - "endColumn": 15, - "ruleDescription": "Conditions are semantically equivalent and can be consolidated", - "phase": "PARSE" + "endLine": 32, + "endColumn": 21, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Resource 'ConditionalMutabilityQueue' of type 'AWS::SQS::Queue' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Bucket", + "logicalId": "ConditionalMutabilityQueue", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::SQS::Queue" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 11, + "startLine": 38, "startColumn": 3, - "endLine": 11, - "endColumn": 9, + "endLine": 38, + "endColumn": 29, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "bad/aurora_with_allocated_storage.yaml": { - "filePath": "bad/aurora_with_allocated_storage.yaml", + "bad/W4012_template_context_intrinsic.yaml": { + "filePath": "bad/W4012_template_context_intrinsic.yaml", "status": "OK", "metadata": { "resourcesScanned": 1, "counts": { "fatal": 0, "errors": 0, - "warnings": 1, - "informational": 6, + "warnings": 2, + "informational": 4, "debug": 0 }, "suppressed": 0, @@ -11830,24 +12844,40 @@ }, "diagnostics": [ { - "ruleId": "W9003", + "ruleId": "W2001", "severity": "WARN", - "message": "100 is not of type 'string' - automatically coerced (number to string)", + "message": "Parameter 'Environment' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "AuroraDB", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "logicalId": "Environment", + "entityType": "Parameter" }, - "propertyPath": "Properties.AllocatedStorage", + "propertyPath": "Parameters/Environment", "category": "Best Practice", - "startLine": 9, - "startColumn": 7, - "endLine": 9, - "endColumn": 23, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Property type coercion warning", - "phase": "SCHEMA" + "startLine": 4, + "startColumn": 3, + "endLine": 4, + "endColumn": 14, + "ruleDescription": "Check if Parameters are Used", + "phase": "LINT" + }, + { + "ruleId": "W4012", + "severity": "WARN", + "message": "'arch' uses intrinsic function 'Fn::Sub'; 'arch' must be a string.", + "source": "ENGINE", + "entity": { + "logicalId": "com.aws.cloudformation.Context", + "entityType": "Metadata" + }, + "propertyPath": "Metadata/com.aws.cloudformation.Context/arch", + "category": "Best Practice", + "startLine": 11, + "startColumn": 5, + "endLine": 11, + "endColumn": 9, + "ruleDescription": "Metadata Context block does not match the Metadata Context schema", + "phase": "LINT" }, { "ruleId": "I3011", @@ -11855,15 +12885,15 @@ "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "AuroraDB", + "logicalId": "Queue", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::SQS::Queue" }, "category": "Best Practice", - "startLine": 3, + "startLine": 13, "startColumn": 3, - "endLine": 3, - "endColumn": 11, + "endLine": 13, + "endColumn": 8, "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, @@ -11873,105 +12903,156 @@ "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "AuroraDB", + "logicalId": "Queue", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::SQS::Queue" }, "category": "Best Practice", - "startLine": 3, + "startLine": 13, "startColumn": 3, - "endLine": 3, - "endColumn": 11, + "endLine": 13, + "endColumn": 8, "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3013", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "'MessageRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "Queue", + "entityType": "Resource", + "resourceType": "AWS::SQS::Queue" + }, + "propertyPath": "Properties", + "category": "Best Practice", + "startLine": 13, + "startColumn": 3, + "endLine": 13, + "endColumn": 8, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Queue' of type 'AWS::SQS::Queue' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "AuroraDB", + "logicalId": "Queue", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 6, - "startColumn": 7, - "endLine": 6, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", + "startLine": 13, + "startColumn": 3, + "endLine": 13, + "endColumn": 8, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "bad/W9006_every_allowed_value_too_long.json": { + "filePath": "bad/W9006_every_allowed_value_too_long.json", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 1, + "informational": 2, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "W9006", + "severity": "WARN", + "message": "String length 78 exceeds maximum 63 for property 'BucketName'", + "source": "ENGINE", + "entity": { + "logicalId": "Bucket", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" + }, + "propertyPath": "Properties.BucketName", + "category": "Best Practice", + "startLine": 14, + "startColumn": 23, + "endLine": 14, + "endColumn": 34, + "ruleDescription": "String length estimation through Fn::Sub", + "phase": "LINT", "context": { - "lifecycle": "conditional-create-only" + "actualValue": "this-allowed-value-is-deliberately-longer-than-the-sixty-three-character-limit", + "extra": { + "actual_length": 78 + } } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'DBClusterIdentifier' is create-only; updating it will cause resource replacement", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "AuroraDB", + "logicalId": "Bucket", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.DBClusterIdentifier", + "propertyPath": "Properties.BucketName", "category": "Best Practice", - "startLine": 7, - "startColumn": 7, - "endLine": 7, - "endColumn": 26, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "startLine": 14, + "startColumn": 23, + "endLine": 14, + "endColumn": 34, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "parameter with AllowedValues" } }, - { - "ruleId": "I9003", - "severity": "INFO", - "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", - "source": "ENGINE", - "category": "Best Practice", - "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", - "phase": "LINT" - }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'AuroraDB' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "message": "Resource 'Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "AuroraDB", + "logicalId": "Bucket", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::S3::Bucket" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, + "startLine": 14, + "startColumn": 7, + "endLine": 14, + "endColumn": 18, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "bad/cloudfront_bad_alias.yaml": { - "filePath": "bad/cloudfront_bad_alias.yaml", + "bad/W9007_duplicate_objects_different_key_order.yaml": { + "filePath": "bad/W9007_duplicate_objects_different_key_order.yaml", "status": "OK", "metadata": { "resourcesScanned": 1, "counts": { - "fatal": 0, - "errors": 1, - "warnings": 0, - "informational": 1, + "fatal": 1, + "errors": 0, + "warnings": 1, + "informational": 3, "debug": 0 }, "suppressed": 0, @@ -11980,33 +13061,111 @@ }, "diagnostics": [ { - "ruleId": "E3013", - "severity": "ERROR", - "message": "CloudFront alias 'not a valid domain' is not a valid domain name", - "source": "CFN_LINT", + "ruleId": "F3037", + "severity": "FATAL", + "message": "Array items are not unique", + "source": "SCHEMA", "entity": { - "logicalId": "Dist", + "logicalId": "Task", "entityType": "Resource", - "resourceType": "AWS::CloudFront::Distribution" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.DistributionConfig.Aliases.0", - "category": "Resource", - "startLine": 8, - "startColumn": 13, - "endLine": 8, - "endColumn": 14, - "ruleDescription": "CloudFront Aliases", + "propertyPath": "Properties.PlacementConstraints", + "category": "Schema", + "startLine": 10, + "startColumn": 7, + "endLine": 10, + "endColumn": 27, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Array items not unique", + "phase": "SCHEMA", + "context": { + "actualValue": [ + { + "Type": "memberOf", + "Expression": "attribute:ecs.instance-type =~ t3.*" + }, + { + "Expression": "attribute:ecs.instance-type =~ t3.*", + "Type": "memberOf" + } + ] + } + }, + { + "ruleId": "W9007", + "severity": "WARN", + "message": "Array property 'PlacementConstraints' contains duplicate values", + "source": "ENGINE", + "entity": { + "logicalId": "Task", + "entityType": "Resource", + "resourceType": "AWS::ECS::TaskDefinition" + }, + "propertyPath": "Properties.PlacementConstraints", + "category": "Best Practice", + "startLine": 10, + "startColumn": 7, + "endLine": 10, + "endColumn": 27, + "ruleDescription": "Array items must be unique when required", "phase": "LINT" }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "Task", + "entityType": "Resource", + "resourceType": "AWS::ECS::TaskDefinition" + }, + "propertyPath": "Properties.ContainerDefinitions", + "category": "Best Practice", + "startLine": 6, + "startColumn": 7, + "endLine": 6, + "endColumn": 27, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'PlacementConstraints' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "Task", + "entityType": "Resource", + "resourceType": "AWS::ECS::TaskDefinition" + }, + "propertyPath": "Properties.PlacementConstraints", + "category": "Best Practice", + "startLine": 10, + "startColumn": 7, + "endLine": 10, + "endColumn": 27, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Dist' of type 'AWS::CloudFront::Distribution' supports Tags but none are configured", + "message": "Resource 'Task' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Dist", + "logicalId": "Task", "entityType": "Resource", - "resourceType": "AWS::CloudFront::Distribution" + "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", @@ -12020,15 +13179,15 @@ } ] }, - "bad/cloudfront_bad_origin.yaml": { - "filePath": "bad/cloudfront_bad_origin.yaml", + "bad/W9053_equivalent_conditions.yaml": { + "filePath": "bad/W9053_equivalent_conditions.yaml", "status": "OK", "metadata": { "resourcesScanned": 1, "counts": { "fatal": 0, - "errors": 1, - "warnings": 0, + "errors": 0, + "warnings": 2, "informational": 1, "debug": 0 }, @@ -12038,57 +13197,68 @@ }, "diagnostics": [ { - "ruleId": "E3057", - "severity": "ERROR", - "message": "TargetOriginId 'NonExistentOrigin' does not match any Origin Id in the distribution", + "ruleId": "W8001", + "severity": "WARN", + "message": "Condition 'IsProd' is not used by any resource or Fn::If", "source": "CFN_LINT", "entity": { - "logicalId": "Distribution", - "entityType": "Resource", - "resourceType": "AWS::CloudFront::Distribution" + "logicalId": "IsProd", + "entityType": "Condition" }, - "propertyPath": "Properties.DistributionConfig.DefaultCacheBehavior.TargetOriginId", - "suggestedFix": "Set TargetOriginId to match one of the Origin Ids defined in Origins", - "category": "Resource", - "startLine": 13, - "startColumn": 11, - "endLine": 13, - "endColumn": 25, - "ruleDescription": "Validate that CloudFront TargetOriginId is a specified Origin", + "propertyPath": "Conditions/IsProd", + "category": "Best Practice", + "startLine": 8, + "startColumn": 3, + "endLine": 8, + "endColumn": 9, + "ruleDescription": "Check if Conditions are Used", "phase": "LINT" }, + { + "ruleId": "W9053", + "severity": "WARN", + "message": "Condition 'IsProduction' is equivalent to condition 'IsProd' - consider consolidating", + "source": "ENGINE", + "category": "Best Practice", + "startLine": 6, + "startColumn": 3, + "endLine": 6, + "endColumn": 15, + "ruleDescription": "Conditions are semantically equivalent and can be consolidated", + "phase": "PARSE" + }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Distribution' of type 'AWS::CloudFront::Distribution' supports Tags but none are configured", + "message": "Resource 'Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Distribution", + "logicalId": "Bucket", "entityType": "Resource", - "resourceType": "AWS::CloudFront::Distribution" + "resourceType": "AWS::S3::Bucket" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, + "startLine": 11, + "startColumn": 3, + "endLine": 11, + "endColumn": 9, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "bad/codepipeline_bad_artifact_counts.yaml": { - "filePath": "bad/codepipeline_bad_artifact_counts.yaml", + "bad/aurora_with_allocated_storage.yaml": { + "filePath": "bad/aurora_with_allocated_storage.yaml", "status": "OK", "metadata": { "resourcesScanned": 1, "counts": { - "fatal": 1, - "errors": 1, + "fatal": 0, + "errors": 0, "warnings": 1, - "informational": 1, + "informational": 6, "debug": 0 }, "suppressed": 0, @@ -12097,76 +13267,130 @@ }, "diagnostics": [ { - "ruleId": "F3014", - "severity": "FATAL", - "message": "Exactly one of ['ArtifactStore', 'ArtifactStores'] must be specified", - "source": "SCHEMA", + "ruleId": "W9003", + "severity": "WARN", + "message": "100 is not of type 'string' - automatically coerced (number to string)", + "source": "CFN_LINT", "entity": { - "logicalId": "Pipeline", + "logicalId": "AuroraDB", "entityType": "Resource", - "resourceType": "AWS::CodePipeline::Pipeline" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties", - "category": "Schema", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-codepipeline", - "ruleDescription": "Exactly one of properties required (requiredXor)", + "propertyPath": "Properties.AllocatedStorage", + "category": "Best Practice", + "startLine": 9, + "startColumn": 7, + "endLine": 9, + "endColumn": 23, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Property type coercion warning", "phase": "SCHEMA" }, { - "ruleId": "E3702", - "severity": "ERROR", - "message": "Action 'BuildAction' (AWS/Build/CodeBuild) has 0 input artifacts, expected at least 1", + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "Pipeline", + "logicalId": "AuroraDB", "entityType": "Resource", - "resourceType": "AWS::CodePipeline::Pipeline" + "resourceType": "AWS::RDS::DBInstance" }, - "category": "Resource", + "category": "Best Practice", "startLine": 3, "startColumn": 3, "endLine": 3, "endColumn": 11, - "ruleDescription": "Validate the number of input and output artifacts in a CodePipeline", + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "W9002", - "severity": "WARN", - "message": "Property 'RoleArn' has a hardcoded ARN - use Ref, GetAtt, or a parameter instead", - "source": "ENGINE", + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "Pipeline", + "logicalId": "AuroraDB", "entityType": "Resource", - "resourceType": "AWS::CodePipeline::Pipeline" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.RoleArn", "category": "Best Practice", - "startLine": 6, - "startColumn": 7, - "endLine": 6, - "endColumn": 14, - "ruleDescription": "Hardcoded ARN property", + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 11, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'Pipeline' of type 'AWS::CodePipeline::Pipeline' supports Tags but none are configured", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Pipeline", + "logicalId": "AuroraDB", "entityType": "Resource", - "resourceType": "AWS::CodePipeline::Pipeline" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.Engine", "category": "Best Practice", - "startLine": 5, + "startLine": 6, + "startColumn": 7, + "endLine": 6, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'DBClusterIdentifier' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "AuroraDB", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.DBClusterIdentifier", + "category": "Best Practice", + "startLine": 7, + "startColumn": 7, + "endLine": 7, + "endColumn": 26, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9003", + "severity": "INFO", + "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", + "source": "ENGINE", + "category": "Best Practice", + "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'AuroraDB' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "AuroraDB", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 5, "startColumn": 5, "endLine": 5, "endColumn": 15, @@ -12175,15 +13399,132 @@ } ] }, - "bad/codepipeline_bad_artifacts.yaml": { - "filePath": "bad/codepipeline_bad_artifacts.yaml", + "bad/cloudfront_bad_alias.yaml": { + "filePath": "bad/cloudfront_bad_alias.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 1, + "warnings": 0, + "informational": 1, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "E3013", + "severity": "ERROR", + "message": "CloudFront alias 'not a valid domain' is not a valid domain name", + "source": "CFN_LINT", + "entity": { + "logicalId": "Dist", + "entityType": "Resource", + "resourceType": "AWS::CloudFront::Distribution" + }, + "propertyPath": "Properties.DistributionConfig.Aliases.0", + "category": "Resource", + "startLine": 8, + "startColumn": 13, + "endLine": 8, + "endColumn": 14, + "ruleDescription": "CloudFront Aliases", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Dist' of type 'AWS::CloudFront::Distribution' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "Dist", + "entityType": "Resource", + "resourceType": "AWS::CloudFront::Distribution" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "bad/cloudfront_bad_origin.yaml": { + "filePath": "bad/cloudfront_bad_origin.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 1, + "warnings": 0, + "informational": 1, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "E3057", + "severity": "ERROR", + "message": "TargetOriginId 'NonExistentOrigin' does not match any Origin Id in the distribution", + "source": "CFN_LINT", + "entity": { + "logicalId": "Distribution", + "entityType": "Resource", + "resourceType": "AWS::CloudFront::Distribution" + }, + "propertyPath": "Properties.DistributionConfig.DefaultCacheBehavior.TargetOriginId", + "suggestedFix": "Set TargetOriginId to match one of the Origin Ids defined in Origins", + "category": "Resource", + "startLine": 13, + "startColumn": 11, + "endLine": 13, + "endColumn": 25, + "ruleDescription": "Validate that CloudFront TargetOriginId is a specified Origin", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Distribution' of type 'AWS::CloudFront::Distribution' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "Distribution", + "entityType": "Resource", + "resourceType": "AWS::CloudFront::Distribution" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "bad/codepipeline_bad_artifact_counts.yaml": { + "filePath": "bad/codepipeline_bad_artifact_counts.yaml", "status": "OK", "metadata": { "resourcesScanned": 1, "counts": { "fatal": 1, "errors": 1, - "warnings": 2, + "warnings": 1, "informational": 1, "debug": 0 }, @@ -12213,9 +13554,9 @@ "phase": "SCHEMA" }, { - "ruleId": "E3701", + "ruleId": "E3702", "severity": "ERROR", - "message": "InputArtifact 'NonExistentArtifact' in stage 'Build' action 'BuildAction' does not reference a previously defined OutputArtifact", + "message": "Action 'BuildAction' (AWS/Build/CodeBuild) has 0 input artifacts, expected at least 1", "source": "CFN_LINT", "entity": { "logicalId": "Pipeline", @@ -12227,7 +13568,7 @@ "startColumn": 3, "endLine": 3, "endColumn": 11, - "ruleDescription": "Validate input and output artifact names are used properly", + "ruleDescription": "Validate the number of input and output artifacts in a CodePipeline", "phase": "LINT" }, { @@ -12249,24 +13590,6 @@ "ruleDescription": "Hardcoded ARN property", "phase": "LINT" }, - { - "ruleId": "W9013", - "severity": "WARN", - "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", - "source": "ENGINE", - "entity": { - "logicalId": "Pipeline", - "entityType": "Resource", - "resourceType": "AWS::CodePipeline::Pipeline" - }, - "category": "Security", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 11, - "ruleDescription": "Hardcoded account ID in ARN", - "phase": "LINT" - }, { "ruleId": "I9040", "severity": "INFO", @@ -12289,16 +13612,16 @@ } ] }, - "bad/conditions.yaml": { - "filePath": "bad/conditions.yaml", + "bad/codepipeline_bad_artifacts.yaml": { + "filePath": "bad/codepipeline_bad_artifacts.yaml", "status": "OK", "metadata": { - "resourcesScanned": 4, + "resourcesScanned": 1, "counts": { - "fatal": 5, - "errors": 7, - "warnings": 10, - "informational": 8, + "fatal": 1, + "errors": 1, + "warnings": 2, + "informational": 1, "debug": 0 }, "suppressed": 0, @@ -12307,45 +13630,159 @@ }, "diagnostics": [ { - "ruleId": "F3002", + "ruleId": "F3014", "severity": "FATAL", - "message": "Additional properties are not allowed ('BadKey' was unexpected)", + "message": "Exactly one of ['ArtifactStore', 'ArtifactStores'] must be specified", "source": "SCHEMA", "entity": { - "logicalId": "EC2Instance", + "logicalId": "Pipeline", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::CodePipeline::Pipeline" }, - "propertyPath": "Properties.Tags.1.BadKey", + "propertyPath": "Properties", "category": "Schema", - "startLine": 60, - "startColumn": 17, - "endLine": 60, - "endColumn": 18, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Additional properties are not allowed", - "phase": "SCHEMA", - "context": { - "property": "BadKey", - "extra": { - "allowed_properties": [ - "AdditionalInfo", - "Affinity", - "AvailabilityZone", - "BlockDeviceMappings", - "CpuOptions", - "CreditSpecification", - "DisableApiTermination", - "EbsOptimized", - "ElasticGpuSpecifications", - "ElasticInferenceAccelerators", - "EnclaveOptions", - "HibernationOptions", - "HostId", - "HostResourceGroupArn", - "IamInstanceProfile", - "ImageId", - "InstanceId", + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-codepipeline", + "ruleDescription": "Exactly one of properties required (requiredXor)", + "phase": "SCHEMA" + }, + { + "ruleId": "E3701", + "severity": "ERROR", + "message": "InputArtifact 'NonExistentArtifact' in stage 'Build' action 'BuildAction' does not reference a previously defined OutputArtifact", + "source": "CFN_LINT", + "entity": { + "logicalId": "Pipeline", + "entityType": "Resource", + "resourceType": "AWS::CodePipeline::Pipeline" + }, + "category": "Resource", + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 11, + "ruleDescription": "Validate input and output artifact names are used properly", + "phase": "LINT" + }, + { + "ruleId": "W9002", + "severity": "WARN", + "message": "Property 'RoleArn' has a hardcoded ARN - use Ref, GetAtt, or a parameter instead", + "source": "ENGINE", + "entity": { + "logicalId": "Pipeline", + "entityType": "Resource", + "resourceType": "AWS::CodePipeline::Pipeline" + }, + "propertyPath": "Properties.RoleArn", + "category": "Best Practice", + "startLine": 6, + "startColumn": 7, + "endLine": 6, + "endColumn": 14, + "ruleDescription": "Hardcoded ARN property", + "phase": "LINT" + }, + { + "ruleId": "W9013", + "severity": "WARN", + "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", + "source": "ENGINE", + "entity": { + "logicalId": "Pipeline", + "entityType": "Resource", + "resourceType": "AWS::CodePipeline::Pipeline" + }, + "category": "Security", + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 11, + "ruleDescription": "Hardcoded account ID in ARN", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Pipeline' of type 'AWS::CodePipeline::Pipeline' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "Pipeline", + "entityType": "Resource", + "resourceType": "AWS::CodePipeline::Pipeline" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "bad/conditions.yaml": { + "filePath": "bad/conditions.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 4, + "counts": { + "fatal": 5, + "errors": 7, + "warnings": 10, + "informational": 8, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "F3002", + "severity": "FATAL", + "message": "Additional properties are not allowed ('BadKey' was unexpected)", + "source": "SCHEMA", + "entity": { + "logicalId": "EC2Instance", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Properties.Tags.1.BadKey", + "category": "Schema", + "startLine": 60, + "startColumn": 17, + "endLine": 60, + "endColumn": 18, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Additional properties are not allowed", + "phase": "SCHEMA", + "context": { + "property": "BadKey", + "extra": { + "allowed_properties": [ + "AdditionalInfo", + "Affinity", + "AvailabilityZone", + "BlockDeviceMappings", + "CpuOptions", + "CreditSpecification", + "DisableApiTermination", + "EbsOptimized", + "ElasticGpuSpecifications", + "ElasticInferenceAccelerators", + "EnclaveOptions", + "HibernationOptions", + "HostId", + "HostResourceGroupArn", + "IamInstanceProfile", + "ImageId", + "InstanceId", "InstanceInitiatedShutdownBehavior", "InstanceType", "Ipv6AddressCount", @@ -17508,1341 +18945,71 @@ "entityType": "Resource", "resourceType": "AWS::AutoScaling::AutoScalingGroup" }, - "propertyPath": "Properties.MaxSize", - "category": "Resource", - "startLine": 9, - "startColumn": 7, - "endLine": 9, - "endColumn": 14, - "ruleDescription": "MaxSize must be greater than or equal to MinSize", - "phase": "LINT" - }, - { - "ruleId": "W3697", - "severity": "WARN", - "message": "Resource type 'AWS::AutoScaling::LaunchConfiguration' is from a service in maintenance mode since 2024-10-01. Consider migrating to an alternative", - "source": "CFN_LINT", - "entity": { - "logicalId": "LC", - "entityType": "Resource", - "resourceType": "AWS::AutoScaling::LaunchConfiguration" - }, - "category": "Deprecation", - "startLine": 11, - "startColumn": 3, - "endLine": 11, - "endColumn": 5, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", - "ruleDescription": "Resource type is from a service in maintenance mode", - "phase": "SCHEMA" - }, - { - "ruleId": "W9003", - "severity": "WARN", - "message": "10 is not of type 'string' - automatically coerced (number to string)", - "source": "CFN_LINT", - "entity": { - "logicalId": "BadASG", - "entityType": "Resource", - "resourceType": "AWS::AutoScaling::AutoScalingGroup" - }, - "propertyPath": "Properties.MinSize", - "category": "Best Practice", - "startLine": 8, - "startColumn": 7, - "endLine": 8, - "endColumn": 14, - "ruleDescription": "Property type coercion warning", - "phase": "SCHEMA" - }, - { - "ruleId": "W9003", - "severity": "WARN", - "message": "5 is not of type 'string' - automatically coerced (number to string)", - "source": "CFN_LINT", - "entity": { - "logicalId": "BadASG", - "entityType": "Resource", - "resourceType": "AWS::AutoScaling::AutoScalingGroup" - }, - "propertyPath": "Properties.MaxSize", - "category": "Best Practice", - "startLine": 9, - "startColumn": 7, - "endLine": 9, - "endColumn": 14, - "ruleDescription": "Property type coercion warning", - "phase": "SCHEMA" - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "BadValkey", - "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" - }, - "category": "Best Practice", - "startLine": 67, - "startColumn": 3, - "endLine": 67, - "endColumn": 12, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "BadValkey", - "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" - }, - "category": "Best Practice", - "startLine": 67, - "startColumn": 3, - "endLine": 67, - "endColumn": 12, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I3042", - "severity": "INFO", - "message": "ARN in Resource BadEnvLambda contains hardcoded Partition in ARN or incorrectly placed Pseudo Parameters", - "source": "CFN_LINT", - "entity": { - "logicalId": "BadEnvLambda", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "Properties.Role.Fn::Sub", - "category": "Best Practice", - "startLine": 45, - "startColumn": 7, - "endLine": 45, - "endColumn": 14, - "ruleDescription": "ARNs should use correctly placed Pseudo Parameters", - "phase": "LINT" - }, - { - "ruleId": "I3042", - "severity": "INFO", - "message": "ARN in Resource BadImageLambda contains hardcoded Partition in ARN or incorrectly placed Pseudo Parameters", - "source": "CFN_LINT", - "entity": { - "logicalId": "BadImageLambda", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "Properties.Role.Fn::Sub", - "category": "Best Practice", - "startLine": 58, - "startColumn": 7, - "endLine": 58, - "endColumn": 14, - "ruleDescription": "ARNs should use correctly placed Pseudo Parameters", - "phase": "LINT" - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'LaunchConfigurationName' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "BadASG", - "entityType": "Resource", - "resourceType": "AWS::AutoScaling::AutoScalingGroup" - }, - "propertyPath": "Properties.LaunchConfigurationName", - "category": "Best Practice", - "startLine": 10, - "startColumn": 7, - "endLine": 10, - "endColumn": 30, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only", - "resolutionSource": "Ref to 'LC'" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "LC", - "entityType": "Resource", - "resourceType": "AWS::AutoScaling::LaunchConfiguration" - }, - "propertyPath": "Properties.ImageId", - "category": "Best Practice", - "startLine": 14, - "startColumn": 7, - "endLine": 14, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'InstanceType' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "LC", - "entityType": "Resource", - "resourceType": "AWS::AutoScaling::LaunchConfiguration" - }, - "propertyPath": "Properties.InstanceType", - "category": "Best Practice", - "startLine": 15, - "startColumn": 7, - "endLine": 15, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'LoadBalancerArn' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "BadListener", - "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancingV2::Listener" - }, - "propertyPath": "Properties.LoadBalancerArn", - "category": "Best Practice", - "startLine": 20, - "startColumn": 7, - "endLine": 20, - "endColumn": 22, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-elasticloadbalancingv2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'ALB'" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Port' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "TG", - "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancingV2::TargetGroup" - }, - "propertyPath": "Properties.Port", - "category": "Best Practice", - "startLine": 35, - "startColumn": 7, - "endLine": 35, - "endColumn": 11, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Protocol' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "TG", - "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancingV2::TargetGroup" - }, - "propertyPath": "Properties.Protocol", - "category": "Best Practice", - "startLine": 36, - "startColumn": 7, - "endLine": 36, - "endColumn": 15, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "TG", - "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancingV2::TargetGroup" - }, - "propertyPath": "Properties.VpcId", - "category": "Best Practice", - "startLine": 37, - "startColumn": 7, - "endLine": 37, - "endColumn": 12, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "BadEnvLambda", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "Properties.FunctionName", - "category": "Best Practice", - "startLine": 42, - "startColumn": 7, - "endLine": 42, - "endColumn": 19, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "BadImageLambda", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "Properties.FunctionName", - "category": "Best Practice", - "startLine": 55, - "startColumn": 7, - "endLine": 55, - "endColumn": 19, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'PackageType' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "BadImageLambda", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "Properties.PackageType", - "category": "Best Practice", - "startLine": 56, - "startColumn": 7, - "endLine": 56, - "endColumn": 18, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'LaunchType' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "BadFargateService", - "entityType": "Resource", - "resourceType": "AWS::ECS::Service" - }, - "propertyPath": "Properties.LaunchType", - "category": "Best Practice", - "startLine": 76, - "startColumn": 7, - "endLine": 76, - "endColumn": 17, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "TaskDef", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.NetworkMode", - "category": "Best Practice", - "startLine": 88, - "startColumn": 7, - "endLine": 88, - "endColumn": 18, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "TaskDef", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.RequiresCompatibilities", - "category": "Best Practice", - "startLine": 89, - "startColumn": 7, - "endLine": 89, - "endColumn": 30, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "TaskDef", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.Cpu", - "category": "Best Practice", - "startLine": 91, - "startColumn": 7, - "endLine": 91, - "endColumn": 10, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Memory' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "TaskDef", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.Memory", - "category": "Best Practice", - "startLine": 92, - "startColumn": 7, - "endLine": 92, - "endColumn": 13, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "TaskDef", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.ContainerDefinitions", - "category": "Best Practice", - "startLine": 93, - "startColumn": 7, - "endLine": 93, - "endColumn": 27, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'BadASG' of type 'AWS::AutoScaling::AutoScalingGroup' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "BadASG", - "entityType": "Resource", - "resourceType": "AWS::AutoScaling::AutoScalingGroup" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 7, - "startColumn": 5, - "endLine": 7, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'BadListener' of type 'AWS::ElasticLoadBalancingV2::Listener' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "BadListener", - "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancingV2::Listener" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 19, - "startColumn": 5, - "endLine": 19, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'ALB' of type 'AWS::ElasticLoadBalancingV2::LoadBalancer' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "ALB", - "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancingV2::LoadBalancer" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 28, - "startColumn": 5, - "endLine": 28, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'TG' of type 'AWS::ElasticLoadBalancingV2::TargetGroup' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "TG", - "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancingV2::TargetGroup" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 34, - "startColumn": 5, - "endLine": 34, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'BadEnvLambda' of type 'AWS::Lambda::Function' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "BadEnvLambda", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 41, - "startColumn": 5, - "endLine": 41, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'BadImageLambda' of type 'AWS::Lambda::Function' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "BadImageLambda", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 54, - "startColumn": 5, - "endLine": 54, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'BadRestApi' of type 'AWS::ApiGateway::RestApi' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "BadRestApi", - "entityType": "Resource", - "resourceType": "AWS::ApiGateway::RestApi" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 64, - "startColumn": 5, - "endLine": 64, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'BadValkey' of type 'AWS::ElastiCache::ReplicationGroup' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "BadValkey", - "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 69, - "startColumn": 5, - "endLine": 69, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'BadFargateService' of type 'AWS::ECS::Service' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "BadFargateService", - "entityType": "Resource", - "resourceType": "AWS::ECS::Service" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 75, - "startColumn": 5, - "endLine": 75, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'TaskDef' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "TaskDef", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 87, - "startColumn": 5, - "endLine": 87, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "bad/deprecated_type.yaml": { - "filePath": "bad/deprecated_type.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 1, - "informational": 2, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "W9009", - "severity": "WARN", - "message": "Resource type 'AWS::SDB::Domain' is deprecated - consider using a newer alternative", - "source": "ENGINE", - "entity": { - "logicalId": "Domain", - "entityType": "Resource", - "resourceType": "AWS::SDB::Domain" - }, - "suggestedFix": "Replace AWS::SDB::Domain with a supported alternative", - "category": "Deprecation", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 9, - "ruleDescription": "Resource type sunset or shutdown", - "phase": "LINT", - "context": { - "lifecycle": "deprecated" - } - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "Domain", - "entityType": "Resource", - "resourceType": "AWS::SDB::Domain" - }, - "category": "Best Practice", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 9, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "Domain", - "entityType": "Resource", - "resourceType": "AWS::SDB::Domain" - }, - "category": "Best Practice", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 9, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - } - ] - }, - "bad/duplicate.json": { - "filePath": "bad/duplicate.json", - "status": "OK", - "metadata": { - "resourcesScanned": 2, - "counts": { - "fatal": 3, - "errors": 0, - "warnings": 0, - "informational": 3, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "F0000", - "severity": "FATAL", - "message": "Duplicate key 'MySNSTopic'", - "source": "SCHEMA", - "entity": { - "logicalId": "MySNSTopic", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" - }, - "propertyPath": "Resources/MySNSTopic", - "category": "Structure", - "startLine": 5, - "startColumn": 3, - "endLine": 5, - "endColumn": 14, - "ruleDescription": "Duplicate key in template", - "phase": "PARSE" - }, - { - "ruleId": "F0000", - "severity": "FATAL", - "message": "Duplicate key 'MySNSTopic'", - "source": "SCHEMA", - "entity": { - "logicalId": "MySNSTopic", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" - }, - "propertyPath": "Resources/MySNSTopic", - "category": "Structure", - "startLine": 17, - "startColumn": 3, - "endLine": 17, - "endColumn": 14, - "ruleDescription": "Duplicate key in template", - "phase": "PARSE" - }, - { - "ruleId": "F0000", - "severity": "FATAL", - "message": "Duplicate key 'MySNSTopic'", - "source": "SCHEMA", - "entity": { - "logicalId": "MySNSTopic", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" - }, - "propertyPath": "Resources/MySNSTopic", - "category": "Structure", - "startLine": 23, - "startColumn": 3, - "endLine": 23, - "endColumn": 14, - "ruleDescription": "Duplicate key in template", - "phase": "PARSE" - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'TopicName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "MySNSTopic", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" - }, - "propertyPath": "Properties.TopicName", - "category": "Best Practice", - "startLine": 26, - "startColumn": 6, - "endLine": 26, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sns", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'MyEipNat' of type 'AWS::EC2::EIP' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "MyEipNat", - "entityType": "Resource", - "resourceType": "AWS::EC2::EIP" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 13, - "startColumn": 4, - "endLine": 13, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'MySNSTopic' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "MySNSTopic", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 25, - "startColumn": 4, - "endLine": 25, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "bad/duplicate.yaml": { - "filePath": "bad/duplicate.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 2, - "counts": { - "fatal": 3, - "errors": 1, - "warnings": 0, - "informational": 2, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "F0000", - "severity": "FATAL", - "message": "Duplicate key 'mySnsTopic'", - "source": "SCHEMA", - "entity": { - "logicalId": "mySnsTopic", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" - }, - "propertyPath": "Resources/mySnsTopic", - "category": "Structure", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 13, - "ruleDescription": "Duplicate key in template", - "phase": "PARSE" - }, - { - "ruleId": "F0000", - "severity": "FATAL", - "message": "Duplicate key 'mySnsTopic'", - "source": "SCHEMA", - "entity": { - "logicalId": "mySnsTopic", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" - }, - "propertyPath": "Resources/mySnsTopic", - "category": "Structure", - "startLine": 9, - "startColumn": 3, - "endLine": 9, - "endColumn": 13, - "ruleDescription": "Duplicate key in template", - "phase": "PARSE" - }, - { - "ruleId": "F0000", - "severity": "FATAL", - "message": "Duplicate key 'mySnsTopic'", - "source": "SCHEMA", - "entity": { - "logicalId": "mySnsTopic", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" - }, - "propertyPath": "Resources/mySnsTopic", - "category": "Structure", - "startLine": 13, - "startColumn": 3, - "endLine": 13, - "endColumn": 13, - "ruleDescription": "Duplicate key in template", - "phase": "PARSE" - }, - { - "ruleId": "E3001", - "severity": "ERROR", - "message": "Resource 'mySnsTopic' has invalid property 'Parameters'. Valid resource attributes: Type, Properties, DependsOn, Condition, Metadata, DeletionPolicy, UpdateReplacePolicy, UpdatePolicy, CreationPolicy, Fn::Transform, Version", - "source": "CFN_LINT", - "entity": { - "logicalId": "mySnsTopic", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" - }, - "category": "Resource", - "startLine": 15, - "startColumn": 5, - "endLine": 15, - "endColumn": 15, - "ruleDescription": "Basic CloudFormation Resource Check", - "phase": "PARSE" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'myS3Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "myS3Bucket", - "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 7, - "startColumn": 3, - "endLine": 7, - "endColumn": 13, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'mySnsTopic' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "mySnsTopic", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 13, - "startColumn": 3, - "endLine": 13, - "endColumn": 13, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "bad/duplicate_primary_id.yaml": { - "filePath": "bad/duplicate_primary_id.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 2, - "counts": { - "fatal": 0, - "errors": 2, - "warnings": 0, - "informational": 4, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "E3019", - "severity": "ERROR", - "message": "Primary identifiers {'BucketName': 'my-duplicate-bucket'} should have unique values across the resources {'BucketA', 'BucketB'}", - "source": "CFN_LINT", - "entity": { - "logicalId": "BucketA", - "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" - }, - "propertyPath": "Properties.BucketName", - "category": "Resource", - "startLine": 6, - "startColumn": 7, - "endLine": 6, - "endColumn": 17, - "ruleDescription": "Validate that all resources have unique primary identifiers", - "phase": "LINT" - }, - { - "ruleId": "E3019", - "severity": "ERROR", - "message": "Primary identifiers {'BucketName': 'my-duplicate-bucket'} should have unique values across the resources {'BucketA', 'BucketB'}", - "source": "CFN_LINT", - "entity": { - "logicalId": "BucketB", - "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" - }, - "propertyPath": "Properties.BucketName", - "category": "Resource", - "startLine": 10, - "startColumn": 7, - "endLine": 10, - "endColumn": 17, - "ruleDescription": "Validate that all resources have unique primary identifiers", - "phase": "LINT" - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "BucketA", - "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" - }, - "propertyPath": "Properties.BucketName", - "category": "Best Practice", - "startLine": 6, - "startColumn": 7, - "endLine": 6, - "endColumn": 17, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "BucketB", - "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" - }, - "propertyPath": "Properties.BucketName", - "category": "Best Practice", - "startLine": 10, - "startColumn": 7, - "endLine": 10, - "endColumn": 17, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'BucketA' of type 'AWS::S3::Bucket' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "BucketA", - "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'BucketB' of type 'AWS::S3::Bucket' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "BucketB", - "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 9, - "startColumn": 5, - "endLine": 9, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "bad/duplicate_primary_id_multi.yaml": { - "filePath": "bad/duplicate_primary_id_multi.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 2, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 4, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "BucketA", - "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" - }, - "propertyPath": "Properties.BucketName", - "category": "Best Practice", - "startLine": 11, - "startColumn": 7, - "endLine": 11, - "endColumn": 17, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Fn::If on condition 'IsA'" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "BucketB", - "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" - }, - "propertyPath": "Properties.BucketName", - "category": "Best Practice", - "startLine": 15, + "propertyPath": "Properties.MaxSize", + "category": "Resource", + "startLine": 9, "startColumn": 7, - "endLine": 15, - "endColumn": 17, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Fn::If on condition 'IsA'" - } + "endLine": 9, + "endColumn": 14, + "ruleDescription": "MaxSize must be greater than or equal to MinSize", + "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'BucketA' of type 'AWS::S3::Bucket' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W3697", + "severity": "WARN", + "message": "Resource type 'AWS::AutoScaling::LaunchConfiguration' is from a service in maintenance mode since 2024-10-01. Consider migrating to an alternative", + "source": "CFN_LINT", "entity": { - "logicalId": "BucketA", + "logicalId": "LC", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::AutoScaling::LaunchConfiguration" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 10, - "startColumn": 5, - "endLine": 10, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "category": "Deprecation", + "startLine": 11, + "startColumn": 3, + "endLine": 11, + "endColumn": 5, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", + "ruleDescription": "Resource type is from a service in maintenance mode", + "phase": "SCHEMA" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'BucketB' of type 'AWS::S3::Bucket' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W9003", + "severity": "WARN", + "message": "10 is not of type 'string' - automatically coerced (number to string)", + "source": "CFN_LINT", "entity": { - "logicalId": "BucketB", + "logicalId": "BadASG", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::AutoScaling::AutoScalingGroup" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.MinSize", "category": "Best Practice", - "startLine": 14, - "startColumn": 5, - "endLine": 14, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "bad/dynamodb_attribute_mismatch.yaml": { - "filePath": "bad/dynamodb_attribute_mismatch.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 0, - "informational": 5, - "debug": 0 + "startLine": 8, + "startColumn": 7, + "endLine": 8, + "endColumn": 14, + "ruleDescription": "Property type coercion warning", + "phase": "SCHEMA" }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "E3039", - "severity": "ERROR", - "message": "AttributeDefinitions does not match KeySchema attributes. missing definitions: [sk]", + "ruleId": "W9003", + "severity": "WARN", + "message": "5 is not of type 'string' - automatically coerced (number to string)", "source": "CFN_LINT", "entity": { - "logicalId": "BadTable", + "logicalId": "BadASG", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::AutoScaling::AutoScalingGroup" }, - "propertyPath": "Properties", - "category": "Resource", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "AttributeDefinitions / KeySchemas mismatch", - "phase": "LINT" + "propertyPath": "Properties.MaxSize", + "category": "Best Practice", + "startLine": 9, + "startColumn": 7, + "endLine": 9, + "endColumn": 14, + "ruleDescription": "Property type coercion warning", + "phase": "SCHEMA" }, { "ruleId": "I3011", @@ -18850,15 +19017,15 @@ "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "BadTable", + "logicalId": "BadValkey", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::ElastiCache::ReplicationGroup" }, "category": "Best Practice", - "startLine": 3, + "startLine": 67, "startColumn": 3, - "endLine": 3, - "endColumn": 11, + "endLine": 67, + "endColumn": 12, "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, @@ -18868,135 +19035,119 @@ "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "BadTable", + "logicalId": "BadValkey", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::ElastiCache::ReplicationGroup" }, "category": "Best Practice", - "startLine": 3, + "startLine": 67, "startColumn": 3, - "endLine": 3, - "endColumn": 11, + "endLine": 67, + "endColumn": 12, "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3042", "severity": "INFO", - "message": "Property 'TableName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "ARN in Resource BadEnvLambda contains hardcoded Partition in ARN or incorrectly placed Pseudo Parameters", + "source": "CFN_LINT", "entity": { - "logicalId": "BadTable", + "logicalId": "BadEnvLambda", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.TableName", + "propertyPath": "Properties.Role.Fn::Sub", "category": "Best Practice", - "startLine": 6, + "startLine": 45, "startColumn": 7, - "endLine": 6, - "endColumn": 16, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "endLine": 45, + "endColumn": 14, + "ruleDescription": "ARNs should use correctly placed Pseudo Parameters", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3042", "severity": "INFO", - "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "message": "ARN in Resource BadImageLambda contains hardcoded Partition in ARN or incorrectly placed Pseudo Parameters", + "source": "CFN_LINT", "entity": { - "logicalId": "BadTable", + "logicalId": "BadImageLambda", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.KeySchema", + "propertyPath": "Properties.Role.Fn::Sub", "category": "Best Practice", - "startLine": 11, + "startLine": 58, "startColumn": 7, - "endLine": 11, - "endColumn": 16, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "endLine": 58, + "endColumn": 14, + "ruleDescription": "ARNs should use correctly placed Pseudo Parameters", + "phase": "LINT" }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'BadTable' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", + "message": "Property 'LaunchConfigurationName' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "BadTable", + "logicalId": "BadASG", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::AutoScaling::AutoScalingGroup" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.LaunchConfigurationName", "category": "Best Practice", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "bad/dynamodb_prod_no_kms.yaml": { - "filePath": "bad/dynamodb_prod_no_kms.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 3, - "debug": 0 + "startLine": 10, + "startColumn": 7, + "endLine": 10, + "endColumn": 30, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only", + "resolutionSource": "Ref to 'LC'" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ProdTable", + "logicalId": "LC", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::AutoScaling::LaunchConfiguration" }, + "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 12, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 14, + "startColumn": 7, + "endLine": 14, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'TableName' is create-only; updating it will cause resource replacement", + "message": "Property 'InstanceType' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ProdTable", + "logicalId": "LC", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::AutoScaling::LaunchConfiguration" }, - "propertyPath": "Properties.TableName", + "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 7, + "startLine": 15, "startColumn": 7, - "endLine": 7, - "endColumn": 16, + "endLine": 15, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -19006,136 +19157,131 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'LoadBalancerArn' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ProdTable", + "logicalId": "BadListener", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::ElasticLoadBalancingV2::Listener" }, - "propertyPath": "Properties.KeySchema", + "propertyPath": "Properties.LoadBalancerArn", "category": "Best Practice", - "startLine": 11, + "startLine": 20, "startColumn": 7, - "endLine": 11, - "endColumn": 16, + "endLine": 20, + "endColumn": 22, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-elasticloadbalancingv2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'ALB'" } - } - ] - }, - "bad/dynamodb_provisioned_no_throughput.yaml": { - "filePath": "bad/dynamodb_provisioned_no_throughput.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 1, - "errors": 1, - "warnings": 0, - "informational": 5, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "F3003", - "severity": "FATAL", - "message": "'ProvisionedThroughput' is a required property (from extension)", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Port' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "DDBTable", + "logicalId": "TG", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::ElasticLoadBalancingV2::TargetGroup" }, - "propertyPath": "Properties", - "suggestedFix": "Add 'ProvisionedThroughput'", - "category": "Schema", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "Required property missing", - "phase": "SCHEMA" + "propertyPath": "Properties.Port", + "category": "Best Practice", + "startLine": 35, + "startColumn": 7, + "endLine": 35, + "endColumn": 11, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "E3639", - "severity": "ERROR", - "message": "ProvisionedThroughput is required when BillingMode is 'PROVISIONED'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Protocol' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "DDBTable", + "logicalId": "TG", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::ElasticLoadBalancingV2::TargetGroup" }, - "propertyPath": "Properties.ProvisionedThroughput", - "suggestedFix": "Add ProvisionedThroughput or set BillingMode to 'PAY_PER_REQUEST'", - "category": "Resource", - "startLine": 5, - "startColumn": 5, - "endLine": 5, + "propertyPath": "Properties.Protocol", + "category": "Best Practice", + "startLine": 36, + "startColumn": 7, + "endLine": 36, "endColumn": 15, - "ruleDescription": "Validate DynamoDB table ProvisionedThroughput is set when BillingMode is PROVISIONED", - "phase": "LINT" + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "DDBTable", + "logicalId": "TG", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::ElasticLoadBalancingV2::TargetGroup" }, + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 11, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 37, + "startColumn": 7, + "endLine": 37, + "endColumn": 12, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "DDBTable", + "logicalId": "BadEnvLambda", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::Lambda::Function" }, + "propertyPath": "Properties.FunctionName", "category": "Best Practice", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 11, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 42, + "startColumn": 7, + "endLine": 42, + "endColumn": 19, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'TableName' is create-only; updating it will cause resource replacement", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DDBTable", + "logicalId": "BadImageLambda", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.TableName", + "propertyPath": "Properties.FunctionName", "category": "Best Practice", - "startLine": 6, + "startLine": 55, "startColumn": 7, - "endLine": 6, - "endColumn": 16, + "endLine": 55, + "endColumn": 19, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -19145,159 +19291,132 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'PackageType' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DDBTable", + "logicalId": "BadImageLambda", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.KeySchema", + "propertyPath": "Properties.PackageType", "category": "Best Practice", - "startLine": 11, + "startLine": 56, "startColumn": 7, - "endLine": 11, - "endColumn": 16, + "endLine": 56, + "endColumn": 18, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only" } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'DDBTable' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", + "message": "Property 'LaunchType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DDBTable", + "logicalId": "BadFargateService", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::ECS::Service" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.LaunchType", "category": "Best Practice", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "bad/ecr_policy_no_statement.yaml": { - "filePath": "bad/ecr_policy_no_statement.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 0, - "informational": 1, - "debug": 0 + "startLine": 76, + "startColumn": 7, + "endLine": 76, + "endColumn": 17, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "E3513", - "severity": "ERROR", - "message": "ECR repository policy must have a Statement property", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Repo", + "logicalId": "TaskDef", "entityType": "Resource", - "resourceType": "AWS::ECR::Repository" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.RepositoryPolicyText", - "suggestedFix": "Add a Statement array to the RepositoryPolicyText", - "category": "Resource", - "startLine": 6, + "propertyPath": "Properties.NetworkMode", + "category": "Best Practice", + "startLine": 88, "startColumn": 7, - "endLine": 6, - "endColumn": 27, - "ruleDescription": "Validate ECR repository policy", - "phase": "LINT" + "endLine": 88, + "endColumn": 18, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'Repo' of type 'AWS::ECR::Repository' supports Tags but none are configured", + "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Repo", + "logicalId": "TaskDef", "entityType": "Resource", - "resourceType": "AWS::ECR::Repository" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "bad/ecs_awsvpc_port_mismatch.yaml": { - "filePath": "bad/ecs_awsvpc_port_mismatch.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 0, - "informational": 3, - "debug": 0 + "startLine": 89, + "startColumn": 7, + "endLine": 89, + "endColumn": 30, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "E3053", - "severity": "ERROR", - "message": "HostPort 8080 must equal ContainerPort 80 when NetworkMode is awsvpc", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Task", + "logicalId": "TaskDef", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.ContainerDefinitions[0].PortMappings[0].HostPort", - "suggestedFix": "Set HostPort equal to ContainerPort or remove HostPort", - "category": "Resource", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "Validate ECS task definition has correct values for HostPort", - "phase": "LINT" + "propertyPath": "Properties.Cpu", + "category": "Best Practice", + "startLine": 91, + "startColumn": 7, + "endLine": 91, + "endColumn": 10, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", + "message": "Property 'Memory' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Task", + "logicalId": "TaskDef", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.NetworkMode", + "propertyPath": "Properties.Memory", "category": "Best Practice", - "startLine": 6, + "startLine": 92, "startColumn": 7, - "endLine": 6, - "endColumn": 18, + "endLine": 92, + "endColumn": 13, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", @@ -19311,15 +19430,15 @@ "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Task", + "logicalId": "TaskDef", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 7, + "startLine": 93, "startColumn": 7, - "endLine": 7, + "endLine": 93, "endColumn": 27, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -19331,203 +19450,159 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Task' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", + "message": "Resource 'BadASG' of type 'AWS::AutoScaling::AutoScalingGroup' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Task", + "logicalId": "BadASG", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::AutoScaling::AutoScalingGroup" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 5, + "startLine": 7, "startColumn": 5, - "endLine": 5, + "endLine": 7, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" - } - ] - }, - "bad/ecs_dynamic_port_no_traffic.yaml": { - "filePath": "bad/ecs_dynamic_port_no_traffic.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 3, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 1, - "informational": 7, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "E1151", - "severity": "ERROR", - "message": "'vpc-12345' does not match format 'AWS::EC2::VPC.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'BadListener' of type 'AWS::ElasticLoadBalancingV2::Listener' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "TargetGroup", + "logicalId": "BadListener", "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancingV2::TargetGroup" + "resourceType": "AWS::ElasticLoadBalancingV2::Listener" }, - "propertyPath": "Properties.VpcId", - "category": "Intrinsic Function", - "startLine": 17, - "startColumn": 7, - "endLine": 17, - "endColumn": 12, - "ruleDescription": "Validate VPC id format", - "phase": "SCHEMA", - "context": { - "actualValue": "vpc-12345" - } + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 19, + "startColumn": 5, + "endLine": 19, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "W3049", - "severity": "WARN", - "message": "Container 'app' uses dynamic host port 0, so each task registers on an ephemeral port, but TargetGroup 'TargetGroup' health-checks the fixed port '8080'. The health check will not follow the traffic port unless '8080' is separately served on every target. Use HealthCheckPort 'traffic-port' to health-check the port each target actually receives traffic on", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'ALB' of type 'AWS::ElasticLoadBalancingV2::LoadBalancer' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "TargetGroup", + "logicalId": "ALB", "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancingV2::TargetGroup" + "resourceType": "AWS::ElasticLoadBalancingV2::LoadBalancer" }, - "propertyPath": "Properties.HealthCheckPort", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 18, - "startColumn": 7, - "endLine": 18, - "endColumn": 22, - "relatedResources": [ - { - "resource": { - "id": "Service", - "resourceType": "AWS::ECS::Service" - }, - "location": { - "startLine": 23, - "startColumn": 7, - "endLine": 23, - "endColumn": 20 - }, - "message": "Dynamic host port defined here" - } - ], - "ruleDescription": "ELB target group health check uses a fixed port that will not follow an ECS dynamic host port", + "startLine": 28, + "startColumn": 5, + "endLine": 28, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", + "message": "Resource 'TG' of type 'AWS::ElasticLoadBalancingV2::TargetGroup' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "TaskDef", + "logicalId": "TG", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::ElasticLoadBalancingV2::TargetGroup" }, - "propertyPath": "Properties.ContainerDefinitions", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 6, - "startColumn": 7, - "endLine": 6, - "endColumn": 27, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 34, + "startColumn": 5, + "endLine": 34, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Port' is create-only; updating it will cause resource replacement", + "message": "Resource 'BadEnvLambda' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "TargetGroup", + "logicalId": "BadEnvLambda", "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancingV2::TargetGroup" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.Port", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 15, - "startColumn": 7, - "endLine": 15, - "endColumn": 11, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 41, + "startColumn": 5, + "endLine": 41, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Protocol' is create-only; updating it will cause resource replacement", + "message": "Resource 'BadImageLambda' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "TargetGroup", + "logicalId": "BadImageLambda", "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancingV2::TargetGroup" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.Protocol", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 16, - "startColumn": 7, - "endLine": 16, + "startLine": 54, + "startColumn": 5, + "endLine": 54, "endColumn": 15, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "message": "Resource 'BadRestApi' of type 'AWS::ApiGateway::RestApi' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "TargetGroup", + "logicalId": "BadRestApi", "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancingV2::TargetGroup" + "resourceType": "AWS::ApiGateway::RestApi" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 17, - "startColumn": 7, - "endLine": 17, - "endColumn": 12, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 64, + "startColumn": 5, + "endLine": 64, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'TaskDef' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", + "message": "Resource 'BadValkey' of type 'AWS::ElastiCache::ReplicationGroup' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "TaskDef", + "logicalId": "BadValkey", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::ElastiCache::ReplicationGroup" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 5, + "startLine": 69, "startColumn": 5, - "endLine": 5, + "endLine": 69, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -19535,19 +19610,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'TargetGroup' of type 'AWS::ElasticLoadBalancingV2::TargetGroup' supports Tags but none are configured", + "message": "Resource 'BadFargateService' of type 'AWS::ECS::Service' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "TargetGroup", + "logicalId": "BadFargateService", "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancingV2::TargetGroup" + "resourceType": "AWS::ECS::Service" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 14, + "startLine": 75, "startColumn": 5, - "endLine": 14, + "endLine": 75, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -19555,35 +19630,35 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Service' of type 'AWS::ECS::Service' supports Tags but none are configured", + "message": "Resource 'TaskDef' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Service", + "logicalId": "TaskDef", "entityType": "Resource", - "resourceType": "AWS::ECS::Service" + "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 21, + "startLine": 87, "startColumn": 5, - "endLine": 21, + "endLine": 87, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "bad/ecs_fargate_mismatch.yaml": { - "filePath": "bad/ecs_fargate_mismatch.yaml", + "bad/deprecated_type.yaml": { + "filePath": "bad/deprecated_type.yaml", "status": "OK", "metadata": { - "resourcesScanned": 2, + "resourcesScanned": 1, "counts": { "fatal": 0, - "errors": 1, - "warnings": 0, - "informational": 8, + "errors": 0, + "warnings": 1, + "informational": 2, "debug": 0 }, "suppressed": 0, @@ -19592,44 +19667,156 @@ }, "diagnostics": [ { - "ruleId": "E1154", - "severity": "ERROR", - "message": "'subnet-123' does not match format 'AWS::EC2::Subnet.Id'", - "source": "CFN_LINT", + "ruleId": "W9009", + "severity": "WARN", + "message": "Resource type 'AWS::SDB::Domain' is deprecated - consider using a newer alternative", + "source": "ENGINE", "entity": { - "logicalId": "Service", + "logicalId": "Domain", "entityType": "Resource", - "resourceType": "AWS::ECS::Service" + "resourceType": "AWS::SDB::Domain" }, - "propertyPath": "Properties.NetworkConfiguration.AwsvpcConfiguration.Subnets.0", - "category": "Intrinsic Function", - "startLine": 22, - "startColumn": 15, - "endLine": 22, - "endColumn": 16, - "ruleDescription": "Validate VPC subnet id format", - "phase": "SCHEMA", + "suggestedFix": "Replace AWS::SDB::Domain with a supported alternative", + "category": "Deprecation", + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 9, + "ruleDescription": "Resource type sunset or shutdown", + "phase": "LINT", "context": { - "actualValue": "subnet-123" + "lifecycle": "deprecated" } }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "Domain", + "entityType": "Resource", + "resourceType": "AWS::SDB::Domain" + }, + "category": "Best Practice", + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 9, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "Domain", + "entityType": "Resource", + "resourceType": "AWS::SDB::Domain" + }, + "category": "Best Practice", + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 9, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + } + ] + }, + "bad/duplicate.json": { + "filePath": "bad/duplicate.json", + "status": "OK", + "metadata": { + "resourcesScanned": 2, + "counts": { + "fatal": 3, + "errors": 0, + "warnings": 0, + "informational": 3, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "F0000", + "severity": "FATAL", + "message": "Duplicate key 'MySNSTopic'", + "source": "SCHEMA", + "entity": { + "logicalId": "MySNSTopic", + "entityType": "Resource", + "resourceType": "AWS::SNS::Topic" + }, + "propertyPath": "Resources/MySNSTopic", + "category": "Structure", + "startLine": 5, + "startColumn": 3, + "endLine": 5, + "endColumn": 14, + "ruleDescription": "Duplicate key in template", + "phase": "PARSE" + }, + { + "ruleId": "F0000", + "severity": "FATAL", + "message": "Duplicate key 'MySNSTopic'", + "source": "SCHEMA", + "entity": { + "logicalId": "MySNSTopic", + "entityType": "Resource", + "resourceType": "AWS::SNS::Topic" + }, + "propertyPath": "Resources/MySNSTopic", + "category": "Structure", + "startLine": 17, + "startColumn": 3, + "endLine": 17, + "endColumn": 14, + "ruleDescription": "Duplicate key in template", + "phase": "PARSE" + }, + { + "ruleId": "F0000", + "severity": "FATAL", + "message": "Duplicate key 'MySNSTopic'", + "source": "SCHEMA", + "entity": { + "logicalId": "MySNSTopic", + "entityType": "Resource", + "resourceType": "AWS::SNS::Topic" + }, + "propertyPath": "Resources/MySNSTopic", + "category": "Structure", + "startLine": 23, + "startColumn": 3, + "endLine": 23, + "endColumn": 14, + "ruleDescription": "Duplicate key in template", + "phase": "PARSE" + }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Family' is create-only; updating it will cause resource replacement", + "message": "Property 'TopicName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "TaskDef", + "logicalId": "MySNSTopic", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.Family", + "propertyPath": "Properties.TopicName", "category": "Best Practice", - "startLine": 6, - "startColumn": 7, - "endLine": 6, - "endColumn": 13, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "startLine": 26, + "startColumn": 6, + "endLine": 26, + "endColumn": 16, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sns", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -19637,171 +19824,191 @@ } }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", + "message": "Resource 'MyEipNat' of type 'AWS::EC2::EIP' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "MyEipNat", + "entityType": "Resource", + "resourceType": "AWS::EC2::EIP" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 13, + "startColumn": 4, + "endLine": 13, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'MySNSTopic' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "TaskDef", + "logicalId": "MySNSTopic", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.NetworkMode", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 7, - "startColumn": 7, - "endLine": 7, - "endColumn": 18, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 25, + "startColumn": 4, + "endLine": 25, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "bad/duplicate.yaml": { + "filePath": "bad/duplicate.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 2, + "counts": { + "fatal": 3, + "errors": 1, + "warnings": 0, + "informational": 2, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "F0000", + "severity": "FATAL", + "message": "Duplicate key 'mySnsTopic'", + "source": "SCHEMA", "entity": { - "logicalId": "TaskDef", + "logicalId": "mySnsTopic", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.Cpu", - "category": "Best Practice", - "startLine": 8, - "startColumn": 7, - "endLine": 8, - "endColumn": 10, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "propertyPath": "Resources/mySnsTopic", + "category": "Structure", + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 13, + "ruleDescription": "Duplicate key in template", + "phase": "PARSE" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Memory' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "F0000", + "severity": "FATAL", + "message": "Duplicate key 'mySnsTopic'", + "source": "SCHEMA", "entity": { - "logicalId": "TaskDef", + "logicalId": "mySnsTopic", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.Memory", - "category": "Best Practice", + "propertyPath": "Resources/mySnsTopic", + "category": "Structure", "startLine": 9, - "startColumn": 7, + "startColumn": 3, "endLine": 9, "endColumn": 13, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "ruleDescription": "Duplicate key in template", + "phase": "PARSE" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "F0000", + "severity": "FATAL", + "message": "Duplicate key 'mySnsTopic'", + "source": "SCHEMA", "entity": { - "logicalId": "TaskDef", + "logicalId": "mySnsTopic", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ContainerDefinitions", - "category": "Best Practice", - "startLine": 10, - "startColumn": 7, - "endLine": 10, - "endColumn": 27, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "propertyPath": "Resources/mySnsTopic", + "category": "Structure", + "startLine": 13, + "startColumn": 3, + "endLine": 13, + "endColumn": 13, + "ruleDescription": "Duplicate key in template", + "phase": "PARSE" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'LaunchType' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "E3001", + "severity": "ERROR", + "message": "Resource 'mySnsTopic' has invalid property 'Parameters'. Valid resource attributes: Type, Properties, DependsOn, Condition, Metadata, DeletionPolicy, UpdateReplacePolicy, UpdatePolicy, CreationPolicy, Fn::Transform, Version", + "source": "CFN_LINT", "entity": { - "logicalId": "Service", + "logicalId": "mySnsTopic", "entityType": "Resource", - "resourceType": "AWS::ECS::Service" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.LaunchType", - "category": "Best Practice", - "startLine": 17, - "startColumn": 7, - "endLine": 17, - "endColumn": 17, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "category": "Resource", + "startLine": 15, + "startColumn": 5, + "endLine": 15, + "endColumn": 15, + "ruleDescription": "Basic CloudFormation Resource Check", + "phase": "PARSE" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'TaskDef' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", + "message": "Resource 'myS3Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "TaskDef", + "logicalId": "myS3Bucket", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::S3::Bucket" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, + "startLine": 7, + "startColumn": 3, + "endLine": 7, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Service' of type 'AWS::ECS::Service' supports Tags but none are configured", + "message": "Resource 'mySnsTopic' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Service", + "logicalId": "mySnsTopic", "entityType": "Resource", - "resourceType": "AWS::ECS::Service" + "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 16, - "startColumn": 5, - "endLine": 16, - "endColumn": 15, + "startLine": 13, + "startColumn": 3, + "endLine": 13, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "bad/ecs_role_no_boundary.yaml": { - "filePath": "bad/ecs_role_no_boundary.yaml", + "bad/duplicate_primary_id.yaml": { + "filePath": "bad/duplicate_primary_id.yaml", "status": "OK", "metadata": { - "resourcesScanned": 3, + "resourcesScanned": 2, "counts": { "fatal": 0, - "errors": 0, + "errors": 2, "warnings": 0, - "informational": 6, + "informational": 4, "debug": 0 }, "suppressed": 0, @@ -19810,70 +20017,81 @@ }, "diagnostics": [ { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'TaskRoleArn' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E3019", + "severity": "ERROR", + "message": "Primary identifiers {'BucketName': 'my-duplicate-bucket'} should have unique values across the resources {'BucketA', 'BucketB'}", + "source": "CFN_LINT", "entity": { - "logicalId": "TaskDef", + "logicalId": "BucketA", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.TaskRoleArn", - "category": "Best Practice", - "startLine": 26, + "propertyPath": "Properties.BucketName", + "category": "Resource", + "startLine": 6, "startColumn": 7, - "endLine": 26, - "endColumn": 18, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt TaskRole.Arn" - } + "endLine": 6, + "endColumn": 17, + "ruleDescription": "Validate that all resources have unique primary identifiers", + "phase": "LINT" + }, + { + "ruleId": "E3019", + "severity": "ERROR", + "message": "Primary identifiers {'BucketName': 'my-duplicate-bucket'} should have unique values across the resources {'BucketA', 'BucketB'}", + "source": "CFN_LINT", + "entity": { + "logicalId": "BucketB", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" + }, + "propertyPath": "Properties.BucketName", + "category": "Resource", + "startLine": 10, + "startColumn": 7, + "endLine": 10, + "endColumn": 17, + "ruleDescription": "Validate that all resources have unique primary identifiers", + "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ExecutionRoleArn' is create-only; updating it will cause resource replacement", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "TaskDef", + "logicalId": "BucketA", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.ExecutionRoleArn", + "propertyPath": "Properties.BucketName", "category": "Best Practice", - "startLine": 27, + "startLine": 6, "startColumn": 7, - "endLine": 27, - "endColumn": 23, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "endLine": 6, + "endColumn": 17, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt ExecRole.Arn" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "TaskDef", + "logicalId": "BucketB", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.ContainerDefinitions", + "propertyPath": "Properties.BucketName", "category": "Best Practice", - "startLine": 28, + "startLine": 10, "startColumn": 7, - "endLine": 28, - "endColumn": 27, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "endLine": 10, + "endColumn": 17, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -19883,12 +20101,12 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'TaskRole' of type 'AWS::IAM::Role' supports Tags but none are configured", + "message": "Resource 'BucketA' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "TaskRole", + "logicalId": "BucketA", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::S3::Bucket" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", @@ -19903,55 +20121,35 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'ExecRole' of type 'AWS::IAM::Role' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "ExecRole", - "entityType": "Resource", - "resourceType": "AWS::IAM::Role" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 15, - "startColumn": 5, - "endLine": 15, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'TaskDef' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", + "message": "Resource 'BucketB' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "TaskDef", + "logicalId": "BucketB", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::S3::Bucket" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 25, + "startLine": 9, "startColumn": 5, - "endLine": 25, + "endLine": 9, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "bad/elb_http_443.yaml": { - "filePath": "bad/elb_http_443.yaml", + "bad/duplicate_primary_id_multi.yaml": { + "filePath": "bad/duplicate_primary_id_multi.yaml", "status": "OK", "metadata": { - "resourcesScanned": 1, + "resourcesScanned": 2, "counts": { "fatal": 0, "errors": 0, - "warnings": 2, - "informational": 2, + "warnings": 0, + "informational": 4, "debug": 0 }, "suppressed": 0, @@ -19960,196 +20158,95 @@ }, "diagnostics": [ { - "ruleId": "W9002", - "severity": "WARN", - "message": "Property 'LoadBalancerArn' has a hardcoded ARN - use Ref, GetAtt, or a parameter instead", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Listener", + "logicalId": "BucketA", "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancingV2::Listener" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.LoadBalancerArn", + "propertyPath": "Properties.BucketName", "category": "Best Practice", - "startLine": 6, + "startLine": 11, "startColumn": 7, - "endLine": 6, - "endColumn": 22, - "ruleDescription": "Hardcoded ARN property", - "phase": "LINT" - }, - { - "ruleId": "W9013", - "severity": "WARN", - "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", - "source": "ENGINE", - "entity": { - "logicalId": "Listener", - "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancingV2::Listener" - }, - "category": "Security", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 11, - "ruleDescription": "Hardcoded account ID in ARN", - "phase": "LINT" + "endLine": 11, + "endColumn": 17, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Fn::If on condition 'IsA'" + } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'LoadBalancerArn' is create-only; updating it will cause resource replacement", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Listener", + "logicalId": "BucketB", "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancingV2::Listener" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.LoadBalancerArn", + "propertyPath": "Properties.BucketName", "category": "Best Practice", - "startLine": 6, + "startLine": 15, "startColumn": 7, - "endLine": 6, - "endColumn": 22, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-elasticloadbalancingv2.git", + "endLine": 15, + "endColumn": 17, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "Fn::If on condition 'IsA'" } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Listener' of type 'AWS::ElasticLoadBalancingV2::Listener' supports Tags but none are configured", + "message": "Resource 'BucketA' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Listener", + "logicalId": "BucketA", "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancingV2::Listener" + "resourceType": "AWS::S3::Bucket" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 5, + "startLine": 10, "startColumn": 5, - "endLine": 5, + "endLine": 10, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" - } - ] - }, - "bad/empty_file.yaml": { - "filePath": "bad/empty_file.yaml", - "status": "ERROR", - "metadata": { - "resourcesScanned": 0, - "counts": { - "fatal": 1, - "errors": 0, - "warnings": 0, - "informational": 0, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "F1101", - "severity": "FATAL", - "message": "Empty YAML document", - "source": "SCHEMA", - "category": "Structure", - "startLine": 1, - "startColumn": 1, - "endLine": 1, - "endColumn": 1, - "ruleDescription": "Invalid YAML/JSON syntax", - "phase": "PARSE" - } - ] - }, - "bad/equals_wrong_arity.yaml": { - "filePath": "bad/equals_wrong_arity.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 1, - "informational": 1, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "E8003", - "severity": "ERROR", - "message": "Fn::Equals: expected maximum item count: 2, found: 3", - "source": "SCHEMA", - "entity": { - "logicalId": "Bad", - "entityType": "Condition" - }, - "propertyPath": "Conditions/Bad/Fn::Equals", - "category": "Intrinsic Function", - "startLine": 4, - "startColumn": 5, - "endLine": 4, - "endColumn": 15, - "ruleDescription": "Fn::Equals must take exactly two scalar operands", - "phase": "PARSE" - }, - { - "ruleId": "W8001", - "severity": "WARN", - "message": "Condition 'Bad' is not used by any resource or Fn::If", - "source": "CFN_LINT", - "entity": { - "logicalId": "Bad", - "entityType": "Condition" - }, - "propertyPath": "Conditions/Bad", - "category": "Best Practice", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 6, - "ruleDescription": "Check if Conditions are Used", - "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'R' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Resource 'BucketB' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "R", + "logicalId": "BucketB", "entityType": "Resource", "resourceType": "AWS::S3::Bucket" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 9, - "startColumn": 3, - "endLine": 9, - "endColumn": 4, + "startLine": 14, + "startColumn": 5, + "endLine": 14, + "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "bad/fargate_bad_cpu_memory.yaml": { - "filePath": "bad/fargate_bad_cpu_memory.yaml", + "bad/dynamodb_attribute_mismatch.yaml": { + "filePath": "bad/dynamodb_attribute_mismatch.yaml", "status": "OK", "metadata": { "resourcesScanned": 1, @@ -20157,7 +20254,7 @@ "fatal": 0, "errors": 1, "warnings": 0, - "informational": 7, + "informational": 5, "debug": 0 }, "suppressed": 0, @@ -20166,140 +20263,76 @@ }, "diagnostics": [ { - "ruleId": "E3047", + "ruleId": "E3039", "severity": "ERROR", - "message": "Cpu '256' is not compatible with Memory '8192' for Fargate", + "message": "AttributeDefinitions does not match KeySchema attributes. missing definitions: [sk]", "source": "CFN_LINT", "entity": { - "logicalId": "TaskDef", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.Cpu", - "suggestedFix": "Use a valid Fargate CPU/memory combination (e.g., Cpu: 256 with Memory: 512, 1024, or 2048)", - "category": "Resource", - "startLine": 7, - "startColumn": 7, - "endLine": 7, - "endColumn": 10, - "ruleDescription": "Validate ECS Fargate tasks have the right combination of CPU and memory", - "phase": "LINT", - "context": { - "extra": { - "cpu": "256", - "memory": "8192" - } - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Family' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "TaskDef", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.Family", - "category": "Best Practice", - "startLine": 6, - "startColumn": 7, - "endLine": 6, - "endColumn": 13, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "TaskDef", + "logicalId": "BadTable", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.Cpu", - "category": "Best Practice", - "startLine": 7, - "startColumn": 7, - "endLine": 7, - "endColumn": 10, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "propertyPath": "Properties", + "category": "Resource", + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "AttributeDefinitions / KeySchemas mismatch", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'Memory' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "TaskDef", + "logicalId": "BadTable", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.Memory", "category": "Best Practice", - "startLine": 8, - "startColumn": 7, - "endLine": 8, - "endColumn": 13, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 11, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "TaskDef", + "logicalId": "BadTable", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 9, - "startColumn": 7, - "endLine": 9, - "endColumn": 18, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 11, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", + "message": "Property 'TableName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "TaskDef", + "logicalId": "BadTable", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.RequiresCompatibilities", + "propertyPath": "Properties.TableName", "category": "Best Practice", - "startLine": 10, + "startLine": 6, "startColumn": 7, - "endLine": 10, - "endColumn": 30, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "endLine": 6, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -20309,35 +20342,34 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", + "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "TaskDef", + "logicalId": "BadTable", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.ContainerDefinitions", + "propertyPath": "Properties.KeySchema", "category": "Best Practice", - "startLine": 12, + "startLine": 11, "startColumn": 7, - "endLine": 12, - "endColumn": 27, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "endLine": 11, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'TaskDef' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", + "message": "Resource 'BadTable' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "TaskDef", + "logicalId": "BadTable", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", @@ -20351,16 +20383,16 @@ } ] }, - "bad/fargate_daemon.yaml": { - "filePath": "bad/fargate_daemon.yaml", + "bad/dynamodb_prod_no_kms.yaml": { + "filePath": "bad/dynamodb_prod_no_kms.yaml", "status": "OK", "metadata": { - "resourcesScanned": 3, + "resourcesScanned": 1, "counts": { "fatal": 0, - "errors": 2, + "errors": 0, "warnings": 0, - "informational": 12, + "informational": 3, "debug": 0 }, "suppressed": 0, @@ -20369,87 +20401,39 @@ }, "diagnostics": [ { - "ruleId": "E3044", - "severity": "ERROR", - "message": "Fargate launch type does not support DAEMON scheduling strategy", - "source": "CFN_LINT", - "entity": { - "logicalId": "FargateDaemon", - "entityType": "Resource", - "resourceType": "AWS::ECS::Service" - }, - "propertyPath": "Properties.SchedulingStrategy", - "suggestedFix": "Use REPLICA scheduling strategy with Fargate", - "category": "Resource", - "startLine": 7, - "startColumn": 7, - "endLine": 7, - "endColumn": 25, - "ruleDescription": "ECS service using FARGATE or EXTERNAL cannot use DAEMON scheduling", - "phase": "LINT", - "context": { - "extra": { - "launch_type": "FARGATE", - "scheduling_strategy": "DAEMON" - } - } - }, - { - "ruleId": "E3052", - "severity": "ERROR", - "message": "NetworkConfiguration required when TaskDefinition NetworkMode is 'awsvpc'", + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "FargateDaemon", + "logicalId": "ProdTable", "entityType": "Resource", - "resourceType": "AWS::ECS::Service" + "resourceType": "AWS::DynamoDB::Table" }, - "category": "Resource", + "category": "Best Practice", "startLine": 3, "startColumn": 3, "endLine": 3, - "endColumn": 16, - "ruleDescription": "Validate ECS service requires NetworkConfiguration", + "endColumn": 12, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'LaunchType' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "FargateDaemon", - "entityType": "Resource", - "resourceType": "AWS::ECS::Service" - }, - "propertyPath": "Properties.LaunchType", - "category": "Best Practice", - "startLine": 6, - "startColumn": 7, - "endLine": 6, - "endColumn": 17, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'SchedulingStrategy' is create-only; updating it will cause resource replacement", + "message": "Property 'TableName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FargateDaemon", + "logicalId": "ProdTable", "entityType": "Resource", - "resourceType": "AWS::ECS::Service" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.SchedulingStrategy", + "propertyPath": "Properties.TableName", "category": "Best Practice", "startLine": 7, "startColumn": 7, "endLine": 7, - "endColumn": 25, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -20459,135 +20443,136 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Cluster' is create-only; updating it will cause resource replacement", + "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FargateDaemon", + "logicalId": "ProdTable", "entityType": "Resource", - "resourceType": "AWS::ECS::Service" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.Cluster", + "propertyPath": "Properties.KeySchema", "category": "Best Practice", - "startLine": 9, + "startLine": 11, "startColumn": 7, - "endLine": 9, - "endColumn": 14, + "endLine": 11, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'Cluster'" + "lifecycle": "conditional-create-only" } + } + ] + }, + "bad/dynamodb_provisioned_no_throughput.yaml": { + "filePath": "bad/dynamodb_provisioned_no_throughput.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 1, + "errors": 1, + "warnings": 0, + "informational": 5, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Family' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "F3003", + "severity": "FATAL", + "message": "'ProvisionedThroughput' is a required property (from extension)", + "source": "SCHEMA", "entity": { - "logicalId": "TaskDef", + "logicalId": "DDBTable", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.Family", - "category": "Best Practice", - "startLine": 13, - "startColumn": 7, - "endLine": 13, - "endColumn": 13, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "propertyPath": "Properties", + "suggestedFix": "Add 'ProvisionedThroughput'", + "category": "Schema", + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Required property missing", + "phase": "SCHEMA" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E3639", + "severity": "ERROR", + "message": "ProvisionedThroughput is required when BillingMode is 'PROVISIONED'", + "source": "CFN_LINT", "entity": { - "logicalId": "TaskDef", + "logicalId": "DDBTable", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.RequiresCompatibilities", - "category": "Best Practice", - "startLine": 14, - "startColumn": 7, - "endLine": 14, - "endColumn": 30, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "propertyPath": "Properties.ProvisionedThroughput", + "suggestedFix": "Add ProvisionedThroughput or set BillingMode to 'PAY_PER_REQUEST'", + "category": "Resource", + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Validate DynamoDB table ProvisionedThroughput is set when BillingMode is PROVISIONED", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "TaskDef", + "logicalId": "DDBTable", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.Cpu", "category": "Best Practice", - "startLine": 16, - "startColumn": 7, - "endLine": 16, - "endColumn": 10, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 11, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'Memory' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "TaskDef", + "logicalId": "DDBTable", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.Memory", "category": "Best Practice", - "startLine": 17, - "startColumn": 7, - "endLine": 17, - "endColumn": 13, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 11, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", + "message": "Property 'TableName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "TaskDef", + "logicalId": "DDBTable", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.NetworkMode", + "propertyPath": "Properties.TableName", "category": "Best Practice", - "startLine": 18, + "startLine": 6, "startColumn": 7, - "endLine": 18, - "endColumn": 18, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "endLine": 6, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -20597,35 +20582,34 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", + "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "TaskDef", + "logicalId": "DDBTable", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.ContainerDefinitions", + "propertyPath": "Properties.KeySchema", "category": "Best Practice", - "startLine": 19, + "startLine": 11, "startColumn": 7, - "endLine": 19, - "endColumn": 27, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "endLine": 11, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'FargateDaemon' of type 'AWS::ECS::Service' supports Tags but none are configured", + "message": "Resource 'DDBTable' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "FargateDaemon", + "logicalId": "DDBTable", "entityType": "Resource", - "resourceType": "AWS::ECS::Service" + "resourceType": "AWS::DynamoDB::Table" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", @@ -20636,59 +20620,78 @@ "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "bad/ecr_policy_no_statement.yaml": { + "filePath": "bad/ecr_policy_no_statement.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 1, + "warnings": 0, + "informational": 1, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'TaskDef' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "E3513", + "severity": "ERROR", + "message": "ECR repository policy must have a Statement property", + "source": "CFN_LINT", "entity": { - "logicalId": "TaskDef", + "logicalId": "Repo", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::ECR::Repository" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 12, - "startColumn": 5, - "endLine": 12, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "propertyPath": "Properties.RepositoryPolicyText", + "suggestedFix": "Add a Statement array to the RepositoryPolicyText", + "category": "Resource", + "startLine": 6, + "startColumn": 7, + "endLine": 6, + "endColumn": 27, + "ruleDescription": "Validate ECR repository policy", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Cluster' of type 'AWS::ECS::Cluster' supports Tags but none are configured", + "message": "Resource 'Repo' of type 'AWS::ECR::Repository' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Cluster", + "logicalId": "Repo", "entityType": "Resource", - "resourceType": "AWS::ECS::Cluster" + "resourceType": "AWS::ECR::Repository" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 23, - "startColumn": 3, - "endLine": 23, - "endColumn": 10, + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "bad/findinmap_bad.yaml": { - "filePath": "bad/findinmap_bad.yaml", + "bad/ecs_awsvpc_port_mismatch.yaml": { + "filePath": "bad/ecs_awsvpc_port_mismatch.yaml", "status": "OK", "metadata": { "resourcesScanned": 1, "counts": { - "fatal": 1, - "errors": 0, + "fatal": 0, + "errors": 1, "warnings": 0, - "informational": 1, + "informational": 3, "debug": 0 }, "suppressed": 0, @@ -20697,44 +20700,90 @@ }, "diagnostics": [ { - "ruleId": "F1012", - "severity": "FATAL", - "message": "Fn::FindInMap references non-existent mapping 'NonExistentMap'", - "source": "SCHEMA", + "ruleId": "E3053", + "severity": "ERROR", + "message": "HostPort 8080 must equal ContainerPort 80 when NetworkMode is awsvpc", + "source": "CFN_LINT", "entity": { - "logicalId": "Bucket", + "logicalId": "Task", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::ECS::TaskDefinition" }, - "category": "Intrinsic Function", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 9, - "ruleDescription": "FindInMap map name must exist in Mappings", - "phase": "SCHEMA" + "propertyPath": "Properties.ContainerDefinitions[0].PortMappings[0].HostPort", + "suggestedFix": "Set HostPort equal to ContainerPort or remove HostPort", + "category": "Resource", + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Validate ECS task definition has correct values for HostPort", + "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", + "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Bucket", + "logicalId": "Task", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.BucketName", + "propertyPath": "Properties.NetworkMode", "category": "Best Practice", "startLine": 6, "startColumn": 7, "endLine": 6, - "endColumn": 17, + "endColumn": 18, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "Task", + "entityType": "Resource", + "resourceType": "AWS::ECS::TaskDefinition" + }, + "propertyPath": "Properties.ContainerDefinitions", + "category": "Best Practice", + "startLine": 7, + "startColumn": 7, + "endLine": 7, + "endColumn": 27, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only" } + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Task' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "Task", + "entityType": "Resource", + "resourceType": "AWS::ECS::TaskDefinition" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" } ] } diff --git a/src/resources/expected/validation_reports2.json b/src/resources/expected/validation_reports2.json index 7c25829a..5046c747 100644 --- a/src/resources/expected/validation_reports2.json +++ b/src/resources/expected/validation_reports2.json @@ -1,14 +1,14 @@ { - "bad/formatters.yaml": { - "filePath": "bad/formatters.yaml", + "bad/ecs_dynamic_port_no_traffic.yaml": { + "filePath": "bad/ecs_dynamic_port_no_traffic.yaml", "status": "OK", "metadata": { - "resourcesScanned": 1, + "resourcesScanned": 3, "counts": { "fatal": 0, - "errors": 0, - "warnings": 2, - "informational": 5, + "errors": 1, + "warnings": 1, + "informational": 7, "debug": 0 }, "suppressed": 0, @@ -17,95 +17,122 @@ }, "diagnostics": [ { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1151", + "severity": "ERROR", + "message": "'vpc-12345' does not match format 'AWS::EC2::VPC.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "myTable", + "logicalId": "TargetGroup", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::ElasticLoadBalancingV2::TargetGroup" }, - "propertyPath": "Properties.TableName.Fn::Sub", - "category": "Best Practice", - "startLine": 9, + "propertyPath": "Properties.VpcId", + "category": "Intrinsic Function", + "startLine": 17, "startColumn": 7, - "endLine": 9, - "endColumn": 14, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "endLine": 17, + "endColumn": 12, + "ruleDescription": "Validate VPC id format", + "phase": "SCHEMA", + "context": { + "actualValue": "vpc-12345" + } }, { - "ruleId": "W9003", + "ruleId": "W3049", "severity": "WARN", - "message": "'5' is not of type 'integer' - automatically coerced (string to integer)", + "message": "Container 'app' uses dynamic host port 0, so each task registers on an ephemeral port, but TargetGroup 'TargetGroup' health-checks the fixed port '8080'. The health check will not follow the traffic port unless '8080' is separately served on every target. Use HealthCheckPort 'traffic-port' to health-check the port each target actually receives traffic on", "source": "CFN_LINT", "entity": { - "logicalId": "myTable", + "logicalId": "TargetGroup", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::ElasticLoadBalancingV2::TargetGroup" }, - "propertyPath": "Properties.ProvisionedThroughput.WriteCapacityUnits", + "propertyPath": "Properties.HealthCheckPort", "category": "Best Practice", "startLine": 18, - "startColumn": 9, + "startColumn": 7, "endLine": 18, - "endColumn": 27, - "ruleDescription": "Property type coercion warning", - "phase": "SCHEMA" + "endColumn": 22, + "relatedResources": [ + { + "resource": { + "id": "Service", + "resourceType": "AWS::ECS::Service" + }, + "location": { + "startLine": 23, + "startColumn": 7, + "endLine": 23, + "endColumn": 20 + }, + "message": "Dynamic host port defined here" + } + ], + "ruleDescription": "ELB target group health check uses a fixed port that will not follow an ECS dynamic host port", + "phase": "LINT" }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "myTable", + "logicalId": "TaskDef", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::ECS::TaskDefinition" }, + "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", "startLine": 6, - "startColumn": 3, + "startColumn": 7, "endLine": 6, - "endColumn": 10, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "endColumn": 27, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'Port' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "myTable", + "logicalId": "TargetGroup", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::ElasticLoadBalancingV2::TargetGroup" }, + "propertyPath": "Properties.Port", "category": "Best Practice", - "startLine": 6, - "startColumn": 3, - "endLine": 6, - "endColumn": 10, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 15, + "startColumn": 7, + "endLine": 15, + "endColumn": 11, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'TableName' is create-only; updating it will cause resource replacement", + "message": "Property 'Protocol' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "myTable", + "logicalId": "TargetGroup", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::ElasticLoadBalancingV2::TargetGroup" }, - "propertyPath": "Properties.TableName", + "propertyPath": "Properties.Protocol", "category": "Best Practice", - "startLine": 9, + "startLine": 16, "startColumn": 7, - "endLine": 9, - "endColumn": 16, + "endLine": 16, + "endColumn": 15, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -115,115 +142,97 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "myTable", + "logicalId": "TargetGroup", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::ElasticLoadBalancingV2::TargetGroup" }, - "propertyPath": "Properties.KeySchema", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 13, + "startLine": 17, "startColumn": 7, - "endLine": 13, - "endColumn": 16, + "endLine": 17, + "endColumn": 12, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only" } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'myTable' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", + "message": "Resource 'TaskDef' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "myTable", + "logicalId": "TaskDef", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 8, + "startLine": 5, "startColumn": 5, - "endLine": 8, + "endLine": 5, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" - } - ] - }, - "bad/functions/findinmap_default_value_no_transform.yaml": { - "filePath": "bad/functions/findinmap_default_value_no_transform.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 1, - "errors": 0, - "warnings": 0, - "informational": 1, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "F1101", - "severity": "FATAL", - "message": "Fn::FindInMap: the 'DefaultValue' element requires the AWS::LanguageExtensions transform; without it Fn::FindInMap accepts at most 3 elements", - "source": "SCHEMA", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'TargetGroup' of type 'AWS::ElasticLoadBalancingV2::TargetGroup' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Topic", + "logicalId": "TargetGroup", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::ElasticLoadBalancingV2::TargetGroup" }, - "propertyPath": "Properties.DisplayName", - "category": "Structure", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", "startLine": 14, - "startColumn": 7, + "startColumn": 5, "endLine": 14, - "endColumn": 18, - "ruleDescription": "Invalid YAML/JSON syntax", - "phase": "PARSE" + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Topic' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Service' of type 'AWS::ECS::Service' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Topic", + "logicalId": "Service", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::ECS::Service" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 13, + "startLine": 21, "startColumn": 5, - "endLine": 13, + "endLine": 21, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "bad/functions/foreach_no_transform.yaml": { - "filePath": "bad/functions/foreach_no_transform.yaml", + "bad/ecs_fargate_mismatch.yaml": { + "filePath": "bad/ecs_fargate_mismatch.yaml", "status": "OK", "metadata": { - "resourcesScanned": 1, + "resourcesScanned": 2, "counts": { - "fatal": 4, - "errors": 0, + "fatal": 0, + "errors": 1, "warnings": 0, - "informational": 0, + "informational": 8, "debug": 0 }, "suppressed": 0, @@ -232,264 +241,216 @@ }, "diagnostics": [ { - "ruleId": "F0006", - "severity": "FATAL", - "message": "Logical ID 'Fn::ForEach::Buckets' must be alphanumeric (A-Za-z0-9)", - "source": "SCHEMA", - "entity": { - "logicalId": "Fn::ForEach::Buckets", - "entityType": "Resource", - "resourceType": "" - }, - "category": "Structure", - "startLine": 11, - "startColumn": 5, - "endLine": 11, - "endColumn": 25, - "ruleDescription": "Logical IDs must be alphanumeric", - "phase": "SCHEMA" - }, - { - "ruleId": "F1032", - "severity": "FATAL", - "message": "Fn::ForEach requires the AWS::LanguageExtensions transform, but it is not declared. Add 'Transform: AWS::LanguageExtensions' to use 'Fn::ForEach::Buckets'", - "source": "SCHEMA", + "ruleId": "E1154", + "severity": "ERROR", + "message": "'subnet-123' does not match format 'AWS::EC2::Subnet.Id'", + "source": "CFN_LINT", "entity": { - "logicalId": "Fn::ForEach::Buckets", + "logicalId": "Service", "entityType": "Resource", - "resourceType": "" - }, - "category": "Intrinsic Function", - "startLine": 11, - "startColumn": 5, - "endLine": 11, - "endColumn": 25, - "ruleDescription": "Fn::ForEach requires the AWS::LanguageExtensions transform", - "phase": "PARSE" - }, - { - "ruleId": "F1032", - "severity": "FATAL", - "message": "Fn::ForEach requires the AWS::LanguageExtensions transform, but it is not declared. Add 'Transform: AWS::LanguageExtensions' to use 'Fn::ForEach::BucketOutputs'", - "source": "SCHEMA", - "entity": { - "logicalId": "Fn::ForEach::BucketOutputs", - "entityType": "Output" - }, - "propertyPath": "Outputs/Fn::ForEach::BucketOutputs", - "category": "Intrinsic Function", - "startLine": 33, - "startColumn": 5, - "endLine": 33, - "endColumn": 31, - "ruleDescription": "Fn::ForEach requires the AWS::LanguageExtensions transform", - "phase": "PARSE" - }, - { - "ruleId": "F1032", - "severity": "FATAL", - "message": "Fn::ForEach requires the AWS::LanguageExtensions transform, but it is not declared. Add 'Transform: AWS::LanguageExtensions' to use 'Fn::ForEach::GetAttLoop'", - "source": "SCHEMA", - "entity": { - "logicalId": "Fn::ForEach::BucketOutputs", - "entityType": "Output" + "resourceType": "AWS::ECS::Service" }, - "propertyPath": "Outputs/Fn::ForEach::BucketOutputs/2/Fn::ForEach::GetAttLoop", + "propertyPath": "Properties.NetworkConfiguration.AwsvpcConfiguration.Subnets.0", "category": "Intrinsic Function", - "startLine": 36, - "startColumn": 11, - "endLine": 36, - "endColumn": 34, - "ruleDescription": "Fn::ForEach requires the AWS::LanguageExtensions transform", - "phase": "PARSE" - } - ] - }, - "bad/functions/get_stack_output.json": { - "filePath": "bad/functions/get_stack_output.json", - "status": "OK", - "metadata": { - "resourcesScanned": 4, - "counts": { - "fatal": 0, - "errors": 4, - "warnings": 0, - "informational": 4, - "debug": 0 + "startLine": 22, + "startColumn": 15, + "endLine": 22, + "endColumn": 16, + "ruleDescription": "Validate VPC subnet id format", + "phase": "SCHEMA", + "context": { + "actualValue": "subnet-123" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "E1033", - "severity": "ERROR", - "message": "'OutputName' is a required property", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Family' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Topic1", + "logicalId": "TaskDef", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.DisplayName.Fn::GetStackOutput", - "category": "Intrinsic Function", - "startLine": 8, - "startColumn": 11, - "endLine": 8, - "endColumn": 30, - "ruleDescription": "GetStackOutput validation of parameters", - "phase": "PARSE" + "propertyPath": "Properties.Family", + "category": "Best Practice", + "startLine": 6, + "startColumn": 7, + "endLine": 6, + "endColumn": 13, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "E1033", - "severity": "ERROR", - "message": "'StackName' is a required property", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Topic2", + "logicalId": "TaskDef", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.DisplayName.Fn::GetStackOutput", - "category": "Intrinsic Function", - "startLine": 18, - "startColumn": 11, - "endLine": 18, - "endColumn": 30, - "ruleDescription": "GetStackOutput validation of parameters", - "phase": "PARSE" + "propertyPath": "Properties.NetworkMode", + "category": "Best Practice", + "startLine": 7, + "startColumn": 7, + "endLine": 7, + "endColumn": 18, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "E1033", - "severity": "ERROR", - "message": "'invalid' is not of type 'object'", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Topic3", + "logicalId": "TaskDef", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.DisplayName.Fn::GetStackOutput", - "category": "Intrinsic Function", - "startLine": 28, - "startColumn": 11, - "endLine": 28, - "endColumn": 30, - "ruleDescription": "GetStackOutput validation of parameters", - "phase": "PARSE" + "propertyPath": "Properties.Cpu", + "category": "Best Practice", + "startLine": 8, + "startColumn": 7, + "endLine": 8, + "endColumn": 10, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "E1033", - "severity": "ERROR", - "message": "Additional properties are not allowed ('BadKey' was unexpected)", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Memory' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Topic4", + "logicalId": "TaskDef", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.DisplayName.Fn::GetStackOutput.BadKey", - "category": "Intrinsic Function", - "startLine": 39, - "startColumn": 13, - "endLine": 39, - "endColumn": 20, - "ruleDescription": "GetStackOutput validation of parameters", - "phase": "PARSE" + "propertyPath": "Properties.Memory", + "category": "Best Practice", + "startLine": 9, + "startColumn": 7, + "endLine": 9, + "endColumn": 13, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'Topic1' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Topic1", + "logicalId": "TaskDef", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 6, + "startLine": 10, "startColumn": 7, - "endLine": 6, - "endColumn": 18, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "endLine": 10, + "endColumn": 27, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'Topic2' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Property 'LaunchType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Topic2", + "logicalId": "Service", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::ECS::Service" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.LaunchType", "category": "Best Practice", - "startLine": 16, + "startLine": 17, "startColumn": 7, - "endLine": 16, - "endColumn": 18, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "endLine": 17, + "endColumn": 17, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Topic3' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'TaskDef' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Topic3", + "logicalId": "TaskDef", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 26, - "startColumn": 7, - "endLine": 26, - "endColumn": 18, + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Topic4' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Service' of type 'AWS::ECS::Service' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Topic4", + "logicalId": "Service", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::ECS::Service" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 34, - "startColumn": 7, - "endLine": 34, - "endColumn": 18, + "startLine": 16, + "startColumn": 5, + "endLine": 16, + "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "bad/functions/get_stack_output.yaml": { - "filePath": "bad/functions/get_stack_output.yaml", + "bad/ecs_role_no_boundary.yaml": { + "filePath": "bad/ecs_role_no_boundary.yaml", "status": "OK", "metadata": { - "resourcesScanned": 5, + "resourcesScanned": 3, "counts": { "fatal": 0, - "errors": 4, + "errors": 0, "warnings": 0, - "informational": 8, + "informational": 6, "debug": 0 }, "suppressed": 0, @@ -498,152 +459,112 @@ }, "diagnostics": [ { - "ruleId": "E1033", - "severity": "ERROR", - "message": "'OutputName' is a required property", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'TaskRoleArn' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Topic1", + "logicalId": "TaskDef", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.DisplayName.Fn::GetStackOutput", - "category": "Intrinsic Function", - "startLine": 8, - "startColumn": 9, - "endLine": 8, - "endColumn": 27, - "ruleDescription": "GetStackOutput validation of parameters", - "phase": "PARSE" + "propertyPath": "Properties.TaskRoleArn", + "category": "Best Practice", + "startLine": 26, + "startColumn": 7, + "endLine": 26, + "endColumn": 18, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "GetAtt TaskRole.Arn" + } }, { - "ruleId": "E1033", - "severity": "ERROR", - "message": "'StackName' is a required property", - "source": "SCHEMA", - "entity": { - "logicalId": "Topic2", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" - }, - "propertyPath": "Properties.DisplayName.Fn::GetStackOutput", - "category": "Intrinsic Function", - "startLine": 15, - "startColumn": 9, - "endLine": 15, - "endColumn": 27, - "ruleDescription": "GetStackOutput validation of parameters", - "phase": "PARSE" - }, - { - "ruleId": "E1033", - "severity": "ERROR", - "message": "'invalid' is not of type 'object'", - "source": "SCHEMA", - "entity": { - "logicalId": "Topic3", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" - }, - "propertyPath": "Properties.DisplayName.Fn::GetStackOutput", - "category": "Intrinsic Function", - "startLine": 22, - "startColumn": 9, - "endLine": 22, - "endColumn": 27, - "ruleDescription": "GetStackOutput validation of parameters", - "phase": "PARSE" - }, - { - "ruleId": "E1033", - "severity": "ERROR", - "message": "Additional properties are not allowed ('BadKey' was unexpected)", - "source": "SCHEMA", - "entity": { - "logicalId": "Topic4", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" - }, - "propertyPath": "Properties.DisplayName.Fn::GetStackOutput.BadKey", - "category": "Intrinsic Function", - "startLine": 31, - "startColumn": 11, - "endLine": 31, - "endColumn": 17, - "ruleDescription": "GetStackOutput validation of parameters", - "phase": "PARSE" - }, - { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'ExecutionRoleArn' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Topic5", + "logicalId": "TaskDef", "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" + "resourceType": "AWS::ECS::TaskDefinition" }, + "propertyPath": "Properties.ExecutionRoleArn", "category": "Best Practice", - "startLine": 33, - "startColumn": 3, - "endLine": 33, - "endColumn": 9, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 27, + "startColumn": 7, + "endLine": 27, + "endColumn": 23, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "GetAtt ExecRole.Arn" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Topic5", + "logicalId": "TaskDef", "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" + "resourceType": "AWS::ECS::TaskDefinition" }, + "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 33, - "startColumn": 3, - "endLine": 33, - "endColumn": 9, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 28, + "startColumn": 7, + "endLine": 28, + "endColumn": 27, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3013", + "ruleId": "I9040", "severity": "INFO", - "message": "'MessageRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", + "message": "Resource 'TaskRole' of type 'AWS::IAM::Role' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Topic5", + "logicalId": "TaskRole", "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 35, + "startLine": 5, "startColumn": 5, - "endLine": 35, + "endLine": 5, "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Topic1' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'ExecRole' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Topic1", + "logicalId": "ExecRole", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::IAM::Role" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 6, + "startLine": 15, "startColumn": 5, - "endLine": 6, + "endLine": 15, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -651,87 +572,158 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Topic2' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'TaskDef' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Topic2", + "logicalId": "TaskDef", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 13, + "startLine": 25, "startColumn": 5, - "endLine": 13, + "endLine": 25, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "bad/elb_http_443.yaml": { + "filePath": "bad/elb_http_443.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 2, + "informational": 2, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Topic3' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "ruleId": "W9002", + "severity": "WARN", + "message": "Property 'LoadBalancerArn' has a hardcoded ARN - use Ref, GetAtt, or a parameter instead", "source": "ENGINE", "entity": { - "logicalId": "Topic3", + "logicalId": "Listener", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::ElasticLoadBalancingV2::Listener" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.LoadBalancerArn", "category": "Best Practice", - "startLine": 20, - "startColumn": 5, - "endLine": 20, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "startLine": 6, + "startColumn": 7, + "endLine": 6, + "endColumn": 22, + "ruleDescription": "Hardcoded ARN property", "phase": "LINT" }, { - "ruleId": "I9040", + "ruleId": "W9013", + "severity": "WARN", + "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", + "source": "ENGINE", + "entity": { + "logicalId": "Listener", + "entityType": "Resource", + "resourceType": "AWS::ElasticLoadBalancingV2::Listener" + }, + "category": "Security", + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 11, + "ruleDescription": "Hardcoded account ID in ARN", + "phase": "LINT" + }, + { + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'Topic4' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Property 'LoadBalancerArn' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Topic4", + "logicalId": "Listener", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::ElasticLoadBalancingV2::Listener" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.LoadBalancerArn", "category": "Best Practice", - "startLine": 26, - "startColumn": 5, - "endLine": 26, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 6, + "startColumn": 7, + "endLine": 6, + "endColumn": 22, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-elasticloadbalancingv2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Topic5' of type 'AWS::SQS::Queue' supports Tags but none are configured", + "message": "Resource 'Listener' of type 'AWS::ElasticLoadBalancingV2::Listener' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Topic5", + "logicalId": "Listener", "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" + "resourceType": "AWS::ElasticLoadBalancingV2::Listener" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 35, + "startLine": 5, "startColumn": 5, - "endLine": 35, + "endLine": 5, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "bad/functions/import_value.yaml": { - "filePath": "bad/functions/import_value.yaml", + "bad/empty_file.yaml": { + "filePath": "bad/empty_file.yaml", + "status": "ERROR", + "metadata": { + "resourcesScanned": 0, + "counts": { + "fatal": 1, + "errors": 0, + "warnings": 0, + "informational": 0, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "F1101", + "severity": "FATAL", + "message": "Empty YAML document", + "source": "SCHEMA", + "category": "Structure", + "startLine": 1, + "startColumn": 1, + "endLine": 1, + "endColumn": 1, + "ruleDescription": "Invalid YAML/JSON syntax", + "phase": "PARSE" + } + ] + }, + "bad/equals_wrong_arity.yaml": { + "filePath": "bad/equals_wrong_arity.yaml", "status": "OK", "metadata": { "resourcesScanned": 1, @@ -739,7 +731,7 @@ "fatal": 0, "errors": 1, "warnings": 1, - "informational": 3, + "informational": 1, "debug": 0 }, "suppressed": 0, @@ -750,230 +742,274 @@ { "ruleId": "E8003", "severity": "ERROR", - "message": "Fn::Equals: argument 1: {'Fn::ImportValue': 'PrimaryRegion'} is not of type 'string'", + "message": "Fn::Equals: expected maximum item count: 2, found: 3", "source": "SCHEMA", "entity": { - "logicalId": "primaryRegion", + "logicalId": "Bad", "entityType": "Condition" }, - "propertyPath": "Conditions/primaryRegion/Fn::Equals", + "propertyPath": "Conditions/Bad/Fn::Equals", "category": "Intrinsic Function", "startLine": 4, - "startColumn": 3, + "startColumn": 5, "endLine": 4, - "endColumn": 13, + "endColumn": 15, "ruleDescription": "Fn::Equals must take exactly two scalar operands", "phase": "PARSE" }, { "ruleId": "W8001", "severity": "WARN", - "message": "Condition 'primaryRegion' is not used by any resource or Fn::If", + "message": "Condition 'Bad' is not used by any resource or Fn::If", "source": "CFN_LINT", "entity": { - "logicalId": "primaryRegion", + "logicalId": "Bad", "entityType": "Condition" }, - "propertyPath": "Conditions/primaryRegion", + "propertyPath": "Conditions/Bad", "category": "Best Practice", - "startLine": 4, + "startLine": 3, "startColumn": 3, - "endLine": 4, - "endColumn": 16, + "endLine": 3, + "endColumn": 6, "ruleDescription": "Check if Conditions are Used", "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Resource 'R' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "subnet", + "logicalId": "R", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", "startLine": 9, - "startColumn": 7, + "startColumn": 3, "endLine": 9, - "endColumn": 16, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", + "endColumn": 4, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "bad/fargate_bad_cpu_memory.yaml": { + "filePath": "bad/fargate_bad_cpu_memory.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 1, + "warnings": 0, + "informational": 7, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "E3047", + "severity": "ERROR", + "message": "Cpu '256' is not compatible with Memory '8192' for Fargate", + "source": "CFN_LINT", + "entity": { + "logicalId": "TaskDef", + "entityType": "Resource", + "resourceType": "AWS::ECS::TaskDefinition" + }, + "propertyPath": "Properties.Cpu", + "suggestedFix": "Use a valid Fargate CPU/memory combination (e.g., Cpu: 256 with Memory: 512, 1024, or 2048)", + "category": "Resource", + "startLine": 7, + "startColumn": 7, + "endLine": 7, + "endColumn": 10, + "ruleDescription": "Validate ECS Fargate tasks have the right combination of CPU and memory", + "phase": "LINT", "context": { - "lifecycle": "create-only", - "resolutionSource": "dynamic (cross-stack import)" + "extra": { + "cpu": "256", + "memory": "8192" + } } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "message": "Property 'Family' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "subnet", + "logicalId": "TaskDef", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.Family", "category": "Best Practice", - "startLine": 12, + "startLine": 6, "startColumn": 7, - "endLine": 12, - "endColumn": 12, + "endLine": 6, + "endColumn": 13, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "dynamic (cross-stack import)" + "lifecycle": "create-only" } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'subnet' of type 'AWS::EC2::Subnet' supports Tags but none are configured", + "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "subnet", + "logicalId": "TaskDef", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.Cpu", "category": "Best Practice", - "startLine": 8, - "startColumn": 5, - "endLine": 8, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "bad/functions/length_no_transform.yaml": { - "filePath": "bad/functions/length_no_transform.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 1, - "errors": 0, - "warnings": 0, - "informational": 4, - "debug": 0 + "startLine": 7, + "startColumn": 7, + "endLine": 7, + "endColumn": 10, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "F1030", - "severity": "FATAL", - "message": "Fn::Length requires the AWS::LanguageExtensions transform, but it is not declared. Add 'Transform: AWS::LanguageExtensions' to use it", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Memory' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Queue", + "logicalId": "TaskDef", "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.DelaySeconds", - "category": "Intrinsic Function", - "startLine": 13, + "propertyPath": "Properties.Memory", + "category": "Best Practice", + "startLine": 8, "startColumn": 7, - "endLine": 13, - "endColumn": 19, - "ruleDescription": "Fn::Length requires the AWS::LanguageExtensions transform", - "phase": "PARSE" + "endLine": 8, + "endColumn": 13, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Queue", + "logicalId": "TaskDef", "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" + "resourceType": "AWS::ECS::TaskDefinition" }, + "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 10, - "startColumn": 3, - "endLine": 10, - "endColumn": 8, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 9, + "startColumn": 7, + "endLine": 9, + "endColumn": 18, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Queue", + "logicalId": "TaskDef", "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" + "resourceType": "AWS::ECS::TaskDefinition" }, + "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", "startLine": 10, - "startColumn": 3, + "startColumn": 7, "endLine": 10, - "endColumn": 8, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "endColumn": 30, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3013", + "ruleId": "I9001", "severity": "INFO", - "message": "'MessageRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", + "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Queue", + "logicalId": "TaskDef", "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties", + "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", "startLine": 12, - "startColumn": 5, + "startColumn": 7, "endLine": 12, - "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", - "phase": "LINT" + "endColumn": 27, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Queue' of type 'AWS::SQS::Queue' supports Tags but none are configured", + "message": "Resource 'TaskDef' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Queue", + "logicalId": "TaskDef", "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" + "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 12, + "startLine": 5, "startColumn": 5, - "endLine": 12, + "endLine": 5, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "bad/functions/relationship_conditions.yaml": { - "filePath": "bad/functions/relationship_conditions.yaml", + "bad/fargate_daemon.yaml": { + "filePath": "bad/fargate_daemon.yaml", "status": "OK", "metadata": { - "resourcesScanned": 5, + "resourcesScanned": 3, "counts": { "fatal": 0, - "errors": 1, - "warnings": 7, - "informational": 6, + "errors": 2, + "warnings": 0, + "informational": 12, "debug": 0 }, "suppressed": 0, @@ -982,180 +1018,202 @@ }, "diagnostics": [ { - "ruleId": "E2533", + "ruleId": "E3044", "severity": "ERROR", - "message": "Runtime 'nodejs4.3' was deprecated on '2020-03-05'. Creation was disabled on '2020-02-03', and updates were disabled on '2020-03-05'. Please consider updating to 'nodejs24.x'", + "message": "Fargate launch type does not support DAEMON scheduling strategy", "source": "CFN_LINT", "entity": { - "logicalId": "AMIIDLookup", + "logicalId": "FargateDaemon", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::ECS::Service" }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 44, + "propertyPath": "Properties.SchedulingStrategy", + "suggestedFix": "Use REPLICA scheduling strategy with Fargate", + "category": "Resource", + "startLine": 7, "startColumn": 7, - "endLine": 44, - "endColumn": 14, - "ruleDescription": "Check if Lambda Function Runtimes are updatable", - "phase": "SCHEMA", + "endLine": 7, + "endColumn": 25, + "ruleDescription": "ECS service using FARGATE or EXTERNAL cannot use DAEMON scheduling", + "phase": "LINT", "context": { - "actualValue": "nodejs4.3", - "lifecycle": "end-of-life" + "extra": { + "launch_type": "FARGATE", + "scheduling_strategy": "DAEMON" + } } }, { - "ruleId": "W1001", - "severity": "WARN", - "message": "Reference to 'LambdaExecutionRole' which is conditional on 'isPrimary' - target may not exist", + "ruleId": "E3052", + "severity": "ERROR", + "message": "NetworkConfiguration required when TaskDefinition NetworkMode is 'awsvpc'", "source": "CFN_LINT", "entity": { - "logicalId": "InstanceProfile", + "logicalId": "FargateDaemon", "entityType": "Resource", - "resourceType": "AWS::IAM::InstanceProfile" + "resourceType": "AWS::ECS::Service" }, - "propertyPath": "Properties.Roles.0", - "suggestedFix": "Add a Condition to the referencing resource that implies the target's condition", - "category": "Best Practice", - "startLine": 32, - "startColumn": 14, - "endLine": 32, - "endColumn": 15, - "ruleDescription": "Ref/GetAtt to resource that is available when conditions are applied", + "category": "Resource", + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 16, + "ruleDescription": "Validate ECS service requires NetworkConfiguration", "phase": "LINT" }, { - "ruleId": "W1001", - "severity": "WARN", - "message": "Reference to 'LambdaExecutionRole' which is conditional on 'isPrimary' - target may not exist", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'LaunchType' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "AMIIDLookup", + "logicalId": "FargateDaemon", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::ECS::Service" }, - "propertyPath": "Properties.Role", - "suggestedFix": "Add a Condition to the referencing resource that implies the target's condition", + "propertyPath": "Properties.LaunchType", "category": "Best Practice", - "startLine": 37, + "startLine": 6, "startColumn": 7, - "endLine": 37, - "endColumn": 11, - "ruleDescription": "Ref/GetAtt to resource that is available when conditions are applied", - "phase": "LINT" + "endLine": 6, + "endColumn": 17, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "W1001", - "severity": "WARN", - "message": "Reference to 'LambdaExecutionRole' which is conditional on 'isPrimary' - target may not exist", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'SchedulingStrategy' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "SubCondRefParam", + "logicalId": "FargateDaemon", "entityType": "Resource", - "resourceType": "AWS::SSM::Parameter" + "resourceType": "AWS::ECS::Service" }, - "propertyPath": "Properties.Value", - "suggestedFix": "Add a Condition to the referencing resource that implies the target's condition", + "propertyPath": "Properties.SchedulingStrategy", "category": "Best Practice", - "startLine": 53, + "startLine": 7, "startColumn": 7, - "endLine": 53, - "endColumn": 12, - "ruleDescription": "Ref/GetAtt to resource that is available when conditions are applied", - "phase": "LINT" + "endLine": 7, + "endColumn": 25, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W1001", - "severity": "WARN", - "message": "Reference to 'LambdaExecutionRole' which is conditional on 'isPrimary' - target may not exist", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Cluster' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "SubCondGetAttParam", + "logicalId": "FargateDaemon", "entityType": "Resource", - "resourceType": "AWS::SSM::Parameter" + "resourceType": "AWS::ECS::Service" }, - "propertyPath": "Properties.Value", - "suggestedFix": "Add a Condition to the referencing resource that implies the target's condition", + "propertyPath": "Properties.Cluster", "category": "Best Practice", - "startLine": 59, + "startLine": 9, "startColumn": 7, - "endLine": 59, - "endColumn": 12, - "ruleDescription": "Ref/GetAtt to resource that is available when conditions are applied", - "phase": "LINT" + "endLine": 9, + "endColumn": 14, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'Cluster'" + } }, { - "ruleId": "W1001", - "severity": "WARN", - "message": "Reference to 'LambdaExecutionRole' which is conditional on 'isPrimary' - target may not exist", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Family' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "lambdaArn", - "entityType": "Output" + "logicalId": "TaskDef", + "entityType": "Resource", + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Outputs/lambdaArn/Value.Fn::GetAtt", - "suggestedFix": "Add a Condition to the output that implies the target's condition", + "propertyPath": "Properties.Family", "category": "Best Practice", - "startLine": 62, - "startColumn": 3, - "endLine": 62, - "endColumn": 12, - "ruleDescription": "Ref/GetAtt to resource that is available when conditions are applied", - "phase": "LINT" + "startLine": 13, + "startColumn": 7, + "endLine": 13, + "endColumn": 13, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W8001", - "severity": "WARN", - "message": "Condition 'isProduction' is not used by any resource or Fn::If", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "isProduction", - "entityType": "Condition" + "logicalId": "TaskDef", + "entityType": "Resource", + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Conditions/isProduction", + "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 7, - "startColumn": 3, - "endLine": 7, - "endColumn": 15, - "ruleDescription": "Check if Conditions are Used", - "phase": "LINT" + "startLine": 14, + "startColumn": 7, + "endLine": 14, + "endColumn": 30, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W8001", - "severity": "WARN", - "message": "Condition 'isDevelopment' is not used by any resource or Fn::If", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "isDevelopment", - "entityType": "Condition" + "logicalId": "TaskDef", + "entityType": "Resource", + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Conditions/isDevelopment", + "propertyPath": "Properties.Cpu", "category": "Best Practice", - "startLine": 8, - "startColumn": 3, - "endLine": 8, - "endColumn": 16, - "ruleDescription": "Check if Conditions are Used", - "phase": "LINT" + "startLine": 16, + "startColumn": 7, + "endLine": 16, + "endColumn": 10, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Path' is create-only; updating it will cause resource replacement", + "message": "Property 'Memory' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "LambdaExecutionRole", + "logicalId": "TaskDef", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Path", + "propertyPath": "Properties.Memory", "category": "Best Practice", - "startLine": 26, + "startLine": 17, "startColumn": 7, - "endLine": 26, - "endColumn": 11, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "endLine": 17, + "endColumn": 13, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -1165,19 +1223,20 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Path' is create-only; updating it will cause resource replacement", + "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "InstanceProfile", + "logicalId": "TaskDef", "entityType": "Resource", - "resourceType": "AWS::IAM::InstanceProfile" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Path", + "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 30, + "startLine": 18, "startColumn": 7, - "endLine": 30, - "endColumn": 11, + "endLine": 18, + "endColumn": 18, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -1185,41 +1244,44 @@ } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'LambdaExecutionRole' of type 'AWS::IAM::Role' supports Tags but none are configured", + "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "LambdaExecutionRole", + "logicalId": "TaskDef", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 14, - "startColumn": 5, - "endLine": 14, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 19, + "startColumn": 7, + "endLine": 19, + "endColumn": 27, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'AMIIDLookup' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "message": "Resource 'FargateDaemon' of type 'AWS::ECS::Service' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "AMIIDLookup", + "logicalId": "FargateDaemon", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::ECS::Service" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 35, + "startLine": 5, "startColumn": 5, - "endLine": 35, + "endLine": 5, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -1227,19 +1289,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'SubCondRefParam' of type 'AWS::SSM::Parameter' supports Tags but none are configured", + "message": "Resource 'TaskDef' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "SubCondRefParam", + "logicalId": "TaskDef", "entityType": "Resource", - "resourceType": "AWS::SSM::Parameter" + "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 51, + "startLine": 12, "startColumn": 5, - "endLine": 51, + "endLine": 12, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -1247,35 +1309,35 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'SubCondGetAttParam' of type 'AWS::SSM::Parameter' supports Tags but none are configured", + "message": "Resource 'Cluster' of type 'AWS::ECS::Cluster' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "SubCondGetAttParam", + "logicalId": "Cluster", "entityType": "Resource", - "resourceType": "AWS::SSM::Parameter" + "resourceType": "AWS::ECS::Cluster" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 57, - "startColumn": 5, - "endLine": 57, - "endColumn": 15, + "startLine": 23, + "startColumn": 3, + "endLine": 23, + "endColumn": 10, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "bad/functions/sub_needed.yaml": { - "filePath": "bad/functions/sub_needed.yaml", + "bad/findinmap_bad.yaml": { + "filePath": "bad/findinmap_bad.yaml", "status": "OK", "metadata": { - "resourcesScanned": 5, + "resourcesScanned": 1, "counts": { - "fatal": 0, - "errors": 10, - "warnings": 4, - "informational": 9, + "fatal": 1, + "errors": 0, + "warnings": 0, + "informational": 1, "debug": 0 }, "suppressed": 0, @@ -1284,480 +1346,538 @@ }, "diagnostics": [ { - "ruleId": "E1029", - "severity": "ERROR", - "message": "Found an embedded parameter '${AMIId}' outside of an 'Fn::Sub' at Properties.ImageId", - "source": "CFN_LINT", + "ruleId": "F1012", + "severity": "FATAL", + "message": "Fn::FindInMap references non-existent mapping 'NonExistentMap'", + "source": "SCHEMA", "entity": { - "logicalId": "myInstance", + "logicalId": "Bucket", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.ImageId", - "suggestedFix": "Wrap the string with Fn::Sub", "category": "Intrinsic Function", - "startLine": 11, - "startColumn": 7, - "endLine": 11, - "endColumn": 14, - "ruleDescription": "Substitution variable ${X} requires Fn::Sub", - "phase": "LINT" + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 9, + "ruleDescription": "FindInMap map name must exist in Mappings", + "phase": "SCHEMA" }, { - "ruleId": "E1029", - "severity": "ERROR", - "message": "Found an embedded parameter '${AMIId}' outside of an 'Fn::Sub' at Properties.PolicyDocument.Statement.0.Resource", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "myPolicy", + "logicalId": "Bucket", "entityType": "Resource", - "resourceType": "AWS::IAM::Policy" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.PolicyDocument.Statement.0.Resource", - "suggestedFix": "Wrap the string with Fn::Sub", - "category": "Intrinsic Function", - "startLine": 25, - "startColumn": 11, - "endLine": 25, - "endColumn": 19, - "ruleDescription": "Substitution variable ${X} requires Fn::Sub", - "phase": "LINT" + "propertyPath": "Properties.BucketName", + "category": "Best Practice", + "startLine": 6, + "startColumn": 7, + "endLine": 6, + "endColumn": 17, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + } + ] + }, + "bad/formatters.yaml": { + "filePath": "bad/formatters.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 2, + "informational": 5, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "E1029", - "severity": "ERROR", - "message": "Found an embedded parameter '${AWS::AccountId}' outside of an 'Fn::Sub' at Properties.PolicyDocument.Statement.0.Resource", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "myPolicy", + "logicalId": "myTable", "entityType": "Resource", - "resourceType": "AWS::IAM::Policy" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.PolicyDocument.Statement.0.Resource", - "suggestedFix": "Wrap the string with Fn::Sub", - "category": "Intrinsic Function", - "startLine": 25, - "startColumn": 11, - "endLine": 25, - "endColumn": 19, - "ruleDescription": "Substitution variable ${X} requires Fn::Sub", + "propertyPath": "Properties.TableName.Fn::Sub", + "category": "Best Practice", + "startLine": 9, + "startColumn": 7, + "endLine": 9, + "endColumn": 14, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" }, { - "ruleId": "E1029", - "severity": "ERROR", - "message": "Found an embedded parameter '${AMIId}' outside of an 'Fn::Sub' at Properties.PolicyDocument.Statement.1.NotResource", + "ruleId": "W9003", + "severity": "WARN", + "message": "'5' is not of type 'integer' - automatically coerced (string to integer)", "source": "CFN_LINT", "entity": { - "logicalId": "myPolicy", + "logicalId": "myTable", "entityType": "Resource", - "resourceType": "AWS::IAM::Policy" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.PolicyDocument.Statement.1.NotResource", - "suggestedFix": "Wrap the string with Fn::Sub", - "category": "Intrinsic Function", - "startLine": 29, - "startColumn": 11, - "endLine": 29, - "endColumn": 22, - "ruleDescription": "Substitution variable ${X} requires Fn::Sub", - "phase": "LINT" + "propertyPath": "Properties.ProvisionedThroughput.WriteCapacityUnits", + "category": "Best Practice", + "startLine": 18, + "startColumn": 9, + "endLine": 18, + "endColumn": 27, + "ruleDescription": "Property type coercion warning", + "phase": "SCHEMA" }, { - "ruleId": "E1029", - "severity": "ERROR", - "message": "Found an embedded parameter '${AWS::AccountId}' outside of an 'Fn::Sub' at Properties.PolicyDocument.Statement.1.NotResource", + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "myPolicy", + "logicalId": "myTable", "entityType": "Resource", - "resourceType": "AWS::IAM::Policy" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.PolicyDocument.Statement.1.NotResource", - "suggestedFix": "Wrap the string with Fn::Sub", - "category": "Intrinsic Function", - "startLine": 29, - "startColumn": 11, - "endLine": 29, - "endColumn": 22, - "ruleDescription": "Substitution variable ${X} requires Fn::Sub", + "category": "Best Practice", + "startLine": 6, + "startColumn": 3, + "endLine": 6, + "endColumn": 10, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "E1029", - "severity": "ERROR", - "message": "Found an embedded parameter '${definition_substitution_1}' outside of an 'Fn::Sub' at Properties.DefinitionString.Fn::Join.1.5", + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "TestBadStateMachine1", + "logicalId": "myTable", "entityType": "Resource", - "resourceType": "AWS::StepFunctions::StateMachine" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.DefinitionString.Fn::Join.1.5", - "suggestedFix": "Wrap the string with Fn::Sub", - "category": "Intrinsic Function", - "startLine": 46, - "startColumn": 13, - "endLine": 46, - "endColumn": 14, - "ruleDescription": "Substitution variable ${X} requires Fn::Sub", + "category": "Best Practice", + "startLine": 6, + "startColumn": 3, + "endLine": 6, + "endColumn": 10, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "E1029", - "severity": "ERROR", - "message": "Found an embedded parameter '${definition_substitution_1}' outside of an 'Fn::Sub' at Properties.DefinitionString.Fn::Join.1.5", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'TableName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "TestBadStateMachine2", + "logicalId": "myTable", "entityType": "Resource", - "resourceType": "AWS::StepFunctions::StateMachine" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.DefinitionString.Fn::Join.1.5", - "suggestedFix": "Wrap the string with Fn::Sub", - "category": "Intrinsic Function", - "startLine": 67, - "startColumn": 13, - "endLine": 67, - "endColumn": 14, - "ruleDescription": "Substitution variable ${X} requires Fn::Sub", - "phase": "LINT" + "propertyPath": "Properties.TableName", + "category": "Best Practice", + "startLine": 9, + "startColumn": 7, + "endLine": 9, + "endColumn": 16, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'${AMIId}' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "myInstance", + "logicalId": "myTable", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 11, + "propertyPath": "Properties.KeySchema", + "category": "Best Practice", + "startLine": 13, "startColumn": 7, - "endLine": 11, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", + "endLine": 13, + "endColumn": 16, + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "actualValue": "${AMIId}" + "lifecycle": "conditional-create-only" } }, { - "ruleId": "E3510", - "severity": "ERROR", - "message": "'arn:aws:iam::${AWS::AccountId}:user/${aws:username}-${AMIId}' does not match '^(arn:(aws[A-Za-z\\-]*?|[A-Za-z?*\\-]*[?*][A-Za-z?*\\-]*):[^:*?]+:[^:]*(:(?:\\d{12}|\\*|aws)?:.+|)|\\*)$'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'myTable' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "myPolicy", + "logicalId": "myTable", "entityType": "Resource", - "resourceType": "AWS::IAM::Policy" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.PolicyDocument.Statement.0.Resource", - "category": "Resource", - "startLine": 25, - "startColumn": 11, - "endLine": 25, - "endColumn": 19, - "ruleDescription": "Validate identity based IAM policies", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 8, + "startColumn": 5, + "endLine": 8, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "bad/functions/findinmap_default_value_no_transform.yaml": { + "filePath": "bad/functions/findinmap_default_value_no_transform.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 1, + "errors": 0, + "warnings": 0, + "informational": 1, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "E3510", - "severity": "ERROR", - "message": "'arn:aws:iam::${AWS::AccountId}:user/${aws:username}-${AMIId}' does not match '^(arn:(aws[A-Za-z\\-]*?|[A-Za-z?*\\-]*[?*][A-Za-z?*\\-]*):[^:*?]+:[^:]*(:(?:\\d{12}|\\*|aws)?:.+|)|\\*)$'", - "source": "CFN_LINT", + "ruleId": "F1101", + "severity": "FATAL", + "message": "Fn::FindInMap: the 'DefaultValue' element requires the AWS::LanguageExtensions transform; without it Fn::FindInMap accepts at most 3 elements", + "source": "SCHEMA", "entity": { - "logicalId": "myPolicy", + "logicalId": "Topic", "entityType": "Resource", - "resourceType": "AWS::IAM::Policy" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.PolicyDocument.Statement.1.NotResource", - "category": "Resource", - "startLine": 29, - "startColumn": 11, - "endLine": 29, - "endColumn": 22, - "ruleDescription": "Validate identity based IAM policies", - "phase": "LINT" + "propertyPath": "Properties.DisplayName", + "category": "Structure", + "startLine": 14, + "startColumn": 7, + "endLine": 14, + "endColumn": 18, + "ruleDescription": "Invalid YAML/JSON syntax", + "phase": "PARSE" }, { - "ruleId": "W9002", - "severity": "WARN", - "message": "Property 'RoleArn' has a hardcoded ARN - use Ref, GetAtt, or a parameter instead", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Topic' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "TestBadStateMachine1", + "logicalId": "Topic", "entityType": "Resource", - "resourceType": "AWS::StepFunctions::StateMachine" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.RoleArn", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 54, - "startColumn": 7, - "endLine": 54, - "endColumn": 14, - "ruleDescription": "Hardcoded ARN property", + "startLine": 13, + "startColumn": 5, + "endLine": 13, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "bad/functions/foreach_no_transform.yaml": { + "filePath": "bad/functions/foreach_no_transform.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 4, + "errors": 0, + "warnings": 0, + "informational": 0, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "W9002", - "severity": "WARN", - "message": "Property 'RoleArn' has a hardcoded ARN - use Ref, GetAtt, or a parameter instead", - "source": "ENGINE", + "ruleId": "F0006", + "severity": "FATAL", + "message": "Logical ID 'Fn::ForEach::Buckets' must be alphanumeric (A-Za-z0-9)", + "source": "SCHEMA", "entity": { - "logicalId": "TestBadStateMachine2", + "logicalId": "Fn::ForEach::Buckets", "entityType": "Resource", - "resourceType": "AWS::StepFunctions::StateMachine" + "resourceType": "" }, - "propertyPath": "Properties.RoleArn", - "category": "Best Practice", - "startLine": 73, - "startColumn": 7, - "endLine": 73, - "endColumn": 14, - "ruleDescription": "Hardcoded ARN property", - "phase": "LINT" + "category": "Structure", + "startLine": 11, + "startColumn": 5, + "endLine": 11, + "endColumn": 25, + "ruleDescription": "Logical IDs must be alphanumeric", + "phase": "SCHEMA" }, { - "ruleId": "W9013", - "severity": "WARN", - "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", - "source": "ENGINE", + "ruleId": "F1032", + "severity": "FATAL", + "message": "Fn::ForEach requires the AWS::LanguageExtensions transform, but it is not declared. Add 'Transform: AWS::LanguageExtensions' to use 'Fn::ForEach::Buckets'", + "source": "SCHEMA", "entity": { - "logicalId": "TestBadStateMachine1", + "logicalId": "Fn::ForEach::Buckets", "entityType": "Resource", - "resourceType": "AWS::StepFunctions::StateMachine" + "resourceType": "" }, - "category": "Security", - "startLine": 35, - "startColumn": 3, - "endLine": 35, - "endColumn": 23, - "ruleDescription": "Hardcoded account ID in ARN", - "phase": "LINT" + "category": "Intrinsic Function", + "startLine": 11, + "startColumn": 5, + "endLine": 11, + "endColumn": 25, + "ruleDescription": "Fn::ForEach requires the AWS::LanguageExtensions transform", + "phase": "PARSE" }, { - "ruleId": "W9013", - "severity": "WARN", - "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", - "source": "ENGINE", + "ruleId": "F1032", + "severity": "FATAL", + "message": "Fn::ForEach requires the AWS::LanguageExtensions transform, but it is not declared. Add 'Transform: AWS::LanguageExtensions' to use 'Fn::ForEach::BucketOutputs'", + "source": "SCHEMA", "entity": { - "logicalId": "TestBadStateMachine2", - "entityType": "Resource", - "resourceType": "AWS::StepFunctions::StateMachine" + "logicalId": "Fn::ForEach::BucketOutputs", + "entityType": "Output" }, - "category": "Security", - "startLine": 56, - "startColumn": 3, - "endLine": 56, - "endColumn": 23, - "ruleDescription": "Hardcoded account ID in ARN", - "phase": "LINT" + "propertyPath": "Outputs/Fn::ForEach::BucketOutputs", + "category": "Intrinsic Function", + "startLine": 33, + "startColumn": 5, + "endLine": 33, + "endColumn": 31, + "ruleDescription": "Fn::ForEach requires the AWS::LanguageExtensions transform", + "phase": "PARSE" }, { - "ruleId": "I3510", - "severity": "INFO", - "message": "action 'iam:UploadSSHPublicKey' requires a resource of ['arn:${Partition}:iam::${Account}:user/.*']", - "source": "CFN_LINT", + "ruleId": "F1032", + "severity": "FATAL", + "message": "Fn::ForEach requires the AWS::LanguageExtensions transform, but it is not declared. Add 'Transform: AWS::LanguageExtensions' to use 'Fn::ForEach::GetAttLoop'", + "source": "SCHEMA", "entity": { - "logicalId": "myPolicy", - "entityType": "Resource", - "resourceType": "AWS::IAM::Policy" + "logicalId": "Fn::ForEach::BucketOutputs", + "entityType": "Output" }, - "propertyPath": "Properties.PolicyDocument.Statement.0.Resource", - "category": "Security", - "startLine": 25, + "propertyPath": "Outputs/Fn::ForEach::BucketOutputs/2/Fn::ForEach::GetAttLoop", + "category": "Intrinsic Function", + "startLine": 36, "startColumn": 11, - "endLine": 25, - "endColumn": 19, - "ruleDescription": "Validate statement resources match the actions", - "phase": "LINT" + "endLine": 36, + "endColumn": 34, + "ruleDescription": "Fn::ForEach requires the AWS::LanguageExtensions transform", + "phase": "PARSE" + } + ] + }, + "bad/functions/get_stack_output.json": { + "filePath": "bad/functions/get_stack_output.json", + "status": "OK", + "metadata": { + "resourcesScanned": 4, + "counts": { + "fatal": 0, + "errors": 4, + "warnings": 0, + "informational": 4, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I3510", - "severity": "INFO", - "message": "action 'iam:GetLoginProfile' requires a resource of ['arn:${Partition}:iam::${Account}:user/.*']", - "source": "CFN_LINT", + "ruleId": "E1033", + "severity": "ERROR", + "message": "'OutputName' is a required property", + "source": "SCHEMA", "entity": { - "logicalId": "myPolicy", + "logicalId": "Topic1", "entityType": "Resource", - "resourceType": "AWS::IAM::Policy" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.PolicyDocument.Statement.1.NotResource", - "category": "Security", - "startLine": 29, + "propertyPath": "Properties.DisplayName.Fn::GetStackOutput", + "category": "Intrinsic Function", + "startLine": 8, "startColumn": 11, - "endLine": 29, - "endColumn": 22, - "ruleDescription": "Validate statement resources match the actions", - "phase": "LINT" + "endLine": 8, + "endColumn": 30, + "ruleDescription": "GetStackOutput validation of parameters", + "phase": "PARSE" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E1033", + "severity": "ERROR", + "message": "'StackName' is a required property", + "source": "SCHEMA", "entity": { - "logicalId": "myInstance", + "logicalId": "Topic2", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Best Practice", - "startLine": 11, - "startColumn": 7, - "endLine": 11, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "propertyPath": "Properties.DisplayName.Fn::GetStackOutput", + "category": "Intrinsic Function", + "startLine": 18, + "startColumn": 11, + "endLine": 18, + "endColumn": 30, + "ruleDescription": "GetStackOutput validation of parameters", + "phase": "PARSE" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'AdditionalInfo' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "E1033", + "severity": "ERROR", + "message": "'invalid' is not of type 'object'", + "source": "SCHEMA", "entity": { - "logicalId": "myInstance", + "logicalId": "Topic3", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.AdditionalInfo", - "category": "Best Practice", - "startLine": 12, - "startColumn": 7, - "endLine": 12, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only", - "resolutionSource": "dynamic (Sub:${AMIId})" - } + "propertyPath": "Properties.DisplayName.Fn::GetStackOutput", + "category": "Intrinsic Function", + "startLine": 28, + "startColumn": 11, + "endLine": 28, + "endColumn": 30, + "ruleDescription": "GetStackOutput validation of parameters", + "phase": "PARSE" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'TopicName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E1033", + "severity": "ERROR", + "message": "Additional properties are not allowed ('BadKey' was unexpected)", + "source": "SCHEMA", "entity": { - "logicalId": "mySnsTopic", + "logicalId": "Topic4", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.TopicName", - "category": "Best Practice", - "startLine": 33, - "startColumn": 7, - "endLine": 33, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sns", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "propertyPath": "Properties.DisplayName.Fn::GetStackOutput.BadKey", + "category": "Intrinsic Function", + "startLine": 39, + "startColumn": 13, + "endLine": 39, + "endColumn": 20, + "ruleDescription": "GetStackOutput validation of parameters", + "phase": "PARSE" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'myInstance' of type 'AWS::EC2::Instance' supports Tags but none are configured", + "message": "Resource 'Topic1' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "myInstance", + "logicalId": "Topic1", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 10, - "startColumn": 5, - "endLine": 10, - "endColumn": 15, + "startLine": 6, + "startColumn": 7, + "endLine": 6, + "endColumn": 18, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'mySnsTopic' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Topic2' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "mySnsTopic", + "logicalId": "Topic2", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 32, - "startColumn": 5, - "endLine": 32, - "endColumn": 15, + "startLine": 16, + "startColumn": 7, + "endLine": 16, + "endColumn": 18, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'TestBadStateMachine1' of type 'AWS::StepFunctions::StateMachine' supports Tags but none are configured", + "message": "Resource 'Topic3' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "TestBadStateMachine1", + "logicalId": "Topic3", "entityType": "Resource", - "resourceType": "AWS::StepFunctions::StateMachine" + "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 37, - "startColumn": 5, - "endLine": 37, - "endColumn": 15, + "startLine": 26, + "startColumn": 7, + "endLine": 26, + "endColumn": 18, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'TestBadStateMachine2' of type 'AWS::StepFunctions::StateMachine' supports Tags but none are configured", + "message": "Resource 'Topic4' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "TestBadStateMachine2", + "logicalId": "Topic4", "entityType": "Resource", - "resourceType": "AWS::StepFunctions::StateMachine" + "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 58, - "startColumn": 5, - "endLine": 58, - "endColumn": 15, + "startLine": 34, + "startColumn": 7, + "endLine": 34, + "endColumn": 18, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "bad/functions/tojsonstring_no_transform.yaml": { - "filePath": "bad/functions/tojsonstring_no_transform.yaml", + "bad/functions/get_stack_output.yaml": { + "filePath": "bad/functions/get_stack_output.yaml", "status": "OK", "metadata": { - "resourcesScanned": 1, + "resourcesScanned": 5, "counts": { - "fatal": 3, - "errors": 0, + "fatal": 0, + "errors": 4, "warnings": 0, - "informational": 1, + "informational": 8, "debug": 0 }, "suppressed": 0, @@ -1766,92 +1886,247 @@ }, "diagnostics": [ { - "ruleId": "F1031", - "severity": "FATAL", - "message": "Fn::ToJsonString requires the AWS::LanguageExtensions transform, but it is not declared. Add 'Transform: AWS::LanguageExtensions' to use it", + "ruleId": "E1033", + "severity": "ERROR", + "message": "'OutputName' is a required property", "source": "SCHEMA", "entity": { - "logicalId": "Topic", + "logicalId": "Topic1", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.DisplayName", + "propertyPath": "Properties.DisplayName.Fn::GetStackOutput", "category": "Intrinsic Function", - "startLine": 10, - "startColumn": 7, - "endLine": 10, - "endColumn": 18, - "ruleDescription": "Fn::ToJsonString requires the AWS::LanguageExtensions transform", + "startLine": 8, + "startColumn": 9, + "endLine": 8, + "endColumn": 27, + "ruleDescription": "GetStackOutput validation of parameters", "phase": "PARSE" }, { - "ruleId": "F1031", - "severity": "FATAL", - "message": "Fn::ToJsonString requires the AWS::LanguageExtensions transform, but it is not declared. Add 'Transform: AWS::LanguageExtensions' to use it", + "ruleId": "E1033", + "severity": "ERROR", + "message": "'StackName' is a required property", "source": "SCHEMA", "entity": { - "logicalId": "Topic", + "logicalId": "Topic2", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Metadata.Custom", + "propertyPath": "Properties.DisplayName.Fn::GetStackOutput", "category": "Intrinsic Function", - "startLine": 14, - "startColumn": 7, - "endLine": 14, - "endColumn": 13, - "ruleDescription": "Fn::ToJsonString requires the AWS::LanguageExtensions transform", + "startLine": 15, + "startColumn": 9, + "endLine": 15, + "endColumn": 27, + "ruleDescription": "GetStackOutput validation of parameters", "phase": "PARSE" }, { - "ruleId": "F1031", - "severity": "FATAL", - "message": "Fn::ToJsonString requires the AWS::LanguageExtensions transform, but it is not declared. Add 'Transform: AWS::LanguageExtensions' to use it", + "ruleId": "E1033", + "severity": "ERROR", + "message": "'invalid' is not of type 'object'", "source": "SCHEMA", "entity": { - "logicalId": "JsonOutput", - "entityType": "Output" + "logicalId": "Topic3", + "entityType": "Resource", + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Outputs/JsonOutput/Value", + "propertyPath": "Properties.DisplayName.Fn::GetStackOutput", "category": "Intrinsic Function", - "startLine": 19, - "startColumn": 5, - "endLine": 19, - "endColumn": 10, - "ruleDescription": "Fn::ToJsonString requires the AWS::LanguageExtensions transform", + "startLine": 22, + "startColumn": 9, + "endLine": 22, + "endColumn": 27, + "ruleDescription": "GetStackOutput validation of parameters", "phase": "PARSE" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Topic' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "ruleId": "E1033", + "severity": "ERROR", + "message": "Additional properties are not allowed ('BadKey' was unexpected)", + "source": "SCHEMA", + "entity": { + "logicalId": "Topic4", + "entityType": "Resource", + "resourceType": "AWS::SNS::Topic" + }, + "propertyPath": "Properties.DisplayName.Fn::GetStackOutput.BadKey", + "category": "Intrinsic Function", + "startLine": 31, + "startColumn": 11, + "endLine": 31, + "endColumn": 17, + "ruleDescription": "GetStackOutput validation of parameters", + "phase": "PARSE" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "Topic5", + "entityType": "Resource", + "resourceType": "AWS::SQS::Queue" + }, + "category": "Best Practice", + "startLine": 33, + "startColumn": 3, + "endLine": 33, + "endColumn": 9, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "Topic5", + "entityType": "Resource", + "resourceType": "AWS::SQS::Queue" + }, + "category": "Best Practice", + "startLine": 33, + "startColumn": 3, + "endLine": 33, + "endColumn": 9, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3013", + "severity": "INFO", + "message": "'MessageRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "Topic5", + "entityType": "Resource", + "resourceType": "AWS::SQS::Queue" + }, + "propertyPath": "Properties", + "category": "Best Practice", + "startLine": 35, + "startColumn": 5, + "endLine": 35, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Topic1' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Topic", + "logicalId": "Topic1", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 9, + "startLine": 6, "startColumn": 5, - "endLine": 9, + "endLine": 6, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Topic2' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "Topic2", + "entityType": "Resource", + "resourceType": "AWS::SNS::Topic" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 13, + "startColumn": 5, + "endLine": 13, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Topic3' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "Topic3", + "entityType": "Resource", + "resourceType": "AWS::SNS::Topic" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 20, + "startColumn": 5, + "endLine": 20, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Topic4' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "Topic4", + "entityType": "Resource", + "resourceType": "AWS::SNS::Topic" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 26, + "startColumn": 5, + "endLine": 26, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Topic5' of type 'AWS::SQS::Queue' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "Topic5", + "entityType": "Resource", + "resourceType": "AWS::SQS::Queue" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 35, + "startColumn": 5, + "endLine": 35, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "bad/functions_base64.yaml": { - "filePath": "bad/functions_base64.yaml", + "bad/functions/import_value.yaml": { + "filePath": "bad/functions/import_value.yaml", "status": "OK", "metadata": { "resourcesScanned": 1, "counts": { - "fatal": 2, - "errors": 2, - "warnings": 0, + "fatal": 0, + "errors": 1, + "warnings": 1, "informational": 3, "debug": 0 }, @@ -1861,138 +2136,96 @@ }, "diagnostics": [ { - "ruleId": "F1012", - "severity": "FATAL", - "message": "Fn::FindInMap references non-existent mapping 'amimap'", + "ruleId": "E8003", + "severity": "ERROR", + "message": "Fn::Equals: argument 1: {'Fn::ImportValue': 'PrimaryRegion'} is not of type 'string'", "source": "SCHEMA", "entity": { - "logicalId": "myInstance", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "logicalId": "primaryRegion", + "entityType": "Condition" }, + "propertyPath": "Conditions/primaryRegion/Fn::Equals", "category": "Intrinsic Function", - "startLine": 6, + "startLine": 4, "startColumn": 3, - "endLine": 6, + "endLine": 4, "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "FindInMap map name must exist in Mappings", - "phase": "SCHEMA" + "ruleDescription": "Fn::Equals must take exactly two scalar operands", + "phase": "PARSE" }, { - "ruleId": "F3004", - "severity": "FATAL", - "message": "Circular Dependencies for resource myInstance. Circular dependency with [myInstance -> myInstance]", - "source": "SCHEMA", + "ruleId": "W8001", + "severity": "WARN", + "message": "Condition 'primaryRegion' is not used by any resource or Fn::If", + "source": "CFN_LINT", "entity": { - "logicalId": "myInstance", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "logicalId": "primaryRegion", + "entityType": "Condition" }, - "propertyPath": "Resources/myInstance", - "category": "Reference", - "startLine": 6, + "propertyPath": "Conditions/primaryRegion", + "category": "Best Practice", + "startLine": 4, "startColumn": 3, - "endLine": 6, - "endColumn": 13, - "ruleDescription": "Circular dependency detected", + "endLine": 4, + "endColumn": 16, + "ruleDescription": "Check if Conditions are Used", "phase": "LINT" }, - { - "ruleId": "E1011", - "severity": "ERROR", - "message": "'Fn::GetAtt' is not supported as an argument to 'Fn::FindInMap'", - "source": "SCHEMA", - "entity": { - "logicalId": "myInstance", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.ImageId.Fn::FindInMap.2", - "category": "Intrinsic Function", - "startLine": 9, - "startColumn": 65, - "endLine": 9, - "endColumn": 66, - "ruleDescription": "Fn::FindInMap operands must be strings or one of Ref/Fn::FindInMap", - "phase": "PARSE" - }, - { - "ruleId": "E1021", - "severity": "ERROR", - "message": "['Random String'] is not of type 'string'", - "source": "SCHEMA", - "entity": { - "logicalId": "myInstance", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.UserData.Fn::Base64", - "category": "Intrinsic Function", - "startLine": 11, - "startColumn": 9, - "endLine": 11, - "endColumn": 19, - "ruleDescription": "Fn::Base64 argument must be a string or a string-producing intrinsic", - "phase": "PARSE" - }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "myInstance", + "logicalId": "subnet", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", "startLine": 9, "startColumn": 7, "endLine": 9, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "dynamic (mapping 'amimap' not found)" + "resolutionSource": "dynamic (cross-stack import)" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "myInstance", + "logicalId": "subnet", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.UserData", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 10, + "startLine": 12, "startColumn": 7, - "endLine": 10, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 12, + "endColumn": 12, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only", - "resolutionSource": "dynamic (Base64 with non-string argument)" + "lifecycle": "create-only", + "resolutionSource": "dynamic (cross-stack import)" } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'myInstance' of type 'AWS::EC2::Instance' supports Tags but none are configured", + "message": "Resource 'subnet' of type 'AWS::EC2::Subnet' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "myInstance", + "logicalId": "subnet", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::EC2::Subnet" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", @@ -2006,16 +2239,16 @@ } ] }, - "bad/functions_findinmap_enhanced_invalid_key.yaml": { - "filePath": "bad/functions_findinmap_enhanced_invalid_key.yaml", + "bad/functions/length_no_transform.yaml": { + "filePath": "bad/functions/length_no_transform.yaml", "status": "OK", "metadata": { "resourcesScanned": 1, "counts": { - "fatal": 0, - "errors": 1, + "fatal": 1, + "errors": 0, "warnings": 0, - "informational": 2, + "informational": 4, "debug": 0 }, "suppressed": 0, @@ -2024,427 +2257,293 @@ }, "diagnostics": [ { - "ruleId": "E7001", - "severity": "ERROR", - "message": "Mapping 'MapName'.'TopKey1' key '{\"To\":\"Json\",\"String\":\"Function\"}' does not match format '^[a-zA-Z0-9]+$'", - "source": "CFN_LINT", + "ruleId": "F1030", + "severity": "FATAL", + "message": "Fn::Length requires the AWS::LanguageExtensions transform, but it is not declared. Add 'Transform: AWS::LanguageExtensions' to use it", + "source": "SCHEMA", "entity": { - "logicalId": "MapName", - "entityType": "Mapping" + "logicalId": "Queue", + "entityType": "Resource", + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Mappings/MapName/TopKey1/{\"To\":\"Json\",\"String\":\"Function\"}", - "category": "Structure", - "startLine": 6, + "propertyPath": "Properties.DelaySeconds", + "category": "Intrinsic Function", + "startLine": 13, "startColumn": 7, - "endLine": 6, - "endColumn": 40, - "ruleDescription": "Mappings are appropriately configured", + "endLine": 13, + "endColumn": 19, + "ruleDescription": "Fn::Length requires the AWS::LanguageExtensions transform", + "phase": "PARSE" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "Queue", + "entityType": "Resource", + "resourceType": "AWS::SQS::Queue" + }, + "category": "Best Practice", + "startLine": 10, + "startColumn": 3, + "endLine": 10, + "endColumn": 8, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'ClusterName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "Cluster", + "logicalId": "Queue", "entityType": "Resource", - "resourceType": "AWS::ECS::Cluster" + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Properties.ClusterName", "category": "Best Practice", - "startLine": 11, - "startColumn": 7, - "endLine": 11, - "endColumn": 18, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 10, + "startColumn": 3, + "endLine": 10, + "endColumn": 8, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3013", + "severity": "INFO", + "message": "'MessageRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "Queue", + "entityType": "Resource", + "resourceType": "AWS::SQS::Queue" + }, + "propertyPath": "Properties", + "category": "Best Practice", + "startLine": 12, + "startColumn": 5, + "endLine": 12, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Cluster' of type 'AWS::ECS::Cluster' supports Tags but none are configured", + "message": "Resource 'Queue' of type 'AWS::SQS::Queue' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Cluster", + "logicalId": "Queue", "entityType": "Resource", - "resourceType": "AWS::ECS::Cluster" + "resourceType": "AWS::SQS::Queue" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 10, + "startLine": 12, "startColumn": 5, - "endLine": 10, + "endLine": 12, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "bad/functions_getaz.yaml": { - "filePath": "bad/functions_getaz.yaml", + "bad/functions/relationship_conditions.yaml": { + "filePath": "bad/functions/relationship_conditions.yaml", "status": "OK", "metadata": { - "resourcesScanned": 3, + "resourcesScanned": 5, "counts": { - "fatal": 1, - "errors": 4, - "warnings": 3, - "informational": 12, + "fatal": 0, + "errors": 1, + "warnings": 7, + "informational": 6, "debug": 0 }, - "suppressed": 1, + "suppressed": 0, "strict": false, "severityLevel": "DEBUG" }, "diagnostics": [ { - "ruleId": "F3004", - "severity": "FATAL", - "message": "Circular Dependencies for resource mySubnet1. Circular dependency with [mySubnet1 -> mySubnet1]", - "source": "SCHEMA", + "ruleId": "E2533", + "severity": "ERROR", + "message": "Runtime 'nodejs4.3' was deprecated on '2020-03-05'. Creation was disabled on '2020-02-03', and updates were disabled on '2020-03-05'. Please consider updating to 'nodejs24.x'", + "source": "CFN_LINT", "entity": { - "logicalId": "mySubnet1", + "logicalId": "AMIIDLookup", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Resources/mySubnet1", - "category": "Reference", - "startLine": 10, - "startColumn": 3, - "endLine": 10, - "endColumn": 12, - "ruleDescription": "Circular dependency detected", - "phase": "LINT" + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 44, + "startColumn": 7, + "endLine": 44, + "endColumn": 14, + "ruleDescription": "Check if Lambda Function Runtimes are updatable", + "phase": "SCHEMA", + "context": { + "actualValue": "nodejs4.3", + "lifecycle": "end-of-life" + } }, { - "ruleId": "E1017", - "severity": "ERROR", - "message": "'us-east-1a' is not a valid region for Fn::GetAZs (use '' for the current region)", - "source": "SCHEMA", + "ruleId": "W1001", + "severity": "WARN", + "message": "Reference to 'LambdaExecutionRole' which is conditional on 'isPrimary' - target may not exist", + "source": "CFN_LINT", "entity": { - "logicalId": "mySubnet2", + "logicalId": "InstanceProfile", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::IAM::InstanceProfile" }, - "propertyPath": "Properties.AvailabilityZone.Fn::Select.1.Fn::GetAZs", - "category": "Intrinsic Function", - "startLine": 27, - "startColumn": 13, - "endLine": 27, - "endColumn": 23, - "ruleDescription": "Fn::Select requires exactly two operands and a list source", - "phase": "PARSE" + "propertyPath": "Properties.Roles.0", + "suggestedFix": "Add a Condition to the referencing resource that implies the target's condition", + "category": "Best Practice", + "startLine": 32, + "startColumn": 14, + "endLine": 32, + "endColumn": 15, + "ruleDescription": "Ref/GetAtt to resource that is available when conditions are applied", + "phase": "LINT" }, { - "ruleId": "E3060", - "severity": "ERROR", - "message": "'10.0.0.0/24' overlaps with '10.0.0.0/24'", + "ruleId": "W1001", + "severity": "WARN", + "message": "Reference to 'LambdaExecutionRole' which is conditional on 'isPrimary' - target may not exist", "source": "CFN_LINT", "entity": { - "logicalId": "mySubnet2", + "logicalId": "AMIIDLookup", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.CidrBlock", - "category": "Resource", - "startLine": 23, + "propertyPath": "Properties.Role", + "suggestedFix": "Add a Condition to the referencing resource that implies the target's condition", + "category": "Best Practice", + "startLine": 37, "startColumn": 7, - "endLine": 23, - "endColumn": 16, - "relatedResources": [ - { - "resource": { - "id": "mySubnet1", - "resourceType": "AWS::EC2::Subnet" - }, - "location": { - "startLine": 10, - "startColumn": 3, - "endLine": 10, - "endColumn": 12 - }, - "message": "Overlapping subnet CIDR 10.0.0.0/24" - } - ], - "ruleDescription": "Validate subnet CIDRs do not overlap with other subnets", - "phase": "LINT", - "context": { - "extra": { - "cidr": "10.0.0.0/24" - } - } - }, - { - "ruleId": "E3060", - "severity": "ERROR", - "message": "'10.0.0.0/24' overlaps with '10.0.0.0/24'", - "source": "CFN_LINT", - "entity": { - "logicalId": "mySubnet3", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.CidrBlock", - "category": "Resource", - "startLine": 32, - "startColumn": 7, - "endLine": 32, - "endColumn": 16, - "relatedResources": [ - { - "resource": { - "id": "mySubnet1", - "resourceType": "AWS::EC2::Subnet" - }, - "location": { - "startLine": 10, - "startColumn": 3, - "endLine": 10, - "endColumn": 12 - }, - "message": "Overlapping subnet CIDR 10.0.0.0/24" - } - ], - "ruleDescription": "Validate subnet CIDRs do not overlap with other subnets", - "phase": "LINT", - "context": { - "extra": { - "cidr": "10.0.0.0/24" - } - } - }, - { - "ruleId": "E9004", - "severity": "ERROR", - "message": "'AvailbilityZone' is not one of ['AssignIpv6AddressOnCreation', 'AvailabilityZone', 'AvailabilityZoneId', 'BlockPublicAccessStates', 'BlockPublicAccessStates.InternetGatewayBlockMode', 'CidrBlock', 'EnableDns64', 'EnableLniAtDeviceIndex', 'Ipv4IpamPoolId', 'Ipv4NetmaskLength', 'Ipv6CidrBlock', 'Ipv6CidrBlocks', 'Ipv6IpamPoolId', 'Ipv6Native', 'Ipv6NetmaskLength', 'MapPublicIpOnLaunch', 'NetworkAclAssociationId', 'OutpostArn', 'PrivateDnsNameOptionsOnLaunch.EnableResourceNameDnsAAAARecord', 'PrivateDnsNameOptionsOnLaunch.EnableResourceNameDnsARecord', 'PrivateDnsNameOptionsOnLaunch.HostnameType', 'SubnetId', 'Tags', 'VpcId']", - "source": "SCHEMA", - "entity": { - "logicalId": "mySubnet3", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.AvailabilityZone", - "suggestedFix": "Check the resource type documentation for valid GetAtt attributes", - "category": "Intrinsic Function", - "startLine": 33, - "startColumn": 7, - "endLine": 33, - "endColumn": 23, - "ruleDescription": "GetAtt attribute must exist on target resource type", + "endLine": 37, + "endColumn": 11, + "ruleDescription": "Ref/GetAtt to resource that is available when conditions are applied", "phase": "LINT" }, { - "ruleId": "W1030", + "ruleId": "W1001", "severity": "WARN", - "message": "{'Ref': 'VPC'} is not a 'AWS::EC2::VPC.Id' with pattern '^vpc-(([0-9A-Fa-f]{8})|([0-9A-Fa-f]{17}))$' when 'Ref' is resolved", + "message": "Reference to 'LambdaExecutionRole' which is conditional on 'isPrimary' - target may not exist", "source": "CFN_LINT", "entity": { - "logicalId": "mySubnet1", + "logicalId": "SubCondRefParam", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::SSM::Parameter" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.Value", + "suggestedFix": "Add a Condition to the referencing resource that implies the target's condition", "category": "Best Practice", - "startLine": 13, + "startLine": 53, "startColumn": 7, - "endLine": 13, + "endLine": 53, "endColumn": 12, - "ruleDescription": "Validate the values that come from a Ref function", + "ruleDescription": "Ref/GetAtt to resource that is available when conditions are applied", "phase": "LINT" }, { - "ruleId": "W1030", + "ruleId": "W1001", "severity": "WARN", - "message": "{'Ref': 'VPC'} is not a 'AWS::EC2::VPC.Id' with pattern '^vpc-(([0-9A-Fa-f]{8})|([0-9A-Fa-f]{17}))$' when 'Ref' is resolved", + "message": "Reference to 'LambdaExecutionRole' which is conditional on 'isPrimary' - target may not exist", "source": "CFN_LINT", "entity": { - "logicalId": "mySubnet2", + "logicalId": "SubCondGetAttParam", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::SSM::Parameter" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.Value", + "suggestedFix": "Add a Condition to the referencing resource that implies the target's condition", "category": "Best Practice", - "startLine": 22, + "startLine": 59, "startColumn": 7, - "endLine": 22, + "endLine": 59, "endColumn": 12, - "ruleDescription": "Validate the values that come from a Ref function", + "ruleDescription": "Ref/GetAtt to resource that is available when conditions are applied", "phase": "LINT" }, { - "ruleId": "W1030", + "ruleId": "W1001", "severity": "WARN", - "message": "{'Ref': 'VPC'} is not a 'AWS::EC2::VPC.Id' with pattern '^vpc-(([0-9A-Fa-f]{8})|([0-9A-Fa-f]{17}))$' when 'Ref' is resolved", + "message": "Reference to 'LambdaExecutionRole' which is conditional on 'isPrimary' - target may not exist", "source": "CFN_LINT", "entity": { - "logicalId": "mySubnet3", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "logicalId": "lambdaArn", + "entityType": "Output" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Outputs/lambdaArn/Value.Fn::GetAtt", + "suggestedFix": "Add a Condition to the output that implies the target's condition", "category": "Best Practice", - "startLine": 31, - "startColumn": 7, - "endLine": 31, + "startLine": 62, + "startColumn": 3, + "endLine": 62, "endColumn": 12, - "ruleDescription": "Validate the values that come from a Ref function", + "ruleDescription": "Ref/GetAtt to resource that is available when conditions are applied", "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "mySubnet1", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.VpcId", - "category": "Best Practice", - "startLine": 13, - "startColumn": 7, - "endLine": 13, - "endColumn": 12, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "mySubnet1", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.CidrBlock", - "category": "Best Practice", - "startLine": 14, - "startColumn": 7, - "endLine": 14, - "endColumn": 16, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "mySubnet1", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.AvailabilityZone", - "category": "Best Practice", - "startLine": 15, - "startColumn": 7, - "endLine": 15, - "endColumn": 23, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "dynamic (Select with unresolvable arguments)" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W8001", + "severity": "WARN", + "message": "Condition 'isProduction' is not used by any resource or Fn::If", + "source": "CFN_LINT", "entity": { - "logicalId": "mySubnet2", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "logicalId": "isProduction", + "entityType": "Condition" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Conditions/isProduction", "category": "Best Practice", - "startLine": 22, - "startColumn": 7, - "endLine": 22, - "endColumn": 12, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 7, + "startColumn": 3, + "endLine": 7, + "endColumn": 15, + "ruleDescription": "Check if Conditions are Used", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W8001", + "severity": "WARN", + "message": "Condition 'isDevelopment' is not used by any resource or Fn::If", + "source": "CFN_LINT", "entity": { - "logicalId": "mySubnet2", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "logicalId": "isDevelopment", + "entityType": "Condition" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Conditions/isDevelopment", "category": "Best Practice", - "startLine": 23, - "startColumn": 7, - "endLine": 23, + "startLine": 8, + "startColumn": 3, + "endLine": 8, "endColumn": 16, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "mySubnet2", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.AvailabilityZone", - "category": "Best Practice", - "startLine": 24, - "startColumn": 7, - "endLine": 24, - "endColumn": 23, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "dynamic (Select with unresolvable arguments)" - } + "ruleDescription": "Check if Conditions are Used", + "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "message": "Property 'Path' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "mySubnet3", + "logicalId": "LambdaExecutionRole", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.Path", "category": "Best Practice", - "startLine": 31, + "startLine": 26, "startColumn": 7, - "endLine": 31, - "endColumn": 12, + "endLine": 26, + "endColumn": 11, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -2454,19 +2553,19 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Property 'Path' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "mySubnet3", + "logicalId": "InstanceProfile", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::IAM::InstanceProfile" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Properties.Path", "category": "Best Practice", - "startLine": 32, + "startLine": 30, "startColumn": 7, - "endLine": 32, - "endColumn": 16, + "endLine": 30, + "endColumn": 11, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -2474,44 +2573,41 @@ } }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", + "message": "Resource 'LambdaExecutionRole' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "mySubnet3", + "logicalId": "LambdaExecutionRole", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.AvailabilityZone", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 33, - "startColumn": 7, - "endLine": 33, - "endColumn": 23, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "dynamic (Select with unresolvable arguments)" - } + "startLine": 14, + "startColumn": 5, + "endLine": 14, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'mySubnet1' of type 'AWS::EC2::Subnet' supports Tags but none are configured", + "message": "Resource 'AMIIDLookup' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "mySubnet1", + "logicalId": "AMIIDLookup", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::Lambda::Function" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 12, + "startLine": 35, "startColumn": 5, - "endLine": 12, + "endLine": 35, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -2519,19 +2615,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'mySubnet2' of type 'AWS::EC2::Subnet' supports Tags but none are configured", + "message": "Resource 'SubCondRefParam' of type 'AWS::SSM::Parameter' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "mySubnet2", + "logicalId": "SubCondRefParam", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::SSM::Parameter" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 21, + "startLine": 51, "startColumn": 5, - "endLine": 21, + "endLine": 51, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -2539,35 +2635,35 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'mySubnet3' of type 'AWS::EC2::Subnet' supports Tags but none are configured", + "message": "Resource 'SubCondGetAttParam' of type 'AWS::SSM::Parameter' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "mySubnet3", + "logicalId": "SubCondGetAttParam", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::SSM::Parameter" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 30, + "startLine": 57, "startColumn": 5, - "endLine": 30, + "endLine": 57, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "bad/functions_join.yaml": { - "filePath": "bad/functions_join.yaml", + "bad/functions/sub_needed.yaml": { + "filePath": "bad/functions/sub_needed.yaml", "status": "OK", "metadata": { - "resourcesScanned": 2, + "resourcesScanned": 5, "counts": { "fatal": 0, - "errors": 2, - "warnings": 0, - "informational": 6, + "errors": 10, + "warnings": 4, + "informational": 9, "debug": 0 }, "suppressed": 0, @@ -2576,9 +2672,9 @@ }, "diagnostics": [ { - "ruleId": "E1152", + "ruleId": "E1029", "severity": "ERROR", - "message": "'ami-1234' does not match format 'AWS::EC2::Image.Id'", + "message": "Found an embedded parameter '${AMIId}' outside of an 'Fn::Sub' at Properties.ImageId", "source": "CFN_LINT", "entity": { "logicalId": "myInstance", @@ -2586,551 +2682,325 @@ "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", + "suggestedFix": "Wrap the string with Fn::Sub", "category": "Intrinsic Function", - "startLine": 9, + "startLine": 11, "startColumn": 7, - "endLine": 9, + "endLine": 11, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-1234" - } + "ruleDescription": "Substitution variable ${X} requires Fn::Sub", + "phase": "LINT" }, { - "ruleId": "E1152", + "ruleId": "E1029", "severity": "ERROR", - "message": "'ami-1234' does not match format 'AWS::EC2::Image.Id'", + "message": "Found an embedded parameter '${AMIId}' outside of an 'Fn::Sub' at Properties.PolicyDocument.Statement.0.Resource", "source": "CFN_LINT", "entity": { - "logicalId": "myInstance2", + "logicalId": "myPolicy", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::IAM::Policy" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Properties.PolicyDocument.Statement.0.Resource", + "suggestedFix": "Wrap the string with Fn::Sub", "category": "Intrinsic Function", - "startLine": 19, - "startColumn": 7, - "endLine": 19, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-1234" - } + "startLine": 25, + "startColumn": 11, + "endLine": 25, + "endColumn": 19, + "ruleDescription": "Substitution variable ${X} requires Fn::Sub", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E1029", + "severity": "ERROR", + "message": "Found an embedded parameter '${AWS::AccountId}' outside of an 'Fn::Sub' at Properties.PolicyDocument.Statement.0.Resource", + "source": "CFN_LINT", "entity": { - "logicalId": "myInstance", + "logicalId": "myPolicy", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::IAM::Policy" }, - "propertyPath": "Properties.ImageId", - "category": "Best Practice", - "startLine": 9, - "startColumn": 7, - "endLine": 9, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "propertyPath": "Properties.PolicyDocument.Statement.0.Resource", + "suggestedFix": "Wrap the string with Fn::Sub", + "category": "Intrinsic Function", + "startLine": 25, + "startColumn": 11, + "endLine": 25, + "endColumn": 19, + "ruleDescription": "Substitution variable ${X} requires Fn::Sub", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "E1029", + "severity": "ERROR", + "message": "Found an embedded parameter '${AMIId}' outside of an 'Fn::Sub' at Properties.PolicyDocument.Statement.1.NotResource", + "source": "CFN_LINT", "entity": { - "logicalId": "myInstance", + "logicalId": "myPolicy", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::IAM::Policy" }, - "propertyPath": "Properties.UserData", - "category": "Best Practice", - "startLine": 10, - "startColumn": 7, - "endLine": 10, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only", - "resolutionSource": "dynamic (Base64 with non-string argument)" - } + "propertyPath": "Properties.PolicyDocument.Statement.1.NotResource", + "suggestedFix": "Wrap the string with Fn::Sub", + "category": "Intrinsic Function", + "startLine": 29, + "startColumn": 11, + "endLine": 29, + "endColumn": 22, + "ruleDescription": "Substitution variable ${X} requires Fn::Sub", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E1029", + "severity": "ERROR", + "message": "Found an embedded parameter '${AWS::AccountId}' outside of an 'Fn::Sub' at Properties.PolicyDocument.Statement.1.NotResource", + "source": "CFN_LINT", "entity": { - "logicalId": "myInstance2", + "logicalId": "myPolicy", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::IAM::Policy" }, - "propertyPath": "Properties.ImageId", - "category": "Best Practice", - "startLine": 19, - "startColumn": 7, - "endLine": 19, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "myInstance2", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.UserData", - "category": "Best Practice", - "startLine": 20, - "startColumn": 7, - "endLine": 20, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only", - "resolutionSource": "dynamic (Base64 with unresolvable argument)" - } - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'myInstance' of type 'AWS::EC2::Instance' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "myInstance", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 8, - "startColumn": 5, - "endLine": 8, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'myInstance2' of type 'AWS::EC2::Instance' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "myInstance2", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 18, - "startColumn": 5, - "endLine": 18, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "propertyPath": "Properties.PolicyDocument.Statement.1.NotResource", + "suggestedFix": "Wrap the string with Fn::Sub", + "category": "Intrinsic Function", + "startLine": 29, + "startColumn": 11, + "endLine": 29, + "endColumn": 22, + "ruleDescription": "Substitution variable ${X} requires Fn::Sub", "phase": "LINT" - } - ] - }, - "bad/functions_ref.yaml": { - "filePath": "bad/functions_ref.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 4, - "counts": { - "fatal": 6, - "errors": 4, - "warnings": 5, - "informational": 23, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "F1018", - "severity": "FATAL", - "message": "Fn::Sub variable '${Package}' does not reference a valid resource, parameter, or pseudo-parameter", - "source": "SCHEMA", + "ruleId": "E1029", + "severity": "ERROR", + "message": "Found an embedded parameter '${definition_substitution_1}' outside of an 'Fn::Sub' at Properties.DefinitionString.Fn::Join.1.5", + "source": "CFN_LINT", "entity": { - "logicalId": "MyEC2Instance", + "logicalId": "TestBadStateMachine1", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::StepFunctions::StateMachine" }, - "propertyPath": "Properties.UserData", + "propertyPath": "Properties.DefinitionString.Fn::Join.1.5", + "suggestedFix": "Wrap the string with Fn::Sub", "category": "Intrinsic Function", "startLine": 46, - "startColumn": 7, - "endLine": 46, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Sub variables must resolve", - "phase": "SCHEMA", - "context": { - "resolutionSource": "dynamic (Sub:yum install ${Package}\n)" - } - }, - { - "ruleId": "F1020", - "severity": "FATAL", - "message": "'pIops' is not one of ['AWS::AccountId', 'AWS::NoValue', 'AWS::NotificationARNs', 'AWS::Partition', 'AWS::Region', 'AWS::StackId', 'AWS::StackName', 'AWS::URLSuffix', 'AnotherInstance', 'MyEC2Instance', 'mySecurityGroupVpc1', 'mySecurityGroupVpc2', 'myVpcId']", - "source": "SCHEMA", - "entity": { - "logicalId": "MyEC2Instance", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.BlockDeviceMappings.0.Ebs.Iops", - "suggestedFix": "Check that the Ref target exists as a resource, parameter, or pseudo-parameter", - "category": "Intrinsic Function", - "startLine": 40, "startColumn": 13, - "endLine": 40, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Ref/GetAtt target must exist", - "phase": "SCHEMA" + "endLine": 46, + "endColumn": 14, + "ruleDescription": "Substitution variable ${X} requires Fn::Sub", + "phase": "LINT" }, { - "ruleId": "F1020", - "severity": "FATAL", - "message": "'pIops' is not one of ['AWS::AccountId', 'AWS::NoValue', 'AWS::NotificationARNs', 'AWS::Partition', 'AWS::Region', 'AWS::StackId', 'AWS::StackName', 'AWS::URLSuffix', 'AnotherInstance', 'MyEC2Instance', 'mySecurityGroupVpc1', 'mySecurityGroupVpc2', 'myVpcId']", - "source": "SCHEMA", + "ruleId": "E1029", + "severity": "ERROR", + "message": "Found an embedded parameter '${definition_substitution_1}' outside of an 'Fn::Sub' at Properties.DefinitionString.Fn::Join.1.5", + "source": "CFN_LINT", "entity": { - "logicalId": "AnotherInstance", + "logicalId": "TestBadStateMachine2", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::StepFunctions::StateMachine" }, - "propertyPath": "Properties.BlockDeviceMappings.0.Ebs.Iops", - "suggestedFix": "Check that the Ref target exists as a resource, parameter, or pseudo-parameter", + "propertyPath": "Properties.DefinitionString.Fn::Join.1.5", + "suggestedFix": "Wrap the string with Fn::Sub", "category": "Intrinsic Function", - "startLine": 59, + "startLine": 67, "startColumn": 13, - "endLine": 59, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Ref/GetAtt target must exist", - "phase": "SCHEMA" - }, - { - "ruleId": "F1020", - "severity": "FATAL", - "message": "'httpdPackage' is not one of ['AWS::AccountId', 'AWS::NoValue', 'AWS::NotificationARNs', 'AWS::Partition', 'AWS::Region', 'AWS::StackId', 'AWS::StackName', 'AWS::URLSuffix', 'AnotherInstance', 'MyEC2Instance', 'mySecurityGroupVpc1', 'mySecurityGroupVpc2', 'myVpcId']", - "source": "SCHEMA", - "entity": { - "logicalId": "AnotherInstance", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.UserData", - "suggestedFix": "Check that the Ref target exists as a resource, parameter, or pseudo-parameter", - "category": "Intrinsic Function", - "startLine": 65, - "startColumn": 7, - "endLine": 65, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Ref/GetAtt target must exist", - "phase": "SCHEMA", - "context": { - "resolutionSource": "dynamic (Sub:yum install ${myPackage} ${Package})" - } - }, - { - "ruleId": "F3004", - "severity": "FATAL", - "message": "Circular Dependencies for resource mySecurityGroupVpc1. Circular dependency with [mySecurityGroupVpc1 -> mySecurityGroupVpc2 -> mySecurityGroupVpc1]", - "source": "SCHEMA", - "entity": { - "logicalId": "mySecurityGroupVpc1", - "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" - }, - "propertyPath": "Resources/mySecurityGroupVpc1", - "category": "Reference", - "startLine": 8, - "startColumn": 3, - "endLine": 8, - "endColumn": 22, - "ruleDescription": "Circular dependency detected", - "phase": "LINT" - }, - { - "ruleId": "F3004", - "severity": "FATAL", - "message": "Circular Dependencies for resource mySecurityGroupVpc2. Circular dependency with [mySecurityGroupVpc2 -> mySecurityGroupVpc1 -> mySecurityGroupVpc2]", - "source": "SCHEMA", - "entity": { - "logicalId": "mySecurityGroupVpc2", - "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" - }, - "propertyPath": "Resources/mySecurityGroupVpc2", - "category": "Reference", - "startLine": 20, - "startColumn": 3, - "endLine": 20, - "endColumn": 22, - "ruleDescription": "Circular dependency detected", + "endLine": 67, + "endColumn": 14, + "ruleDescription": "Substitution variable ${X} requires Fn::Sub", "phase": "LINT" }, { - "ruleId": "E1150", + "ruleId": "E1152", "severity": "ERROR", - "message": "'sg-1234567' does not match format 'AWS::EC2::SecurityGroup.Id'", + "message": "'${AMIId}' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "mySecurityGroupVpc1", + "logicalId": "myInstance", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.SecurityGroupIngress.0.SourceSecurityGroupId", + "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 16, - "startColumn": 9, - "endLine": 16, - "endColumn": 30, - "ruleDescription": "Validate security group format", + "startLine": 11, + "startColumn": 7, + "endLine": 11, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", "phase": "SCHEMA", "context": { - "actualValue": "sg-1234567" + "actualValue": "${AMIId}" } }, { - "ruleId": "E3687", - "severity": "ERROR", - "message": "['FromPort', 'ToPort'] are required properties when using 'IpProtocol' value 1", - "source": "CFN_LINT", - "entity": { - "logicalId": "mySecurityGroupVpc1", - "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" - }, - "propertyPath": "Properties.SecurityGroupIngress.0", - "category": "Resource", - "startLine": 15, - "startColumn": 19, - "endLine": 15, - "endColumn": 20, - "ruleDescription": "Validate to and from ports based on the protocol", - "phase": "LINT" - }, - { - "ruleId": "E3687", + "ruleId": "E3510", "severity": "ERROR", - "message": "['FromPort', 'ToPort'] are required properties when using 'IpProtocol' value 1", + "message": "'arn:aws:iam::${AWS::AccountId}:user/${aws:username}-${AMIId}' does not match '^(arn:(aws[A-Za-z\\-]*?|[A-Za-z?*\\-]*[?*][A-Za-z?*\\-]*):[^:*?]+:[^:]*(:(?:\\d{12}|\\*|aws)?:.+|)|\\*)$'", "source": "CFN_LINT", "entity": { - "logicalId": "mySecurityGroupVpc1", + "logicalId": "myPolicy", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::IAM::Policy" }, - "propertyPath": "Properties.SecurityGroupIngress.1", + "propertyPath": "Properties.PolicyDocument.Statement.0.Resource", "category": "Resource", - "startLine": 18, - "startColumn": 19, - "endLine": 18, - "endColumn": 20, - "ruleDescription": "Validate to and from ports based on the protocol", + "startLine": 25, + "startColumn": 11, + "endLine": 25, + "endColumn": 19, + "ruleDescription": "Validate identity based IAM policies", "phase": "LINT" }, { - "ruleId": "E3687", + "ruleId": "E3510", "severity": "ERROR", - "message": "['FromPort', 'ToPort'] are required properties when using 'IpProtocol' value 1", + "message": "'arn:aws:iam::${AWS::AccountId}:user/${aws:username}-${AMIId}' does not match '^(arn:(aws[A-Za-z\\-]*?|[A-Za-z?*\\-]*[?*][A-Za-z?*\\-]*):[^:*?]+:[^:]*(:(?:\\d{12}|\\*|aws)?:.+|)|\\*)$'", "source": "CFN_LINT", "entity": { - "logicalId": "mySecurityGroupVpc2", + "logicalId": "myPolicy", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::IAM::Policy" }, - "propertyPath": "Properties.SecurityGroupIngress.0", + "propertyPath": "Properties.PolicyDocument.Statement.1.NotResource", "category": "Resource", - "startLine": 27, - "startColumn": 19, - "endLine": 27, - "endColumn": 20, - "ruleDescription": "Validate to and from ports based on the protocol", + "startLine": 29, + "startColumn": 11, + "endLine": 29, + "endColumn": 22, + "ruleDescription": "Validate identity based IAM policies", "phase": "LINT" }, { - "ruleId": "W9003", - "severity": "WARN", - "message": "1 is not of type 'string' - automatically coerced (number to string)", - "source": "CFN_LINT", - "entity": { - "logicalId": "mySecurityGroupVpc1", - "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" - }, - "propertyPath": "Properties.SecurityGroupIngress.0.IpProtocol", - "category": "Best Practice", - "startLine": 15, - "startColumn": 9, - "endLine": 15, - "endColumn": 19, - "ruleDescription": "Property type coercion warning", - "phase": "SCHEMA" - }, - { - "ruleId": "W9003", + "ruleId": "W9002", "severity": "WARN", - "message": "1 is not of type 'string' - automatically coerced (number to string)", - "source": "CFN_LINT", + "message": "Property 'RoleArn' has a hardcoded ARN - use Ref, GetAtt, or a parameter instead", + "source": "ENGINE", "entity": { - "logicalId": "mySecurityGroupVpc1", + "logicalId": "TestBadStateMachine1", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::StepFunctions::StateMachine" }, - "propertyPath": "Properties.SecurityGroupIngress.1.IpProtocol", + "propertyPath": "Properties.RoleArn", "category": "Best Practice", - "startLine": 18, - "startColumn": 9, - "endLine": 18, - "endColumn": 19, - "ruleDescription": "Property type coercion warning", - "phase": "SCHEMA" + "startLine": 54, + "startColumn": 7, + "endLine": 54, + "endColumn": 14, + "ruleDescription": "Hardcoded ARN property", + "phase": "LINT" }, { - "ruleId": "W9003", + "ruleId": "W9002", "severity": "WARN", - "message": "1 is not of type 'string' - automatically coerced (number to string)", - "source": "CFN_LINT", + "message": "Property 'RoleArn' has a hardcoded ARN - use Ref, GetAtt, or a parameter instead", + "source": "ENGINE", "entity": { - "logicalId": "mySecurityGroupVpc2", + "logicalId": "TestBadStateMachine2", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::StepFunctions::StateMachine" }, - "propertyPath": "Properties.SecurityGroupIngress.0.IpProtocol", + "propertyPath": "Properties.RoleArn", "category": "Best Practice", - "startLine": 27, - "startColumn": 9, - "endLine": 27, - "endColumn": 19, - "ruleDescription": "Property type coercion warning", - "phase": "SCHEMA" + "startLine": 73, + "startColumn": 7, + "endLine": 73, + "endColumn": 14, + "ruleDescription": "Hardcoded ARN property", + "phase": "LINT" }, { - "ruleId": "W9010", + "ruleId": "W9013", "severity": "WARN", - "message": "Hardcoded AMI ID - use a parameter or mapping for portability", + "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", "source": "ENGINE", "entity": { - "logicalId": "MyEC2Instance", + "logicalId": "TestBadStateMachine1", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::StepFunctions::StateMachine" }, - "propertyPath": "Properties.ImageId", "category": "Security", - "startLine": 32, - "startColumn": 7, - "endLine": 32, - "endColumn": 14, - "ruleDescription": "Hardcoded AMI ID", + "startLine": 35, + "startColumn": 3, + "endLine": 35, + "endColumn": 23, + "ruleDescription": "Hardcoded account ID in ARN", "phase": "LINT" }, { - "ruleId": "W9010", + "ruleId": "W9013", "severity": "WARN", - "message": "Hardcoded AMI ID - use a parameter or mapping for portability", + "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", "source": "ENGINE", "entity": { - "logicalId": "AnotherInstance", + "logicalId": "TestBadStateMachine2", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::StepFunctions::StateMachine" }, - "propertyPath": "Properties.ImageId", "category": "Security", - "startLine": 51, - "startColumn": 7, - "endLine": 51, - "endColumn": 14, - "ruleDescription": "Hardcoded AMI ID", + "startLine": 56, + "startColumn": 3, + "endLine": 56, + "endColumn": 23, + "ruleDescription": "Hardcoded account ID in ARN", "phase": "LINT" }, { - "ruleId": "I3100", + "ruleId": "I3510", "severity": "INFO", - "message": "Previous generation instance type 't1.micro' - consider upgrading", + "message": "action 'iam:UploadSSHPublicKey' requires a resource of ['arn:${Partition}:iam::${Account}:user/.*']", "source": "CFN_LINT", "entity": { - "logicalId": "MyEC2Instance", + "logicalId": "myPolicy", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::IAM::Policy" }, - "propertyPath": "Properties.InstanceType", - "suggestedFix": "Upgrade to a current generation instance type", - "category": "Best Practice", - "startLine": 33, - "startColumn": 7, - "endLine": 33, + "propertyPath": "Properties.PolicyDocument.Statement.0.Resource", + "category": "Security", + "startLine": 25, + "startColumn": 11, + "endLine": 25, "endColumn": 19, - "ruleDescription": "Checks for legacy instance type generations", + "ruleDescription": "Validate statement resources match the actions", "phase": "LINT" }, { - "ruleId": "I3100", + "ruleId": "I3510", "severity": "INFO", - "message": "Previous generation instance type 't1.micro' - consider upgrading", + "message": "action 'iam:GetLoginProfile' requires a resource of ['arn:${Partition}:iam::${Account}:user/.*']", "source": "CFN_LINT", "entity": { - "logicalId": "AnotherInstance", + "logicalId": "myPolicy", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::IAM::Policy" }, - "propertyPath": "Properties.InstanceType", - "suggestedFix": "Upgrade to a current generation instance type", - "category": "Best Practice", - "startLine": 52, - "startColumn": 7, - "endLine": 52, - "endColumn": 19, - "ruleDescription": "Checks for legacy instance type generations", + "propertyPath": "Properties.PolicyDocument.Statement.1.NotResource", + "category": "Security", + "startLine": 29, + "startColumn": 11, + "endLine": 29, + "endColumn": 22, + "ruleDescription": "Validate statement resources match the actions", "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "mySecurityGroupVpc1", + "logicalId": "myInstance", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.GroupDescription", + "propertyPath": "Properties.ImageId", "category": "Best Practice", "startLine": 11, "startColumn": 7, "endLine": 11, - "endColumn": 23, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -3140,42 +3010,44 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "message": "Property 'AdditionalInfo' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "mySecurityGroupVpc1", + "logicalId": "myInstance", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.AdditionalInfo", "category": "Best Practice", "startLine": 12, "startColumn": 7, "endLine": 12, - "endColumn": 12, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter 'myVpcId' (type AWS::EC2::VPC::Id)" + "lifecycle": "conditional-create-only", + "resolutionSource": "dynamic (Sub:${AMIId})" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", + "message": "Property 'TopicName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "mySecurityGroupVpc2", + "logicalId": "mySnsTopic", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.GroupDescription", + "propertyPath": "Properties.TopicName", "category": "Best Practice", - "startLine": 23, + "startLine": 33, "startColumn": 7, - "endLine": 23, - "endColumn": 23, + "endLine": 33, + "endColumn": 16, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sns", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -3183,280 +3055,297 @@ } }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "message": "Resource 'myInstance' of type 'AWS::EC2::Instance' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "mySecurityGroupVpc2", + "logicalId": "myInstance", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 24, - "startColumn": 7, - "endLine": 24, - "endColumn": 12, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter 'myVpcId' (type AWS::EC2::VPC::Id)" - } - }, + "startLine": 10, + "startColumn": 5, + "endLine": 10, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "message": "Resource 'mySnsTopic' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "MyEC2Instance", + "logicalId": "mySnsTopic", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", "startLine": 32, - "startColumn": 7, + "startColumn": 5, "endLine": 32, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", + "message": "Resource 'TestBadStateMachine1' of type 'AWS::StepFunctions::StateMachine' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "MyEC2Instance", + "logicalId": "TestBadStateMachine1", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::StepFunctions::StateMachine" }, - "propertyPath": "Properties.InstanceType", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 33, - "startColumn": 7, - "endLine": 33, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 37, + "startColumn": 5, + "endLine": 37, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'KeyName' is create-only; updating it will cause resource replacement", + "message": "Resource 'TestBadStateMachine2' of type 'AWS::StepFunctions::StateMachine' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "MyEC2Instance", + "logicalId": "TestBadStateMachine2", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::StepFunctions::StateMachine" }, - "propertyPath": "Properties.KeyName", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 34, - "startColumn": 7, - "endLine": 34, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 58, + "startColumn": 5, + "endLine": 58, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "bad/functions/tojsonstring_no_transform.yaml": { + "filePath": "bad/functions/tojsonstring_no_transform.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 3, + "errors": 0, + "warnings": 0, + "informational": 1, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'BlockDeviceMappings' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "F1031", + "severity": "FATAL", + "message": "Fn::ToJsonString requires the AWS::LanguageExtensions transform, but it is not declared. Add 'Transform: AWS::LanguageExtensions' to use it", + "source": "SCHEMA", "entity": { - "logicalId": "MyEC2Instance", + "logicalId": "Topic", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.BlockDeviceMappings", - "category": "Best Practice", - "startLine": 35, + "propertyPath": "Properties.DisplayName", + "category": "Intrinsic Function", + "startLine": 10, "startColumn": 7, - "endLine": 35, - "endColumn": 26, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "endLine": 10, + "endColumn": 18, + "ruleDescription": "Fn::ToJsonString requires the AWS::LanguageExtensions transform", + "phase": "PARSE" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'NetworkInterfaces' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "F1031", + "severity": "FATAL", + "message": "Fn::ToJsonString requires the AWS::LanguageExtensions transform, but it is not declared. Add 'Transform: AWS::LanguageExtensions' to use it", + "source": "SCHEMA", "entity": { - "logicalId": "MyEC2Instance", + "logicalId": "Topic", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.NetworkInterfaces", - "category": "Best Practice", - "startLine": 43, + "propertyPath": "Metadata.Custom", + "category": "Intrinsic Function", + "startLine": 14, "startColumn": 7, - "endLine": 43, - "endColumn": 24, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "endLine": 14, + "endColumn": 13, + "ruleDescription": "Fn::ToJsonString requires the AWS::LanguageExtensions transform", + "phase": "PARSE" }, { - "ruleId": "I9001", + "ruleId": "F1031", + "severity": "FATAL", + "message": "Fn::ToJsonString requires the AWS::LanguageExtensions transform, but it is not declared. Add 'Transform: AWS::LanguageExtensions' to use it", + "source": "SCHEMA", + "entity": { + "logicalId": "JsonOutput", + "entityType": "Output" + }, + "propertyPath": "Outputs/JsonOutput/Value", + "category": "Intrinsic Function", + "startLine": 19, + "startColumn": 5, + "endLine": 19, + "endColumn": 10, + "ruleDescription": "Fn::ToJsonString requires the AWS::LanguageExtensions transform", + "phase": "PARSE" + }, + { + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", + "message": "Resource 'Topic' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "MyEC2Instance", + "logicalId": "Topic", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.UserData", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 46, - "startColumn": 7, - "endLine": 46, + "startLine": 9, + "startColumn": 5, + "endLine": 9, "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only", - "resolutionSource": "dynamic (Sub:yum install ${Package}\n)" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "bad/functions_base64.yaml": { + "filePath": "bad/functions_base64.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 2, + "errors": 2, + "warnings": 0, + "informational": 3, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "F1012", + "severity": "FATAL", + "message": "Fn::FindInMap references non-existent mapping 'amimap'", + "source": "SCHEMA", "entity": { - "logicalId": "AnotherInstance", + "logicalId": "myInstance", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.ImageId", - "category": "Best Practice", - "startLine": 51, - "startColumn": 7, - "endLine": 51, - "endColumn": 14, + "category": "Intrinsic Function", + "startLine": 6, + "startColumn": 3, + "endLine": 6, + "endColumn": 13, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "ruleDescription": "FindInMap map name must exist in Mappings", + "phase": "SCHEMA" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "F3004", + "severity": "FATAL", + "message": "Circular Dependencies for resource myInstance. Circular dependency with [myInstance -> myInstance]", + "source": "SCHEMA", "entity": { - "logicalId": "AnotherInstance", + "logicalId": "myInstance", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.InstanceType", - "category": "Best Practice", - "startLine": 52, - "startColumn": 7, - "endLine": 52, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "propertyPath": "Resources/myInstance", + "category": "Reference", + "startLine": 6, + "startColumn": 3, + "endLine": 6, + "endColumn": 13, + "ruleDescription": "Circular dependency detected", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'KeyName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E1011", + "severity": "ERROR", + "message": "'Fn::GetAtt' is not supported as an argument to 'Fn::FindInMap'", + "source": "SCHEMA", "entity": { - "logicalId": "AnotherInstance", + "logicalId": "myInstance", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.KeyName", - "category": "Best Practice", - "startLine": 53, - "startColumn": 7, - "endLine": 53, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "propertyPath": "Properties.ImageId.Fn::FindInMap.2", + "category": "Intrinsic Function", + "startLine": 9, + "startColumn": 65, + "endLine": 9, + "endColumn": 66, + "ruleDescription": "Fn::FindInMap operands must be strings or one of Ref/Fn::FindInMap", + "phase": "PARSE" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'BlockDeviceMappings' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "E1021", + "severity": "ERROR", + "message": "['Random String'] is not of type 'string'", + "source": "SCHEMA", "entity": { - "logicalId": "AnotherInstance", + "logicalId": "myInstance", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.BlockDeviceMappings", - "category": "Best Practice", - "startLine": 54, - "startColumn": 7, - "endLine": 54, - "endColumn": 26, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "propertyPath": "Properties.UserData.Fn::Base64", + "category": "Intrinsic Function", + "startLine": 11, + "startColumn": 9, + "endLine": 11, + "endColumn": 19, + "ruleDescription": "Fn::Base64 argument must be a string or a string-producing intrinsic", + "phase": "PARSE" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'NetworkInterfaces' is create-only; updating it will cause resource replacement", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "AnotherInstance", + "logicalId": "myInstance", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.NetworkInterfaces", + "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 62, + "startLine": 9, "startColumn": 7, - "endLine": 62, - "endColumn": 24, + "endLine": 9, + "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "dynamic (mapping 'amimap' not found)" } }, { @@ -3465,317 +3354,351 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "AnotherInstance", + "logicalId": "myInstance", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 65, + "startLine": 10, "startColumn": 7, - "endLine": 65, + "endLine": 10, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "conditional-create-only", - "resolutionSource": "dynamic (Sub:yum install ${myPackage} ${Package})" + "resolutionSource": "dynamic (Base64 with non-string argument)" } }, - { - "ruleId": "I9003", - "severity": "INFO", - "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", - "source": "ENGINE", - "category": "Best Practice", - "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", - "phase": "LINT" - }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'mySecurityGroupVpc1' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", + "message": "Resource 'myInstance' of type 'AWS::EC2::Instance' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "mySecurityGroupVpc1", + "logicalId": "myInstance", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 10, + "startLine": 8, "startColumn": 5, - "endLine": 10, + "endLine": 8, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "bad/functions_findinmap_enhanced_invalid_key.yaml": { + "filePath": "bad/functions_findinmap_enhanced_invalid_key.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 1, + "warnings": 0, + "informational": 2, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'mySecurityGroupVpc2' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "E7001", + "severity": "ERROR", + "message": "Mapping 'MapName'.'TopKey1' key '{\"To\":\"Json\",\"String\":\"Function\"}' does not match format '^[a-zA-Z0-9]+$'", + "source": "CFN_LINT", "entity": { - "logicalId": "mySecurityGroupVpc2", - "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "logicalId": "MapName", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 22, - "startColumn": 5, - "endLine": 22, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "propertyPath": "Mappings/MapName/TopKey1/{\"To\":\"Json\",\"String\":\"Function\"}", + "category": "Structure", + "startLine": 6, + "startColumn": 7, + "endLine": 6, + "endColumn": 40, + "ruleDescription": "Mappings are appropriately configured", "phase": "LINT" }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'MyEC2Instance' of type 'AWS::EC2::Instance' supports Tags but none are configured", + "message": "Property 'ClusterName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MyEC2Instance", + "logicalId": "Cluster", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::ECS::Cluster" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.ClusterName", "category": "Best Practice", - "startLine": 31, - "startColumn": 5, - "endLine": 31, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 11, + "startColumn": 7, + "endLine": 11, + "endColumn": 18, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'AnotherInstance' of type 'AWS::EC2::Instance' supports Tags but none are configured", + "message": "Resource 'Cluster' of type 'AWS::ECS::Cluster' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "AnotherInstance", + "logicalId": "Cluster", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::ECS::Cluster" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 50, + "startLine": 10, "startColumn": 5, - "endLine": 50, + "endLine": 10, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "bad/functions_select.yaml": { - "filePath": "bad/functions_select.yaml", + "bad/functions_getaz.yaml": { + "filePath": "bad/functions_getaz.yaml", "status": "OK", "metadata": { - "resourcesScanned": 4, + "resourcesScanned": 3, "counts": { - "fatal": 0, - "errors": 8, - "warnings": 0, + "fatal": 1, + "errors": 4, + "warnings": 3, "informational": 12, "debug": 0 }, - "suppressed": 0, + "suppressed": 1, "strict": false, "severityLevel": "DEBUG" }, "diagnostics": [ { - "ruleId": "E1017", - "severity": "ERROR", - "message": "'a' is not of type 'integer'", + "ruleId": "F3004", + "severity": "FATAL", + "message": "Circular Dependencies for resource mySubnet1. Circular dependency with [mySubnet1 -> mySubnet1]", "source": "SCHEMA", "entity": { - "logicalId": "myInstance", + "logicalId": "mySubnet1", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.AvailabilityZone.Fn::Select.0", - "category": "Intrinsic Function", - "startLine": 11, - "startColumn": 9, - "endLine": 11, - "endColumn": 10, - "ruleDescription": "Fn::Select requires exactly two operands and a list source", - "phase": "PARSE" + "propertyPath": "Resources/mySubnet1", + "category": "Reference", + "startLine": 10, + "startColumn": 3, + "endLine": 10, + "endColumn": 12, + "ruleDescription": "Circular dependency detected", + "phase": "LINT" }, { "ruleId": "E1017", "severity": "ERROR", - "message": "expected maximum item count: 2, found: 3", + "message": "'us-east-1a' is not a valid region for Fn::GetAZs (use '' for the current region)", "source": "SCHEMA", "entity": { - "logicalId": "myInstance1", + "logicalId": "mySubnet2", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.AvailabilityZone.Fn::Select", + "propertyPath": "Properties.AvailabilityZone.Fn::Select.1.Fn::GetAZs", "category": "Intrinsic Function", - "startLine": 19, - "startColumn": 9, - "endLine": 19, - "endColumn": 19, + "startLine": 27, + "startColumn": 13, + "endLine": 27, + "endColumn": 23, "ruleDescription": "Fn::Select requires exactly two operands and a list source", "phase": "PARSE" }, { - "ruleId": "E1017", + "ruleId": "E3060", "severity": "ERROR", - "message": "'Fn::Join' is not supported as an argument to 'Fn::Select'", - "source": "SCHEMA", + "message": "'10.0.0.0/24' overlaps with '10.0.0.0/24'", + "source": "CFN_LINT", "entity": { - "logicalId": "myInstance2", + "logicalId": "mySubnet2", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.AvailabilityZone.Fn::Select.1", - "category": "Intrinsic Function", - "startLine": 30, - "startColumn": 17, - "endLine": 30, - "endColumn": 18, - "ruleDescription": "Fn::Select requires exactly two operands and a list source", - "phase": "PARSE" + "propertyPath": "Properties.CidrBlock", + "category": "Resource", + "startLine": 23, + "startColumn": 7, + "endLine": 23, + "endColumn": 16, + "relatedResources": [ + { + "resource": { + "id": "mySubnet1", + "resourceType": "AWS::EC2::Subnet" + }, + "location": { + "startLine": 10, + "startColumn": 3, + "endLine": 10, + "endColumn": 12 + }, + "message": "Overlapping subnet CIDR 10.0.0.0/24" + } + ], + "ruleDescription": "Validate subnet CIDRs do not overlap with other subnets", + "phase": "LINT", + "context": { + "extra": { + "cidr": "10.0.0.0/24" + } + } }, { - "ruleId": "E1017", + "ruleId": "E3060", "severity": "ERROR", - "message": "'foo' is not of type 'array'", - "source": "SCHEMA", + "message": "'10.0.0.0/24' overlaps with '10.0.0.0/24'", + "source": "CFN_LINT", "entity": { - "logicalId": "myInstance3", + "logicalId": "mySubnet3", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.AvailabilityZone.Fn::Select", - "category": "Intrinsic Function", - "startLine": 36, - "startColumn": 9, - "endLine": 36, - "endColumn": 19, - "ruleDescription": "Fn::Select requires exactly two operands and a list source", - "phase": "PARSE" + "propertyPath": "Properties.CidrBlock", + "category": "Resource", + "startLine": 32, + "startColumn": 7, + "endLine": 32, + "endColumn": 16, + "relatedResources": [ + { + "resource": { + "id": "mySubnet1", + "resourceType": "AWS::EC2::Subnet" + }, + "location": { + "startLine": 10, + "startColumn": 3, + "endLine": 10, + "endColumn": 12 + }, + "message": "Overlapping subnet CIDR 10.0.0.0/24" + } + ], + "ruleDescription": "Validate subnet CIDRs do not overlap with other subnets", + "phase": "LINT", + "context": { + "extra": { + "cidr": "10.0.0.0/24" + } + } }, { - "ruleId": "E1152", + "ruleId": "E9004", "severity": "ERROR", - "message": "'String' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "message": "'AvailbilityZone' is not one of ['AssignIpv6AddressOnCreation', 'AvailabilityZone', 'AvailabilityZoneId', 'BlockPublicAccessStates', 'BlockPublicAccessStates.InternetGatewayBlockMode', 'CidrBlock', 'EnableDns64', 'EnableLniAtDeviceIndex', 'Ipv4IpamPoolId', 'Ipv4NetmaskLength', 'Ipv6CidrBlock', 'Ipv6CidrBlocks', 'Ipv6IpamPoolId', 'Ipv6Native', 'Ipv6NetmaskLength', 'MapPublicIpOnLaunch', 'NetworkAclAssociationId', 'OutpostArn', 'PrivateDnsNameOptionsOnLaunch.EnableResourceNameDnsAAAARecord', 'PrivateDnsNameOptionsOnLaunch.EnableResourceNameDnsARecord', 'PrivateDnsNameOptionsOnLaunch.HostnameType', 'SubnetId', 'Tags', 'VpcId']", + "source": "SCHEMA", "entity": { - "logicalId": "myInstance", + "logicalId": "mySubnet3", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Properties.AvailabilityZone", + "suggestedFix": "Check the resource type documentation for valid GetAtt attributes", "category": "Intrinsic Function", - "startLine": 9, + "startLine": 33, "startColumn": 7, - "endLine": 9, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "String" - } + "endLine": 33, + "endColumn": 23, + "ruleDescription": "GetAtt attribute must exist on target resource type", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'String' does not match format 'AWS::EC2::Image.Id'", + "ruleId": "W1030", + "severity": "WARN", + "message": "{'Ref': 'VPC'} is not a 'AWS::EC2::VPC.Id' with pattern '^vpc-(([0-9A-Fa-f]{8})|([0-9A-Fa-f]{17}))$' when 'Ref' is resolved", "source": "CFN_LINT", "entity": { - "logicalId": "myInstance1", + "logicalId": "mySubnet1", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 17, + "propertyPath": "Properties.VpcId", + "category": "Best Practice", + "startLine": 13, "startColumn": 7, - "endLine": 17, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "String" - } + "endLine": 13, + "endColumn": 12, + "ruleDescription": "Validate the values that come from a Ref function", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'String' does not match format 'AWS::EC2::Image.Id'", + "ruleId": "W1030", + "severity": "WARN", + "message": "{'Ref': 'VPC'} is not a 'AWS::EC2::VPC.Id' with pattern '^vpc-(([0-9A-Fa-f]{8})|([0-9A-Fa-f]{17}))$' when 'Ref' is resolved", "source": "CFN_LINT", "entity": { - "logicalId": "myInstance2", + "logicalId": "mySubnet2", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 26, + "propertyPath": "Properties.VpcId", + "category": "Best Practice", + "startLine": 22, "startColumn": 7, - "endLine": 26, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "String" - } + "endLine": 22, + "endColumn": 12, + "ruleDescription": "Validate the values that come from a Ref function", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'String' does not match format 'AWS::EC2::Image.Id'", + "ruleId": "W1030", + "severity": "WARN", + "message": "{'Ref': 'VPC'} is not a 'AWS::EC2::VPC.Id' with pattern '^vpc-(([0-9A-Fa-f]{8})|([0-9A-Fa-f]{17}))$' when 'Ref' is resolved", "source": "CFN_LINT", "entity": { - "logicalId": "myInstance3", + "logicalId": "mySubnet3", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 34, + "propertyPath": "Properties.VpcId", + "category": "Best Practice", + "startLine": 31, "startColumn": 7, - "endLine": 34, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "String" - } + "endLine": 31, + "endColumn": 12, + "ruleDescription": "Validate the values that come from a Ref function", + "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "myInstance", + "logicalId": "mySubnet1", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 9, + "startLine": 13, "startColumn": 7, - "endLine": 9, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 13, + "endColumn": 12, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -3785,67 +3708,64 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "myInstance", + "logicalId": "mySubnet1", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.AvailabilityZone", + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 10, + "startLine": 14, "startColumn": 7, - "endLine": 10, - "endColumn": 23, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 14, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "dynamic (Select on non-list value)" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "myInstance1", + "logicalId": "mySubnet1", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Properties.AvailabilityZone", "category": "Best Practice", - "startLine": 17, + "startLine": 15, "startColumn": 7, - "endLine": 17, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 15, + "endColumn": 23, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "dynamic (Select with unresolvable arguments)" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "myInstance1", + "logicalId": "mySubnet2", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.AvailabilityZone", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 18, + "startLine": 22, "startColumn": 7, - "endLine": 18, - "endColumn": 23, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 22, + "endColumn": 12, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -3855,20 +3775,19 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "myInstance2", + "logicalId": "mySubnet2", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 26, + "startLine": 23, "startColumn": 7, - "endLine": 26, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 23, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -3881,41 +3800,39 @@ "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "myInstance2", + "logicalId": "mySubnet2", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::EC2::Subnet" }, "propertyPath": "Properties.AvailabilityZone", "category": "Best Practice", - "startLine": 27, + "startLine": 24, "startColumn": 7, - "endLine": 27, + "endLine": 24, "endColumn": 23, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "dynamic (Select on non-list value)" + "resolutionSource": "dynamic (Select with unresolvable arguments)" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "myInstance3", + "logicalId": "mySubnet3", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 34, + "startLine": 31, "startColumn": 7, - "endLine": 34, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 31, + "endColumn": 12, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -3925,20 +3842,19 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "myInstance3", + "logicalId": "mySubnet3", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.AvailabilityZone", + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 35, + "startLine": 32, "startColumn": 7, - "endLine": 35, - "endColumn": 23, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 32, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -3946,41 +3862,44 @@ } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'myInstance' of type 'AWS::EC2::Instance' supports Tags but none are configured", + "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "myInstance", + "logicalId": "mySubnet3", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.AvailabilityZone", "category": "Best Practice", - "startLine": 8, - "startColumn": 5, - "endLine": 8, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 33, + "startColumn": 7, + "endLine": 33, + "endColumn": 23, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "dynamic (Select with unresolvable arguments)" + } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'myInstance1' of type 'AWS::EC2::Instance' supports Tags but none are configured", + "message": "Resource 'mySubnet1' of type 'AWS::EC2::Subnet' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "myInstance1", + "logicalId": "mySubnet1", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::EC2::Subnet" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 16, + "startLine": 12, "startColumn": 5, - "endLine": 16, + "endLine": 12, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -3988,19 +3907,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'myInstance2' of type 'AWS::EC2::Instance' supports Tags but none are configured", + "message": "Resource 'mySubnet2' of type 'AWS::EC2::Subnet' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "myInstance2", + "logicalId": "mySubnet2", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::EC2::Subnet" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 25, + "startLine": 21, "startColumn": 5, - "endLine": 25, + "endLine": 21, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -4008,35 +3927,35 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'myInstance3' of type 'AWS::EC2::Instance' supports Tags but none are configured", + "message": "Resource 'mySubnet3' of type 'AWS::EC2::Subnet' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "myInstance3", + "logicalId": "mySubnet3", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::EC2::Subnet" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 33, + "startLine": 30, "startColumn": 5, - "endLine": 33, + "endLine": 30, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "bad/generic.yaml": { - "filePath": "bad/generic.yaml", + "bad/functions_join.yaml": { + "filePath": "bad/functions_join.yaml", "status": "OK", "metadata": { - "resourcesScanned": 19, + "resourcesScanned": 2, "counts": { - "fatal": 23, - "errors": 1, - "warnings": 11, - "informational": 37, + "fatal": 0, + "errors": 2, + "warnings": 0, + "informational": 6, "debug": 0 }, "suppressed": 0, @@ -4045,884 +3964,464 @@ }, "diagnostics": [ { - "ruleId": "F0005", - "severity": "FATAL", - "message": "'Errors' is not a valid top-level template section", - "source": "SCHEMA", - "propertyPath": "Errors", - "category": "Structure", - "startLine": 4, - "startColumn": 1, - "endLine": 4, - "endColumn": 7, - "ruleDescription": "Top-level keys must be valid section names", - "phase": "SCHEMA" - }, - { - "ruleId": "F1020", - "severity": "FATAL", - "message": "'pIops' is not one of ['AWS::AccountId', 'AWS::NoValue', 'AWS::NotificationARNs', 'AWS::Partition', 'AWS::Region', 'AWS::StackId', 'AWS::StackName', 'AWS::URLSuffix', 'ElasticLoadBalancer', 'MyEC2Instance', 'MyEC2Instance1', 'MyEC2Instance3', 'MyEc2BlockDevice', 'PermitAllInbound', 'RolePolicies', 'RootInstanceProfile', 'RootRole', 'SecurityGroup', 'conditionLoadBalancer', 'lambdaMap1', 'lambdaMap2', 'myAcl', 'myEc2Instance4', 'myIamProfile', 'myIamProfile2', 'myIamProfile3', 'myLambdaTwo', 'myParam']", - "source": "SCHEMA", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-1234' does not match format 'AWS::EC2::Image.Id'", + "source": "CFN_LINT", "entity": { - "logicalId": "MyEC2Instance", + "logicalId": "myInstance", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.BlockDeviceMappings.0.Ebs.Iops", - "suggestedFix": "Check that the Ref target exists as a resource, parameter, or pseudo-parameter", + "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 52, - "startColumn": 13, - "endLine": 52, - "endColumn": 17, + "startLine": 9, + "startColumn": 7, + "endLine": 9, + "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Ref/GetAtt target must exist", - "phase": "SCHEMA" + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-1234" + } }, { - "ruleId": "F1020", - "severity": "FATAL", - "message": "'WebServerPort' is not one of ['AWS::AccountId', 'AWS::NoValue', 'AWS::NotificationARNs', 'AWS::Partition', 'AWS::Region', 'AWS::StackId', 'AWS::StackName', 'AWS::URLSuffix', 'ElasticLoadBalancer', 'MyEC2Instance', 'MyEC2Instance1', 'MyEC2Instance3', 'MyEc2BlockDevice', 'PermitAllInbound', 'RolePolicies', 'RootInstanceProfile', 'RootRole', 'SecurityGroup', 'conditionLoadBalancer', 'lambdaMap1', 'lambdaMap2', 'myAcl', 'myEc2Instance4', 'myIamProfile', 'myIamProfile2', 'myIamProfile3', 'myLambdaTwo', 'myParam']", - "source": "SCHEMA", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-1234' does not match format 'AWS::EC2::Image.Id'", + "source": "CFN_LINT", "entity": { - "logicalId": "ElasticLoadBalancer", + "logicalId": "myInstance2", "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancing::LoadBalancer" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Listeners.0.InstancePort", - "suggestedFix": "Check that the Ref target exists as a resource, parameter, or pseudo-parameter", + "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 119, - "startColumn": 11, - "endLine": 119, - "endColumn": 23, - "documentationUrl": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb.html", - "ruleDescription": "Ref/GetAtt target must exist", - "phase": "SCHEMA" + "startLine": 19, + "startColumn": 7, + "endLine": 19, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-1234" + } }, { - "ruleId": "F1020", - "severity": "FATAL", - "message": "'WebServerPort' is not one of ['AWS::AccountId', 'AWS::NoValue', 'AWS::NotificationARNs', 'AWS::Partition', 'AWS::Region', 'AWS::StackId', 'AWS::StackName', 'AWS::URLSuffix', 'ElasticLoadBalancer', 'MyEC2Instance', 'MyEC2Instance1', 'MyEC2Instance3', 'MyEc2BlockDevice', 'PermitAllInbound', 'RolePolicies', 'RootInstanceProfile', 'RootRole', 'SecurityGroup', 'conditionLoadBalancer', 'lambdaMap1', 'lambdaMap2', 'myAcl', 'myEc2Instance4', 'myIamProfile', 'myIamProfile2', 'myIamProfile3', 'myLambdaTwo', 'myParam']", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ElasticLoadBalancer", + "logicalId": "myInstance", "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancing::LoadBalancer" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.HealthCheck.Target.Fn::Join.1.1", - "suggestedFix": "Check that the Ref target exists as a resource, parameter, or pseudo-parameter", - "category": "Intrinsic Function", - "startLine": 128, - "startColumn": 20, - "endLine": 128, - "endColumn": 21, - "documentationUrl": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb.html", - "ruleDescription": "Ref/GetAtt target must exist", - "phase": "SCHEMA" - }, - { - "ruleId": "F3002", - "severity": "FATAL", - "message": "Additional properties are not allowed ('Fn::If' was unexpected)", - "source": "SCHEMA", - "entity": { - "logicalId": "myIamProfile3", - "entityType": "Resource", - "resourceType": "AWS::IAM::Role" - }, - "propertyPath": "Properties.Fn::If", - "category": "Schema", - "startLine": 34, + "propertyPath": "Properties.ImageId", + "category": "Best Practice", + "startLine": 9, "startColumn": 7, - "endLine": 34, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", - "ruleDescription": "Additional properties are not allowed", + "endLine": 9, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "property": "Fn::If", - "extra": { - "allowed_properties": [ - "Arn", - "AssumeRolePolicyDocument", - "Description", - "ManagedPolicyArns", - "MaxSessionDuration", - "Path", - "PermissionsBoundary", - "Policies", - "RoleId", - "RoleName", - "Tags" - ] - } + "lifecycle": "create-only" } }, { - "ruleId": "F3002", - "severity": "FATAL", - "message": "Additional properties are not allowed ('FakeKey' was unexpected)", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "MyEC2Instance", + "logicalId": "myInstance", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.FakeKey", - "category": "Schema", - "startLine": 46, + "propertyPath": "Properties.UserData", + "category": "Best Practice", + "startLine": 10, "startColumn": 7, - "endLine": 46, - "endColumn": 14, + "endLine": 10, + "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Additional properties are not allowed", + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "property": "FakeKey", - "extra": { - "allowed_properties": [ - "AdditionalInfo", - "Affinity", - "AvailabilityZone", - "BlockDeviceMappings", - "CpuOptions", - "CreditSpecification", - "DisableApiTermination", - "EbsOptimized", - "ElasticGpuSpecifications", - "ElasticInferenceAccelerators", - "EnclaveOptions", - "HibernationOptions", - "HostId", - "HostResourceGroupArn", - "IamInstanceProfile", - "ImageId", - "InstanceId", - "InstanceInitiatedShutdownBehavior", - "InstanceType", - "Ipv6AddressCount", - "Ipv6Addresses", - "KernelId", - "KeyName", - "LaunchTemplate", - "LicenseSpecifications", - "MetadataOptions", - "Monitoring", - "NetworkInterfaces", - "PlacementGroupName", - "PrivateDnsName", - "PrivateDnsNameOptions", - "PrivateIp", - "PrivateIpAddress", - "PropagateTagsToVolumeOnCreation", - "PublicDnsName", - "PublicIp", - "RamdiskId", - "SecurityGroupIds", - "SecurityGroups", - "SourceDestCheck", - "SsmAssociations", - "State", - "SubnetId", - "Tags", - "Tenancy", - "UserData", - "Volumes", - "VpcId" - ] - } + "lifecycle": "conditional-create-only", + "resolutionSource": "dynamic (Base64 with non-string argument)" } }, { - "ruleId": "F3002", - "severity": "FATAL", - "message": "Additional properties are not allowed ('BadSubX2Key' was unexpected)", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "MyEC2Instance", + "logicalId": "myInstance2", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.BlockDeviceMappings.0.Ebs.BadSubX2Key", - "category": "Schema", - "startLine": 55, - "startColumn": 13, - "endLine": 55, - "endColumn": 24, + "propertyPath": "Properties.ImageId", + "category": "Best Practice", + "startLine": 19, + "startColumn": 7, + "endLine": 19, + "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Additional properties are not allowed", + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "property": "BadSubX2Key", - "extra": { - "allowed_properties": [ - "AdditionalInfo", - "Affinity", - "AvailabilityZone", - "BlockDeviceMappings", - "CpuOptions", - "CreditSpecification", - "DisableApiTermination", - "EbsOptimized", - "ElasticGpuSpecifications", - "ElasticInferenceAccelerators", - "EnclaveOptions", - "HibernationOptions", - "HostId", - "HostResourceGroupArn", - "IamInstanceProfile", - "ImageId", - "InstanceId", - "InstanceInitiatedShutdownBehavior", - "InstanceType", - "Ipv6AddressCount", - "Ipv6Addresses", - "KernelId", - "KeyName", - "LaunchTemplate", - "LicenseSpecifications", - "MetadataOptions", - "Monitoring", - "NetworkInterfaces", - "PlacementGroupName", - "PrivateDnsName", - "PrivateDnsNameOptions", - "PrivateIp", - "PrivateIpAddress", - "PropagateTagsToVolumeOnCreation", - "PublicDnsName", - "PublicIp", - "RamdiskId", - "SecurityGroupIds", - "SecurityGroups", - "SourceDestCheck", - "SsmAssociations", - "State", - "SubnetId", - "Tags", - "Tenancy", - "UserData", - "Volumes", - "VpcId" - ] - } + "lifecycle": "create-only" } }, { - "ruleId": "F3002", - "severity": "FATAL", - "message": "Additional properties are not allowed ('BadKey' was unexpected)", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "MyEC2Instance", + "logicalId": "myInstance2", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.NetworkInterfaces.0.BadKey", - "category": "Schema", - "startLine": 59, - "startColumn": 11, - "endLine": 59, - "endColumn": 17, + "propertyPath": "Properties.UserData", + "category": "Best Practice", + "startLine": 20, + "startColumn": 7, + "endLine": 20, + "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Additional properties are not allowed", + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "property": "BadKey", - "extra": { - "allowed_properties": [ - "AdditionalInfo", - "Affinity", - "AvailabilityZone", - "BlockDeviceMappings", - "CpuOptions", - "CreditSpecification", - "DisableApiTermination", - "EbsOptimized", - "ElasticGpuSpecifications", - "ElasticInferenceAccelerators", - "EnclaveOptions", - "HibernationOptions", - "HostId", - "HostResourceGroupArn", - "IamInstanceProfile", - "ImageId", - "InstanceId", - "InstanceInitiatedShutdownBehavior", - "InstanceType", - "Ipv6AddressCount", - "Ipv6Addresses", - "KernelId", - "KeyName", - "LaunchTemplate", - "LicenseSpecifications", - "MetadataOptions", - "Monitoring", - "NetworkInterfaces", - "PlacementGroupName", - "PrivateDnsName", - "PrivateDnsNameOptions", - "PrivateIp", - "PrivateIpAddress", - "PropagateTagsToVolumeOnCreation", - "PublicDnsName", - "PublicIp", - "RamdiskId", - "SecurityGroupIds", - "SecurityGroups", - "SourceDestCheck", - "SsmAssociations", - "State", - "SubnetId", - "Tags", - "Tenancy", - "UserData", - "Volumes", - "VpcId" - ] - } + "lifecycle": "conditional-create-only", + "resolutionSource": "dynamic (Base64 with unresolvable argument)" } }, { - "ruleId": "F3002", - "severity": "FATAL", - "message": "Additional properties are not allowed ('PolicyDocument1' was unexpected. Did you mean 'PolicyDocument'?)", - "source": "SCHEMA", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'myInstance' of type 'AWS::EC2::Instance' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "RootRole", + "logicalId": "myInstance", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Policies.0.PolicyDocument1", - "category": "Schema", - "startLine": 84, - "startColumn": 11, - "endLine": 84, - "endColumn": 26, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", - "ruleDescription": "Additional properties are not allowed", - "phase": "SCHEMA", - "context": { - "property": "PolicyDocument1", - "extra": { - "allowed_properties": [ - "Arn", - "AssumeRolePolicyDocument", - "Description", - "ManagedPolicyArns", - "MaxSessionDuration", - "Path", - "PermissionsBoundary", - "Policies", - "RoleId", - "RoleName", - "Tags" - ] - } - } + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 8, + "startColumn": 5, + "endLine": 8, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "F3002", - "severity": "FATAL", - "message": "Additional properties are not allowed ('FakeKey' was unexpected)", - "source": "SCHEMA", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'myInstance2' of type 'AWS::EC2::Instance' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "ElasticLoadBalancer", + "logicalId": "myInstance2", "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancing::LoadBalancer" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.HealthCheck.FakeKey", - "category": "Schema", - "startLine": 123, - "startColumn": 9, - "endLine": 123, - "endColumn": 16, - "documentationUrl": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb.html", - "ruleDescription": "Additional properties are not allowed", - "phase": "SCHEMA", - "context": { - "property": "FakeKey", - "extra": { - "allowed_properties": [ - "AccessLoggingPolicy", - "AppCookieStickinessPolicy", - "AvailabilityZones", - "CanonicalHostedZoneName", - "CanonicalHostedZoneNameID", - "ConnectionDrainingPolicy", - "ConnectionSettings", - "CrossZone", - "DNSName", - "HealthCheck", - "Instances", - "LBCookieStickinessPolicy", - "Listeners", - "LoadBalancerName", - "Policies", - "Scheme", - "SecurityGroups", - "SourceSecurityGroup", - "Subnets", - "Tags" - ] - } - } + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 18, + "startColumn": 5, + "endLine": 18, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "bad/functions_ref.yaml": { + "filePath": "bad/functions_ref.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 4, + "counts": { + "fatal": 6, + "errors": 4, + "warnings": 5, + "informational": 23, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "F3003", + "ruleId": "F1018", "severity": "FATAL", - "message": "'AssumeRolePolicyDocument' is a required property", + "message": "Fn::Sub variable '${Package}' does not reference a valid resource, parameter, or pseudo-parameter", "source": "SCHEMA", "entity": { - "logicalId": "myIamProfile", + "logicalId": "MyEC2Instance", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties", - "suggestedFix": "Add the required property 'AssumeRolePolicyDocument'", - "category": "Schema", - "startLine": 25, - "startColumn": 3, - "endLine": 25, + "propertyPath": "Properties.UserData", + "category": "Intrinsic Function", + "startLine": 46, + "startColumn": 7, + "endLine": 46, "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", - "ruleDescription": "Required property missing", - "phase": "SCHEMA" + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Sub variables must resolve", + "phase": "SCHEMA", + "context": { + "resolutionSource": "dynamic (Sub:yum install ${Package}\n)" + } }, { - "ruleId": "F3003", + "ruleId": "F1020", "severity": "FATAL", - "message": "'AssumeRolePolicyDocument' is a required property", + "message": "'pIops' is not one of ['AWS::AccountId', 'AWS::NoValue', 'AWS::NotificationARNs', 'AWS::Partition', 'AWS::Region', 'AWS::StackId', 'AWS::StackName', 'AWS::URLSuffix', 'AnotherInstance', 'MyEC2Instance', 'mySecurityGroupVpc1', 'mySecurityGroupVpc2', 'myVpcId']", "source": "SCHEMA", "entity": { - "logicalId": "myIamProfile2", + "logicalId": "MyEC2Instance", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties", - "suggestedFix": "Add the required property 'AssumeRolePolicyDocument'", - "category": "Schema", - "startLine": 29, - "startColumn": 5, - "endLine": 29, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", - "ruleDescription": "Required property missing", + "propertyPath": "Properties.BlockDeviceMappings.0.Ebs.Iops", + "suggestedFix": "Check that the Ref target exists as a resource, parameter, or pseudo-parameter", + "category": "Intrinsic Function", + "startLine": 40, + "startColumn": 13, + "endLine": 40, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Ref/GetAtt target must exist", "phase": "SCHEMA" }, { - "ruleId": "F3003", + "ruleId": "F1020", "severity": "FATAL", - "message": "'PolicyDocument' is a required property", + "message": "'pIops' is not one of ['AWS::AccountId', 'AWS::NoValue', 'AWS::NotificationARNs', 'AWS::Partition', 'AWS::Region', 'AWS::StackId', 'AWS::StackName', 'AWS::URLSuffix', 'AnotherInstance', 'MyEC2Instance', 'mySecurityGroupVpc1', 'mySecurityGroupVpc2', 'myVpcId']", "source": "SCHEMA", "entity": { - "logicalId": "RootRole", + "logicalId": "AnotherInstance", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Policies.0", - "suggestedFix": "Add the required property 'PolicyDocument'", - "category": "Schema", - "startLine": 83, - "startColumn": 21, - "endLine": 83, - "endColumn": 22, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", - "ruleDescription": "Required property missing", + "propertyPath": "Properties.BlockDeviceMappings.0.Ebs.Iops", + "suggestedFix": "Check that the Ref target exists as a resource, parameter, or pseudo-parameter", + "category": "Intrinsic Function", + "startLine": 59, + "startColumn": 13, + "endLine": 59, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Ref/GetAtt target must exist", "phase": "SCHEMA" }, { - "ruleId": "F3003", + "ruleId": "F1020", "severity": "FATAL", - "message": "'IpProtocol' is a required property", + "message": "'httpdPackage' is not one of ['AWS::AccountId', 'AWS::NoValue', 'AWS::NotificationARNs', 'AWS::Partition', 'AWS::Region', 'AWS::StackId', 'AWS::StackName', 'AWS::URLSuffix', 'AnotherInstance', 'MyEC2Instance', 'mySecurityGroupVpc1', 'mySecurityGroupVpc2', 'myVpcId']", "source": "SCHEMA", "entity": { - "logicalId": "SecurityGroup", + "logicalId": "AnotherInstance", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties", - "suggestedFix": "Add the required property 'IpProtocol'", - "category": "Schema", - "startLine": 138, - "startColumn": 5, - "endLine": 138, + "propertyPath": "Properties.UserData", + "suggestedFix": "Check that the Ref target exists as a resource, parameter, or pseudo-parameter", + "category": "Intrinsic Function", + "startLine": 65, + "startColumn": 7, + "endLine": 65, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Required property missing", - "phase": "SCHEMA" + "ruleDescription": "Ref/GetAtt target must exist", + "phase": "SCHEMA", + "context": { + "resolutionSource": "dynamic (Sub:yum install ${myPackage} ${Package})" + } }, { - "ruleId": "F3003", + "ruleId": "F3004", "severity": "FATAL", - "message": "'DefaultAction' is a required property", + "message": "Circular Dependencies for resource mySecurityGroupVpc1. Circular dependency with [mySecurityGroupVpc1 -> mySecurityGroupVpc2 -> mySecurityGroupVpc1]", "source": "SCHEMA", "entity": { - "logicalId": "myAcl", + "logicalId": "mySecurityGroupVpc1", "entityType": "Resource", - "resourceType": "AWS::WAFRegional::WebACL" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties", - "suggestedFix": "Add the required property 'DefaultAction'", - "category": "Schema", - "startLine": 142, - "startColumn": 5, - "endLine": 142, - "endColumn": 15, - "ruleDescription": "Required property missing", - "phase": "SCHEMA" - }, - { - "ruleId": "F3003", - "severity": "FATAL", - "message": "'MetricName' is a required property", - "source": "SCHEMA", - "entity": { - "logicalId": "myAcl", - "entityType": "Resource", - "resourceType": "AWS::WAFRegional::WebACL" - }, - "propertyPath": "Properties", - "suggestedFix": "Add the required property 'MetricName'", - "category": "Schema", - "startLine": 142, - "startColumn": 5, - "endLine": 142, - "endColumn": 15, - "ruleDescription": "Required property missing", - "phase": "SCHEMA" - }, - { - "ruleId": "F3003", - "severity": "FATAL", - "message": "'Code' is a required property", - "source": "SCHEMA", - "entity": { - "logicalId": "myLambdaTwo", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "Properties", - "suggestedFix": "Add the required property 'Code'", - "category": "Schema", - "startLine": 146, - "startColumn": 5, - "endLine": 146, - "endColumn": 15, - "ruleDescription": "Required property missing", - "phase": "SCHEMA" - }, - { - "ruleId": "F3003", - "severity": "FATAL", - "message": "'Role' is a required property", - "source": "SCHEMA", - "entity": { - "logicalId": "myLambdaTwo", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "Properties", - "suggestedFix": "Add the required property 'Role'", - "category": "Schema", - "startLine": 146, - "startColumn": 5, - "endLine": 146, - "endColumn": 15, - "ruleDescription": "Required property missing", - "phase": "SCHEMA" - }, - { - "ruleId": "F3006", - "severity": "FATAL", - "message": "Unknown resource type 'AWS::EC2::Instance1'", - "source": "SCHEMA", - "entity": { - "logicalId": "MyEC2Instance1", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance1" - }, - "category": "Schema", - "startLine": 23, + "propertyPath": "Resources/mySecurityGroupVpc1", + "category": "Reference", + "startLine": 8, "startColumn": 3, - "endLine": 23, - "endColumn": 17, - "ruleDescription": "AWS resource type must be recognized and available in the configured region", - "phase": "SCHEMA", - "context": { - "extra": { - "resource_type": "AWS::EC2::Instance1" - } - } + "endLine": 8, + "endColumn": 22, + "ruleDescription": "Circular dependency detected", + "phase": "LINT" }, { - "ruleId": "F3012", + "ruleId": "F3004", "severity": "FATAL", - "message": "['1'] is not of type 'string'", + "message": "Circular Dependencies for resource mySecurityGroupVpc2. Circular dependency with [mySecurityGroupVpc2 -> mySecurityGroupVpc1 -> mySecurityGroupVpc2]", "source": "SCHEMA", "entity": { - "logicalId": "MyEC2Instance", + "logicalId": "mySecurityGroupVpc2", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.NetworkInterfaces.0.DeviceIndex", - "category": "Schema", - "startLine": 57, - "startColumn": 11, - "endLine": 57, + "propertyPath": "Resources/mySecurityGroupVpc2", + "category": "Reference", + "startLine": 20, + "startColumn": 3, + "endLine": 20, "endColumn": 22, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Property type mismatch", - "phase": "SCHEMA", - "context": { - "actualValue": [ - "1" - ] - } + "ruleDescription": "Circular dependency detected", + "phase": "LINT" }, { - "ruleId": "F3012", - "severity": "FATAL", - "message": "'Test' is not of type 'integer'", - "source": "SCHEMA", + "ruleId": "E1150", + "severity": "ERROR", + "message": "'sg-1234567' does not match format 'AWS::EC2::SecurityGroup.Id'", + "source": "CFN_LINT", "entity": { - "logicalId": "SecurityGroup", + "logicalId": "mySecurityGroupVpc1", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.FromPort", - "category": "Schema", - "startLine": 139, - "startColumn": 7, - "endLine": 139, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Property type mismatch", + "propertyPath": "Properties.SecurityGroupIngress.0.SourceSecurityGroupId", + "category": "Intrinsic Function", + "startLine": 16, + "startColumn": 9, + "endLine": 16, + "endColumn": 30, + "ruleDescription": "Validate security group format", "phase": "SCHEMA", "context": { - "actualValue": "Test", - "expectedConstraint": "integer" + "actualValue": "sg-1234567" } }, { - "ruleId": "F3014", - "severity": "FATAL", - "message": "Exactly one of ['CidrIp', 'CidrIpv6', 'SourcePrefixListId', 'SourceSecurityGroupId', 'SourceSecurityGroupName'] must be specified", - "source": "SCHEMA", - "entity": { - "logicalId": "SecurityGroup", - "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" - }, - "propertyPath": "Properties", - "category": "Schema", - "startLine": 138, - "startColumn": 5, - "endLine": 138, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Exactly one of properties required (requiredXor)", - "phase": "SCHEMA" - }, - { - "ruleId": "F6101", - "severity": "FATAL", - "message": "'DNE' is not one of ['CanonicalHostedZoneName', 'CanonicalHostedZoneNameID', 'DNSName', 'SourceSecurityGroup', 'SourceSecurityGroup.GroupName', 'SourceSecurityGroup.OwnerAlias']", - "source": "SCHEMA", - "entity": { - "logicalId": "myErrorOutput", - "entityType": "Output" - }, - "propertyPath": "Outputs/myErrorOutput/Value.Fn::GetAtt.1", - "category": "Structure", - "startLine": 228, - "startColumn": 3, - "endLine": 228, - "endColumn": 16, - "ruleDescription": "Output value must be a string", - "phase": "SCHEMA" - }, - { - "ruleId": "E3530", + "ruleId": "E3687", "severity": "ERROR", - "message": "'Statement' is a required property", + "message": "['FromPort', 'ToPort'] are required properties when using 'IpProtocol' value 1", "source": "CFN_LINT", "entity": { - "logicalId": "myIamProfile3", + "logicalId": "mySecurityGroupVpc1", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.AssumeRolePolicyDocument", - "suggestedFix": "Add a Statement array to the AssumeRolePolicyDocument", + "propertyPath": "Properties.SecurityGroupIngress.0", "category": "Resource", - "startLine": 33, - "startColumn": 7, - "endLine": 33, - "endColumn": 31, - "ruleDescription": "Validate IAM trust policies", - "phase": "LINT" - }, - { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'myParam' is not referenced anywhere in the template", - "source": "CFN_LINT", - "entity": { - "logicalId": "myParam", - "entityType": "Parameter" - }, - "propertyPath": "Parameters/myParam", - "category": "Best Practice", "startLine": 15, - "startColumn": 3, + "startColumn": 19, "endLine": 15, - "endColumn": 10, - "ruleDescription": "Check if Parameters are Used", + "endColumn": 20, + "ruleDescription": "Validate to and from ports based on the protocol", "phase": "LINT" }, { - "ruleId": "W3696", - "severity": "WARN", - "message": "Resource type 'AWS::WAFRegional::WebACL' is from a service that is sunsetting", + "ruleId": "E3687", + "severity": "ERROR", + "message": "['FromPort', 'ToPort'] are required properties when using 'IpProtocol' value 1", "source": "CFN_LINT", "entity": { - "logicalId": "myAcl", + "logicalId": "mySecurityGroupVpc1", "entityType": "Resource", - "resourceType": "AWS::WAFRegional::WebACL" - }, - "category": "Deprecation", - "startLine": 140, - "startColumn": 3, - "endLine": 140, - "endColumn": 8, - "ruleDescription": "Resource type is from a service that is sunsetting", - "phase": "SCHEMA" - }, - { - "ruleId": "W8003", - "severity": "WARN", - "message": "Fn::Equals in condition 'IsProduction' will always return True", - "source": "CFN_LINT", - "entity": { - "logicalId": "IsProduction", - "entityType": "Condition" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Conditions/IsProduction", - "category": "Best Practice", - "startLine": 20, - "startColumn": 3, - "endLine": 20, - "endColumn": 15, - "ruleDescription": "Fn::Equals will always return true or false", - "phase": "PARSE" + "propertyPath": "Properties.SecurityGroupIngress.1", + "category": "Resource", + "startLine": 18, + "startColumn": 19, + "endLine": 18, + "endColumn": 20, + "ruleDescription": "Validate to and from ports based on the protocol", + "phase": "LINT" }, { - "ruleId": "W9003", - "severity": "WARN", - "message": "1 is not of type 'string' - automatically coerced (number to string)", + "ruleId": "E3687", + "severity": "ERROR", + "message": "['FromPort', 'ToPort'] are required properties when using 'IpProtocol' value 1", "source": "CFN_LINT", "entity": { - "logicalId": "MyEC2Instance", + "logicalId": "mySecurityGroupVpc2", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.KeyName", - "category": "Best Practice", - "startLine": 45, - "startColumn": 7, - "endLine": 45, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Property type coercion warning", - "phase": "SCHEMA" + "propertyPath": "Properties.SecurityGroupIngress.0", + "category": "Resource", + "startLine": 27, + "startColumn": 19, + "endLine": 27, + "endColumn": 20, + "ruleDescription": "Validate to and from ports based on the protocol", + "phase": "LINT" }, { "ruleId": "W9003", "severity": "WARN", - "message": "5 is not of type 'string' - automatically coerced (number to string)", + "message": "1 is not of type 'string' - automatically coerced (number to string)", "source": "CFN_LINT", "entity": { - "logicalId": "ElasticLoadBalancer", + "logicalId": "mySecurityGroupVpc1", "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancing::LoadBalancer" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.HealthCheck.UnhealthyThreshold", + "propertyPath": "Properties.SecurityGroupIngress.0.IpProtocol", "category": "Best Practice", - "startLine": 132, + "startLine": 15, "startColumn": 9, - "endLine": 132, - "endColumn": 27, - "documentationUrl": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb.html", - "ruleDescription": "Property type coercion warning", - "phase": "SCHEMA" - }, - { - "ruleId": "W9003", - "severity": "WARN", - "message": "'true' is not of type 'boolean' - automatically coerced (string to boolean)", - "source": "CFN_LINT", - "entity": { - "logicalId": "conditionLoadBalancer", - "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancing::LoadBalancer" - }, - "propertyPath": "Properties.ConnectionDrainingPolicy.Enabled", - "category": "Best Practice", - "startLine": 150, - "startColumn": 5, - "endLine": 150, - "endColumn": 15, - "conditionScenario": { - "IsProduction": true - }, - "documentationUrl": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb.html", + "endLine": 15, + "endColumn": 19, "ruleDescription": "Property type coercion warning", "phase": "SCHEMA" }, { "ruleId": "W9003", "severity": "WARN", - "message": "'60' is not of type 'integer' - automatically coerced (string to integer)", + "message": "1 is not of type 'string' - automatically coerced (number to string)", "source": "CFN_LINT", "entity": { - "logicalId": "conditionLoadBalancer", + "logicalId": "mySecurityGroupVpc1", "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancing::LoadBalancer" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.ConnectionDrainingPolicy.Timeout", + "propertyPath": "Properties.SecurityGroupIngress.1.IpProtocol", "category": "Best Practice", - "startLine": 150, - "startColumn": 5, - "endLine": 150, - "endColumn": 15, - "conditionScenario": { - "IsProduction": true - }, - "documentationUrl": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb.html", + "startLine": 18, + "startColumn": 9, + "endLine": 18, + "endColumn": 19, "ruleDescription": "Property type coercion warning", "phase": "SCHEMA" }, { "ruleId": "W9003", "severity": "WARN", - "message": "true is not of type 'string' - automatically coerced (boolean to string)", + "message": "1 is not of type 'string' - automatically coerced (number to string)", "source": "CFN_LINT", "entity": { - "logicalId": "conditionLoadBalancer", + "logicalId": "mySecurityGroupVpc2", "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancing::LoadBalancer" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.Tags.{}.Value", + "propertyPath": "Properties.SecurityGroupIngress.0.IpProtocol", "category": "Best Practice", - "startLine": 150, - "startColumn": 5, - "endLine": 150, - "endColumn": 15, - "conditionScenario": { - "IsProduction": true - }, - "documentationUrl": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb.html", + "startLine": 27, + "startColumn": 9, + "endLine": 27, + "endColumn": 19, "ruleDescription": "Property type coercion warning", "phase": "SCHEMA" }, @@ -4938,28 +4437,9 @@ }, "propertyPath": "Properties.ImageId", "category": "Security", - "startLine": 43, - "startColumn": 7, - "endLine": 43, - "endColumn": 14, - "ruleDescription": "Hardcoded AMI ID", - "phase": "LINT" - }, - { - "ruleId": "W9010", - "severity": "WARN", - "message": "Hardcoded AMI ID - use a parameter or mapping for portability", - "source": "ENGINE", - "entity": { - "logicalId": "MyEC2Instance3", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.ImageId", - "category": "Security", - "startLine": 63, + "startLine": 32, "startColumn": 7, - "endLine": 63, + "endLine": 32, "endColumn": 14, "ruleDescription": "Hardcoded AMI ID", "phase": "LINT" @@ -4970,38 +4450,19 @@ "message": "Hardcoded AMI ID - use a parameter or mapping for portability", "source": "ENGINE", "entity": { - "logicalId": "MyEc2BlockDevice", + "logicalId": "AnotherInstance", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Security", - "startLine": 219, + "startLine": 51, "startColumn": 7, - "endLine": 219, + "endLine": 51, "endColumn": 14, "ruleDescription": "Hardcoded AMI ID", "phase": "LINT" }, - { - "ruleId": "I1022", - "severity": "INFO", - "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", - "source": "CFN_LINT", - "entity": { - "logicalId": "ElasticLoadBalancer", - "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancing::LoadBalancer" - }, - "propertyPath": "Properties.HealthCheck.Target.Fn::Join", - "category": "Intrinsic Function", - "startLine": 125, - "startColumn": 11, - "endLine": 125, - "endColumn": 19, - "ruleDescription": "Use Sub instead of Join", - "phase": "LINT" - }, { "ruleId": "I3100", "severity": "INFO", @@ -5015,9 +4476,9 @@ "propertyPath": "Properties.InstanceType", "suggestedFix": "Upgrade to a current generation instance type", "category": "Best Practice", - "startLine": 44, + "startLine": 33, "startColumn": 7, - "endLine": 44, + "endLine": 33, "endColumn": 19, "ruleDescription": "Checks for legacy instance type generations", "phase": "LINT" @@ -5028,16 +4489,16 @@ "message": "Previous generation instance type 't1.micro' - consider upgrading", "source": "CFN_LINT", "entity": { - "logicalId": "MyEc2BlockDevice", + "logicalId": "AnotherInstance", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "suggestedFix": "Upgrade to a current generation instance type", "category": "Best Practice", - "startLine": 220, + "startLine": 52, "startColumn": 7, - "endLine": 220, + "endLine": 52, "endColumn": 19, "ruleDescription": "Checks for legacy instance type generations", "phase": "LINT" @@ -5045,20 +4506,19 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MyEC2Instance", + "logicalId": "mySecurityGroupVpc1", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Properties.GroupDescription", "category": "Best Practice", - "startLine": 43, + "startLine": 11, "startColumn": 7, - "endLine": 43, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 11, + "endColumn": 23, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -5068,43 +4528,42 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MyEC2Instance", + "logicalId": "mySecurityGroupVpc1", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.InstanceType", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 44, + "startLine": 12, "startColumn": 7, - "endLine": 44, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 12, + "endColumn": 12, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only", + "resolutionSource": "parameter 'myVpcId' (type AWS::EC2::VPC::Id)" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'KeyName' is create-only; updating it will cause resource replacement", + "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MyEC2Instance", + "logicalId": "mySecurityGroupVpc2", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.KeyName", + "propertyPath": "Properties.GroupDescription", "category": "Best Practice", - "startLine": 45, + "startLine": 23, "startColumn": 7, - "endLine": 45, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 23, + "endColumn": 23, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -5114,42 +4573,42 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'BlockDeviceMappings' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MyEC2Instance", + "logicalId": "mySecurityGroupVpc2", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.BlockDeviceMappings", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 48, + "startLine": 24, "startColumn": 7, - "endLine": 48, - "endColumn": 26, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 24, + "endColumn": 12, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only", + "resolutionSource": "parameter 'myVpcId' (type AWS::EC2::VPC::Id)" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'NetworkInterfaces' is create-only; updating it will cause resource replacement", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { "logicalId": "MyEC2Instance", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.NetworkInterfaces", + "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 56, + "startLine": 32, "startColumn": 7, - "endLine": 56, - "endColumn": 24, + "endLine": 32, + "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", @@ -5160,113 +4619,22 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MyEC2Instance3", + "logicalId": "MyEC2Instance", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 63, + "startLine": 33, "startColumn": 7, - "endLine": 63, - "endColumn": 14, + "endLine": 33, + "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Path' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "RootRole", - "entityType": "Resource", - "resourceType": "AWS::IAM::Role" - }, - "propertyPath": "Properties.Path", - "category": "Best Practice", - "startLine": 81, - "startColumn": 7, - "endLine": 81, - "endColumn": 11, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Path' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "RootInstanceProfile", - "entityType": "Resource", - "resourceType": "AWS::IAM::InstanceProfile" - }, - "propertyPath": "Properties.Path", - "category": "Best Practice", - "startLine": 105, - "startColumn": 7, - "endLine": 105, - "endColumn": 11, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'AvailabilityZones' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "ElasticLoadBalancer", - "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancing::LoadBalancer" - }, - "propertyPath": "Properties.AvailabilityZones", - "category": "Best Practice", - "startLine": 113, - "startColumn": 7, - "endLine": 113, - "endColumn": 24, - "documentationUrl": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'HealthCheck' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "ElasticLoadBalancer", - "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancing::LoadBalancer" - }, - "propertyPath": "Properties.HealthCheck", - "category": "Best Practice", - "startLine": 122, - "startColumn": 7, - "endLine": 122, - "endColumn": 18, - "documentationUrl": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", "context": { "lifecycle": "conditional-create-only" } @@ -5274,19 +4642,19 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'FromPort' is create-only; updating it will cause resource replacement", + "message": "Property 'KeyName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SecurityGroup", + "logicalId": "MyEC2Instance", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.FromPort", + "propertyPath": "Properties.KeyName", "category": "Best Practice", - "startLine": 139, + "startLine": 34, "startColumn": 7, - "endLine": 139, - "endColumn": 15, + "endLine": 34, + "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", @@ -5297,85 +4665,42 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Name' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "myAcl", - "entityType": "Resource", - "resourceType": "AWS::WAFRegional::WebACL" - }, - "propertyPath": "Properties.Name", - "category": "Best Practice", - "startLine": 143, - "startColumn": 7, - "endLine": 143, - "endColumn": 11, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "lambdaMap1", - "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" - }, - "propertyPath": "Properties.GroupDescription", - "category": "Best Practice", - "startLine": 196, - "startColumn": 7, - "endLine": 196, - "endColumn": 23, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", + "message": "Property 'BlockDeviceMappings' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "lambdaMap2", + "logicalId": "MyEC2Instance", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.GroupDescription", + "propertyPath": "Properties.BlockDeviceMappings", "category": "Best Practice", - "startLine": 204, + "startLine": 35, "startColumn": 7, - "endLine": 204, - "endColumn": 23, + "endLine": 35, + "endColumn": 26, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'NetworkAclId' is create-only; updating it will cause resource replacement", + "message": "Property 'NetworkInterfaces' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "PermitAllInbound", + "logicalId": "MyEC2Instance", "entityType": "Resource", - "resourceType": "AWS::EC2::NetworkAclEntry" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.NetworkAclId", + "propertyPath": "Properties.NetworkInterfaces", "category": "Best Practice", - "startLine": 212, + "startLine": 43, "startColumn": 7, - "endLine": 212, - "endColumn": 19, + "endLine": 43, + "endColumn": 24, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", @@ -5386,24 +4711,25 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'RuleNumber' is create-only; updating it will cause resource replacement", + "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "PermitAllInbound", + "logicalId": "MyEC2Instance", "entityType": "Resource", - "resourceType": "AWS::EC2::NetworkAclEntry" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.RuleNumber", + "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 213, + "startLine": 46, "startColumn": 7, - "endLine": 213, - "endColumn": 17, + "endLine": 46, + "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only", + "resolutionSource": "dynamic (Sub:yum install ${Package}\n)" } }, { @@ -5412,15 +4738,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MyEc2BlockDevice", + "logicalId": "AnotherInstance", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 219, + "startLine": 51, "startColumn": 7, - "endLine": 219, + "endLine": 51, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -5435,15 +4761,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MyEc2BlockDevice", + "logicalId": "AnotherInstance", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 220, + "startLine": 52, "startColumn": 7, - "endLine": 220, + "endLine": 52, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -5458,15 +4784,15 @@ "message": "Property 'KeyName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MyEc2BlockDevice", + "logicalId": "AnotherInstance", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.KeyName", "category": "Best Practice", - "startLine": 221, + "startLine": 53, "startColumn": 7, - "endLine": 221, + "endLine": 53, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -5481,15 +4807,15 @@ "message": "Property 'BlockDeviceMappings' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MyEc2BlockDevice", + "logicalId": "AnotherInstance", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.BlockDeviceMappings", "category": "Best Practice", - "startLine": 222, + "startLine": 54, "startColumn": 7, - "endLine": 222, + "endLine": 54, "endColumn": 26, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -5504,15 +4830,15 @@ "message": "Property 'NetworkInterfaces' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MyEc2BlockDevice", + "logicalId": "AnotherInstance", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.NetworkInterfaces", "category": "Best Practice", - "startLine": 223, + "startLine": 62, "startColumn": 7, - "endLine": 223, + "endLine": 62, "endColumn": 24, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -5522,190 +4848,54 @@ } }, { - "ruleId": "I9003", - "severity": "INFO", - "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", - "source": "ENGINE", - "category": "Best Practice", - "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'myIamProfile' of type 'AWS::IAM::Role' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "myIamProfile", - "entityType": "Resource", - "resourceType": "AWS::IAM::Role" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 25, - "startColumn": 3, - "endLine": 25, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'myIamProfile2' of type 'AWS::IAM::Role' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "myIamProfile2", - "entityType": "Resource", - "resourceType": "AWS::IAM::Role" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 29, - "startColumn": 5, - "endLine": 29, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'myIamProfile3' of type 'AWS::IAM::Role' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "myIamProfile3", - "entityType": "Resource", - "resourceType": "AWS::IAM::Role" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 32, - "startColumn": 5, - "endLine": 32, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'MyEC2Instance' of type 'AWS::EC2::Instance' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "MyEC2Instance", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 42, - "startColumn": 5, - "endLine": 42, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'MyEC2Instance3' of type 'AWS::EC2::Instance' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "MyEC2Instance3", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 62, - "startColumn": 5, - "endLine": 62, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'myEc2Instance4' of type 'AWS::EC2::Instance' supports Tags but none are configured", + "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "myEc2Instance4", + "logicalId": "AnotherInstance", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 67, - "startColumn": 5, - "endLine": 67, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'RootRole' of type 'AWS::IAM::Role' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "RootRole", - "entityType": "Resource", - "resourceType": "AWS::IAM::Role" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 71, - "startColumn": 5, - "endLine": 71, + "startLine": 65, + "startColumn": 7, + "endLine": 65, "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only", + "resolutionSource": "dynamic (Sub:yum install ${myPackage} ${Package})" + } }, { - "ruleId": "I9040", + "ruleId": "I9003", "severity": "INFO", - "message": "Resource 'ElasticLoadBalancer' of type 'AWS::ElasticLoadBalancing::LoadBalancer' supports Tags but none are configured", + "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", "source": "ENGINE", - "entity": { - "logicalId": "ElasticLoadBalancer", - "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancing::LoadBalancer" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 112, - "startColumn": 5, - "endLine": 112, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'myLambdaTwo' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "message": "Resource 'mySecurityGroupVpc1' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "myLambdaTwo", + "logicalId": "mySecurityGroupVpc1", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::EC2::SecurityGroup" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 146, + "startLine": 10, "startColumn": 5, - "endLine": 146, + "endLine": 10, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -5713,19 +4903,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'lambdaMap1' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", + "message": "Resource 'mySecurityGroupVpc2' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "lambdaMap1", + "logicalId": "mySecurityGroupVpc2", "entityType": "Resource", "resourceType": "AWS::EC2::SecurityGroup" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 195, + "startLine": 22, "startColumn": 5, - "endLine": 195, + "endLine": 22, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -5733,19 +4923,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'lambdaMap2' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", + "message": "Resource 'MyEC2Instance' of type 'AWS::EC2::Instance' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "lambdaMap2", + "logicalId": "MyEC2Instance", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 203, + "startLine": 31, "startColumn": 5, - "endLine": 203, + "endLine": 31, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -5753,35 +4943,35 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'MyEc2BlockDevice' of type 'AWS::EC2::Instance' supports Tags but none are configured", + "message": "Resource 'AnotherInstance' of type 'AWS::EC2::Instance' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "MyEc2BlockDevice", + "logicalId": "AnotherInstance", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 218, + "startLine": 50, "startColumn": 5, - "endLine": 218, + "endLine": 50, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "bad/getatt_object_attribute_member.yaml": { - "filePath": "bad/getatt_object_attribute_member.yaml", + "bad/functions_select.yaml": { + "filePath": "bad/functions_select.yaml", "status": "OK", "metadata": { - "resourcesScanned": 2, + "resourcesScanned": 4, "counts": { "fatal": 0, - "errors": 1, + "errors": 8, "warnings": 0, - "informational": 2, + "informational": 12, "debug": 0 }, "suppressed": 0, @@ -5790,204 +4980,237 @@ }, "diagnostics": [ { - "ruleId": "E9004", + "ruleId": "E1017", "severity": "ERROR", - "message": "'Tags.0' is not one of ['Arn', 'DomainName', 'DualStackDomainName', 'MetadataConfiguration.AnnotationTableConfiguration.TableArn', 'MetadataConfiguration.AnnotationTableConfiguration.TableName', 'MetadataConfiguration.Destination', 'MetadataConfiguration.InventoryTableConfiguration.TableArn', 'MetadataConfiguration.InventoryTableConfiguration.TableName', 'MetadataConfiguration.JournalTableConfiguration.TableArn', 'MetadataConfiguration.JournalTableConfiguration.TableName', 'MetadataTableConfiguration.S3TablesDestination.TableArn', 'MetadataTableConfiguration.S3TablesDestination.TableNamespace', 'RegionalDomainName', 'WebsiteURL']", + "message": "'a' is not of type 'integer'", "source": "SCHEMA", "entity": { - "logicalId": "Param", + "logicalId": "myInstance", "entityType": "Resource", - "resourceType": "AWS::SSM::Parameter" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Value", - "suggestedFix": "Check the resource type documentation for valid GetAtt attributes", + "propertyPath": "Properties.AvailabilityZone.Fn::Select.0", "category": "Intrinsic Function", - "startLine": 15, - "startColumn": 7, - "endLine": 15, - "endColumn": 12, - "ruleDescription": "GetAtt attribute must exist on target resource type", - "phase": "LINT" + "startLine": 11, + "startColumn": 9, + "endLine": 11, + "endColumn": 10, + "ruleDescription": "Fn::Select requires exactly two operands and a list source", + "phase": "PARSE" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "E1017", + "severity": "ERROR", + "message": "expected maximum item count: 2, found: 3", + "source": "SCHEMA", "entity": { - "logicalId": "Bucket", + "logicalId": "myInstance1", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 9, - "startColumn": 3, - "endLine": 9, - "endColumn": 9, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "propertyPath": "Properties.AvailabilityZone.Fn::Select", + "category": "Intrinsic Function", + "startLine": 19, + "startColumn": 9, + "endLine": 19, + "endColumn": 19, + "ruleDescription": "Fn::Select requires exactly two operands and a list source", + "phase": "PARSE" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Param' of type 'AWS::SSM::Parameter' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "E1017", + "severity": "ERROR", + "message": "'Fn::Join' is not supported as an argument to 'Fn::Select'", + "source": "SCHEMA", "entity": { - "logicalId": "Param", + "logicalId": "myInstance2", "entityType": "Resource", - "resourceType": "AWS::SSM::Parameter" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 13, - "startColumn": 5, - "endLine": 13, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "bad/hard_coded_arn_properties.yaml": { - "filePath": "bad/hard_coded_arn_properties.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 6, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 2, - "informational": 6, - "debug": 0 + "propertyPath": "Properties.AvailabilityZone.Fn::Select.1", + "category": "Intrinsic Function", + "startLine": 30, + "startColumn": 17, + "endLine": 30, + "endColumn": 18, + "ruleDescription": "Fn::Select requires exactly two operands and a list source", + "phase": "PARSE" }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1017", + "severity": "ERROR", + "message": "'foo' is not of type 'array'", + "source": "SCHEMA", + "entity": { + "logicalId": "myInstance3", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Properties.AvailabilityZone.Fn::Select", + "category": "Intrinsic Function", + "startLine": 36, + "startColumn": 9, + "endLine": 36, + "endColumn": 19, + "ruleDescription": "Fn::Select requires exactly two operands and a list source", + "phase": "PARSE" + }, + { + "ruleId": "E1152", + "severity": "ERROR", + "message": "'String' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "S3BadBucket", + "logicalId": "myInstance", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.NotificationConfiguration.TopicConfigurations.0.Topic.Fn::Sub", - "category": "Best Practice", + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", "startLine": 9, - "startColumn": 11, + "startColumn": 7, "endLine": 9, - "endColumn": 18, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "String" + } }, { - "ruleId": "W3045", - "severity": "WARN", - "message": "AccessControl property is deprecated. Use bucket policies instead", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'String' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "S3BadBucket", + "logicalId": "myInstance1", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.AccessControl", - "suggestedFix": "Remove AccessControl and use an AWS::S3::BucketPolicy resource", - "category": "Deprecation", - "startLine": 6, + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 17, "startColumn": 7, - "endLine": 6, - "endColumn": 20, - "ruleDescription": "Controlling access to an S3 bucket should be done with bucket policies", - "phase": "LINT", + "endLine": 17, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", "context": { - "actualValue": "Private" + "actualValue": "String" } }, { - "ruleId": "I3042", - "severity": "INFO", - "message": "ARN in Resource S3BadBucket contains hardcoded Partition in ARN or incorrectly placed Pseudo Parameters", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'String' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "S3BadBucket", + "logicalId": "myInstance2", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.NotificationConfiguration.TopicConfigurations.0.Topic.Fn::Sub", - "category": "Best Practice", - "startLine": 9, - "startColumn": 11, - "endLine": 9, - "endColumn": 18, - "ruleDescription": "ARNs should use correctly placed Pseudo Parameters", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 26, + "startColumn": 7, + "endLine": 26, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "String" + } }, { - "ruleId": "I3042", - "severity": "INFO", - "message": "ARN in Resource SampleBadBucketPolicy contains hardcoded Partition in ARN or incorrectly placed Pseudo Parameters", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'String' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "SampleBadBucketPolicy", + "logicalId": "myInstance3", "entityType": "Resource", - "resourceType": "AWS::S3::BucketPolicy" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.PolicyDocument.Statement.0.Resource.Fn::Sub", + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 34, + "startColumn": 7, + "endLine": 34, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "String" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "myInstance", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 21, - "startColumn": 13, - "endLine": 21, - "endColumn": 20, - "ruleDescription": "ARNs should use correctly placed Pseudo Parameters", - "phase": "LINT" + "startLine": 9, + "startColumn": 7, + "endLine": 9, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Bucket' is create-only; updating it will cause resource replacement", + "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SampleBadBucketPolicy", + "logicalId": "myInstance", "entityType": "Resource", - "resourceType": "AWS::S3::BucketPolicy" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Bucket", + "propertyPath": "Properties.AvailabilityZone", "category": "Best Practice", - "startLine": 15, + "startLine": 10, "startColumn": 7, - "endLine": 15, - "endColumn": 13, + "endLine": 10, + "endColumn": 23, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "Ref to 'S3BadBucket'" + "resolutionSource": "dynamic (Select on non-list value)" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Path' is create-only; updating it will cause resource replacement", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SampleRole", + "logicalId": "myInstance1", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Path", + "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 36, + "startLine": 17, "startColumn": 7, - "endLine": 36, - "endColumn": 11, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "endLine": 17, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -5995,98 +5218,92 @@ } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'S3BadBucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "S3BadBucket", + "logicalId": "myInstance1", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.AvailabilityZone", "category": "Best Practice", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 18, + "startColumn": 7, + "endLine": 18, + "endColumn": 23, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'SampleRole' of type 'AWS::IAM::Role' supports Tags but none are configured", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SampleRole", + "logicalId": "myInstance2", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.ImageId", "category": "Best Practice", "startLine": 26, - "startColumn": 5, + "startColumn": 7, "endLine": 26, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "bad/hardcoded_partition.yaml": { - "filePath": "bad/hardcoded_partition.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 2, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 1, - "informational": 4, - "debug": 0 + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "W9013", - "severity": "WARN", - "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Topic", + "logicalId": "myInstance2", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::EC2::Instance" }, - "category": "Security", - "startLine": 7, - "startColumn": 3, - "endLine": 7, - "endColumn": 8, - "ruleDescription": "Hardcoded account ID in ARN", - "phase": "LINT" + "propertyPath": "Properties.AvailabilityZone", + "category": "Best Practice", + "startLine": 27, + "startColumn": 7, + "endLine": 27, + "endColumn": 23, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "dynamic (Select on non-list value)" + } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Bucket", + "logicalId": "myInstance3", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.BucketName", + "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 6, + "startLine": 34, "startColumn": 7, - "endLine": 6, - "endColumn": 17, + "endLine": 34, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -6096,20 +5313,20 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'TopicName' is create-only; updating it will cause resource replacement", + "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Topic", + "logicalId": "myInstance3", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.TopicName", + "propertyPath": "Properties.AvailabilityZone", "category": "Best Practice", - "startLine": 10, + "startLine": 35, "startColumn": 7, - "endLine": 10, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sns", + "endLine": 35, + "endColumn": 23, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -6119,19 +5336,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Resource 'myInstance' of type 'AWS::EC2::Instance' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Bucket", + "logicalId": "myInstance", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 5, + "startLine": 8, "startColumn": 5, - "endLine": 5, + "endLine": 8, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -6139,139 +5356,39 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Topic' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'myInstance1' of type 'AWS::EC2::Instance' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Topic", + "logicalId": "myInstance1", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 9, + "startLine": 16, "startColumn": 5, - "endLine": 9, + "endLine": 16, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" - } - ] - }, - "bad/iam_bad_statement.yaml": { - "filePath": "bad/iam_bad_statement.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 0, - "informational": 0, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "E3510", - "severity": "ERROR", - "message": "'Effect' is a required property", - "source": "CFN_LINT", - "entity": { - "logicalId": "Policy", - "entityType": "Resource", - "resourceType": "AWS::IAM::Policy" - }, - "propertyPath": "Properties.PolicyDocument.Statement.0", - "category": "Resource", - "startLine": 10, - "startColumn": 19, - "endLine": 10, - "endColumn": 20, - "ruleDescription": "Validate identity based IAM policies", - "phase": "LINT" - } - ] - }, - "bad/iam_ref_with_path.yaml": { - "filePath": "bad/iam_ref_with_path.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 2, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 0, - "informational": 3, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "E3050", - "severity": "ERROR", - "message": "Ref to IAM role 'Role' with Path '/custom/path/' - use GetAtt Role.Arn instead", - "source": "CFN_LINT", - "entity": { - "logicalId": "Project", - "entityType": "Resource", - "resourceType": "AWS::CodeBuild::Project" - }, - "propertyPath": "Properties.ServiceRole", - "suggestedFix": "Switch from Ref to !GetAtt .Arn when Path is not '/'", - "category": "Resource", - "startLine": 17, - "startColumn": 7, - "endLine": 17, - "endColumn": 18, - "ruleDescription": "Check if REFing to a IAM resource with path set", - "phase": "LINT" - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Path' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Role", - "entityType": "Resource", - "resourceType": "AWS::IAM::Role" - }, - "propertyPath": "Properties.Path", - "category": "Best Practice", - "startLine": 6, - "startColumn": 7, - "endLine": 6, - "endColumn": 11, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Role' of type 'AWS::IAM::Role' supports Tags but none are configured", + "message": "Resource 'myInstance2' of type 'AWS::EC2::Instance' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Role", + "logicalId": "myInstance2", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 5, + "startLine": 25, "startColumn": 5, - "endLine": 5, + "endLine": 25, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -6279,35 +5396,35 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Project' of type 'AWS::CodeBuild::Project' supports Tags but none are configured", + "message": "Resource 'myInstance3' of type 'AWS::EC2::Instance' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Project", + "logicalId": "myInstance3", "entityType": "Resource", - "resourceType": "AWS::CodeBuild::Project" + "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 16, + "startLine": 33, "startColumn": 5, - "endLine": 16, + "endLine": 33, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "bad/iam_wildcard_all_types.yaml": { - "filePath": "bad/iam_wildcard_all_types.yaml", + "bad/generic.yaml": { + "filePath": "bad/generic.yaml", "status": "OK", "metadata": { - "resourcesScanned": 4, + "resourcesScanned": 19, "counts": { - "fatal": 0, - "errors": 0, - "warnings": 1, - "informational": 2, + "fatal": 23, + "errors": 1, + "warnings": 11, + "informational": 37, "debug": 0 }, "suppressed": 0, @@ -6316,445 +5433,1066 @@ }, "diagnostics": [ { - "ruleId": "W2512", - "severity": "WARN", - "message": "IAM policy uses NotAction which grants all actions except those listed - consider using Action instead", - "source": "ENGINE", + "ruleId": "F0005", + "severity": "FATAL", + "message": "'Errors' is not a valid top-level template section", + "source": "SCHEMA", + "propertyPath": "Errors", + "category": "Structure", + "startLine": 4, + "startColumn": 1, + "endLine": 4, + "endColumn": 7, + "ruleDescription": "Top-level keys must be valid section names", + "phase": "SCHEMA" + }, + { + "ruleId": "F1020", + "severity": "FATAL", + "message": "'pIops' is not one of ['AWS::AccountId', 'AWS::NoValue', 'AWS::NotificationARNs', 'AWS::Partition', 'AWS::Region', 'AWS::StackId', 'AWS::StackName', 'AWS::URLSuffix', 'ElasticLoadBalancer', 'MyEC2Instance', 'MyEC2Instance1', 'MyEC2Instance3', 'MyEc2BlockDevice', 'PermitAllInbound', 'RolePolicies', 'RootInstanceProfile', 'RootRole', 'SecurityGroup', 'conditionLoadBalancer', 'lambdaMap1', 'lambdaMap2', 'myAcl', 'myEc2Instance4', 'myIamProfile', 'myIamProfile2', 'myIamProfile3', 'myLambdaTwo', 'myParam']", + "source": "SCHEMA", "entity": { - "logicalId": "NotActionUser", + "logicalId": "MyEC2Instance", "entityType": "Resource", - "resourceType": "AWS::IAM::User" + "resourceType": "AWS::EC2::Instance" }, - "category": "Security", + "propertyPath": "Properties.BlockDeviceMappings.0.Ebs.Iops", + "suggestedFix": "Check that the Ref target exists as a resource, parameter, or pseudo-parameter", + "category": "Intrinsic Function", + "startLine": 52, + "startColumn": 13, + "endLine": 52, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Ref/GetAtt target must exist", + "phase": "SCHEMA" + }, + { + "ruleId": "F1020", + "severity": "FATAL", + "message": "'WebServerPort' is not one of ['AWS::AccountId', 'AWS::NoValue', 'AWS::NotificationARNs', 'AWS::Partition', 'AWS::Region', 'AWS::StackId', 'AWS::StackName', 'AWS::URLSuffix', 'ElasticLoadBalancer', 'MyEC2Instance', 'MyEC2Instance1', 'MyEC2Instance3', 'MyEc2BlockDevice', 'PermitAllInbound', 'RolePolicies', 'RootInstanceProfile', 'RootRole', 'SecurityGroup', 'conditionLoadBalancer', 'lambdaMap1', 'lambdaMap2', 'myAcl', 'myEc2Instance4', 'myIamProfile', 'myIamProfile2', 'myIamProfile3', 'myLambdaTwo', 'myParam']", + "source": "SCHEMA", + "entity": { + "logicalId": "ElasticLoadBalancer", + "entityType": "Resource", + "resourceType": "AWS::ElasticLoadBalancing::LoadBalancer" + }, + "propertyPath": "Properties.Listeners.0.InstancePort", + "suggestedFix": "Check that the Ref target exists as a resource, parameter, or pseudo-parameter", + "category": "Intrinsic Function", + "startLine": 119, + "startColumn": 11, + "endLine": 119, + "endColumn": 23, + "documentationUrl": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb.html", + "ruleDescription": "Ref/GetAtt target must exist", + "phase": "SCHEMA" + }, + { + "ruleId": "F1020", + "severity": "FATAL", + "message": "'WebServerPort' is not one of ['AWS::AccountId', 'AWS::NoValue', 'AWS::NotificationARNs', 'AWS::Partition', 'AWS::Region', 'AWS::StackId', 'AWS::StackName', 'AWS::URLSuffix', 'ElasticLoadBalancer', 'MyEC2Instance', 'MyEC2Instance1', 'MyEC2Instance3', 'MyEc2BlockDevice', 'PermitAllInbound', 'RolePolicies', 'RootInstanceProfile', 'RootRole', 'SecurityGroup', 'conditionLoadBalancer', 'lambdaMap1', 'lambdaMap2', 'myAcl', 'myEc2Instance4', 'myIamProfile', 'myIamProfile2', 'myIamProfile3', 'myLambdaTwo', 'myParam']", + "source": "SCHEMA", + "entity": { + "logicalId": "ElasticLoadBalancer", + "entityType": "Resource", + "resourceType": "AWS::ElasticLoadBalancing::LoadBalancer" + }, + "propertyPath": "Properties.HealthCheck.Target.Fn::Join.1.1", + "suggestedFix": "Check that the Ref target exists as a resource, parameter, or pseudo-parameter", + "category": "Intrinsic Function", + "startLine": 128, + "startColumn": 20, + "endLine": 128, + "endColumn": 21, + "documentationUrl": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb.html", + "ruleDescription": "Ref/GetAtt target must exist", + "phase": "SCHEMA" + }, + { + "ruleId": "F3002", + "severity": "FATAL", + "message": "Additional properties are not allowed ('Fn::If' was unexpected)", + "source": "SCHEMA", + "entity": { + "logicalId": "myIamProfile3", + "entityType": "Resource", + "resourceType": "AWS::IAM::Role" + }, + "propertyPath": "Properties.Fn::If", + "category": "Schema", "startLine": 34, - "startColumn": 3, + "startColumn": 7, "endLine": 34, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "ruleDescription": "Additional properties are not allowed", + "phase": "SCHEMA", + "context": { + "property": "Fn::If", + "extra": { + "allowed_properties": [ + "Arn", + "AssumeRolePolicyDocument", + "Description", + "ManagedPolicyArns", + "MaxSessionDuration", + "Path", + "PermissionsBoundary", + "Policies", + "RoleId", + "RoleName", + "Tags" + ] + } + } + }, + { + "ruleId": "F3002", + "severity": "FATAL", + "message": "Additional properties are not allowed ('FakeKey' was unexpected)", + "source": "SCHEMA", + "entity": { + "logicalId": "MyEC2Instance", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Properties.FakeKey", + "category": "Schema", + "startLine": 46, + "startColumn": 7, + "endLine": 46, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Additional properties are not allowed", + "phase": "SCHEMA", + "context": { + "property": "FakeKey", + "extra": { + "allowed_properties": [ + "AdditionalInfo", + "Affinity", + "AvailabilityZone", + "BlockDeviceMappings", + "CpuOptions", + "CreditSpecification", + "DisableApiTermination", + "EbsOptimized", + "ElasticGpuSpecifications", + "ElasticInferenceAccelerators", + "EnclaveOptions", + "HibernationOptions", + "HostId", + "HostResourceGroupArn", + "IamInstanceProfile", + "ImageId", + "InstanceId", + "InstanceInitiatedShutdownBehavior", + "InstanceType", + "Ipv6AddressCount", + "Ipv6Addresses", + "KernelId", + "KeyName", + "LaunchTemplate", + "LicenseSpecifications", + "MetadataOptions", + "Monitoring", + "NetworkInterfaces", + "PlacementGroupName", + "PrivateDnsName", + "PrivateDnsNameOptions", + "PrivateIp", + "PrivateIpAddress", + "PropagateTagsToVolumeOnCreation", + "PublicDnsName", + "PublicIp", + "RamdiskId", + "SecurityGroupIds", + "SecurityGroups", + "SourceDestCheck", + "SsmAssociations", + "State", + "SubnetId", + "Tags", + "Tenancy", + "UserData", + "Volumes", + "VpcId" + ] + } + } + }, + { + "ruleId": "F3002", + "severity": "FATAL", + "message": "Additional properties are not allowed ('BadSubX2Key' was unexpected)", + "source": "SCHEMA", + "entity": { + "logicalId": "MyEC2Instance", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Properties.BlockDeviceMappings.0.Ebs.BadSubX2Key", + "category": "Schema", + "startLine": 55, + "startColumn": 13, + "endLine": 55, + "endColumn": 24, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Additional properties are not allowed", + "phase": "SCHEMA", + "context": { + "property": "BadSubX2Key", + "extra": { + "allowed_properties": [ + "AdditionalInfo", + "Affinity", + "AvailabilityZone", + "BlockDeviceMappings", + "CpuOptions", + "CreditSpecification", + "DisableApiTermination", + "EbsOptimized", + "ElasticGpuSpecifications", + "ElasticInferenceAccelerators", + "EnclaveOptions", + "HibernationOptions", + "HostId", + "HostResourceGroupArn", + "IamInstanceProfile", + "ImageId", + "InstanceId", + "InstanceInitiatedShutdownBehavior", + "InstanceType", + "Ipv6AddressCount", + "Ipv6Addresses", + "KernelId", + "KeyName", + "LaunchTemplate", + "LicenseSpecifications", + "MetadataOptions", + "Monitoring", + "NetworkInterfaces", + "PlacementGroupName", + "PrivateDnsName", + "PrivateDnsNameOptions", + "PrivateIp", + "PrivateIpAddress", + "PropagateTagsToVolumeOnCreation", + "PublicDnsName", + "PublicIp", + "RamdiskId", + "SecurityGroupIds", + "SecurityGroups", + "SourceDestCheck", + "SsmAssociations", + "State", + "SubnetId", + "Tags", + "Tenancy", + "UserData", + "Volumes", + "VpcId" + ] + } + } + }, + { + "ruleId": "F3002", + "severity": "FATAL", + "message": "Additional properties are not allowed ('BadKey' was unexpected)", + "source": "SCHEMA", + "entity": { + "logicalId": "MyEC2Instance", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Properties.NetworkInterfaces.0.BadKey", + "category": "Schema", + "startLine": 59, + "startColumn": 11, + "endLine": 59, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Additional properties are not allowed", + "phase": "SCHEMA", + "context": { + "property": "BadKey", + "extra": { + "allowed_properties": [ + "AdditionalInfo", + "Affinity", + "AvailabilityZone", + "BlockDeviceMappings", + "CpuOptions", + "CreditSpecification", + "DisableApiTermination", + "EbsOptimized", + "ElasticGpuSpecifications", + "ElasticInferenceAccelerators", + "EnclaveOptions", + "HibernationOptions", + "HostId", + "HostResourceGroupArn", + "IamInstanceProfile", + "ImageId", + "InstanceId", + "InstanceInitiatedShutdownBehavior", + "InstanceType", + "Ipv6AddressCount", + "Ipv6Addresses", + "KernelId", + "KeyName", + "LaunchTemplate", + "LicenseSpecifications", + "MetadataOptions", + "Monitoring", + "NetworkInterfaces", + "PlacementGroupName", + "PrivateDnsName", + "PrivateDnsNameOptions", + "PrivateIp", + "PrivateIpAddress", + "PropagateTagsToVolumeOnCreation", + "PublicDnsName", + "PublicIp", + "RamdiskId", + "SecurityGroupIds", + "SecurityGroups", + "SourceDestCheck", + "SsmAssociations", + "State", + "SubnetId", + "Tags", + "Tenancy", + "UserData", + "Volumes", + "VpcId" + ] + } + } + }, + { + "ruleId": "F3002", + "severity": "FATAL", + "message": "Additional properties are not allowed ('PolicyDocument1' was unexpected. Did you mean 'PolicyDocument'?)", + "source": "SCHEMA", + "entity": { + "logicalId": "RootRole", + "entityType": "Resource", + "resourceType": "AWS::IAM::Role" + }, + "propertyPath": "Properties.Policies.0.PolicyDocument1", + "category": "Schema", + "startLine": 84, + "startColumn": 11, + "endLine": 84, + "endColumn": 26, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "ruleDescription": "Additional properties are not allowed", + "phase": "SCHEMA", + "context": { + "property": "PolicyDocument1", + "extra": { + "allowed_properties": [ + "Arn", + "AssumeRolePolicyDocument", + "Description", + "ManagedPolicyArns", + "MaxSessionDuration", + "Path", + "PermissionsBoundary", + "Policies", + "RoleId", + "RoleName", + "Tags" + ] + } + } + }, + { + "ruleId": "F3002", + "severity": "FATAL", + "message": "Additional properties are not allowed ('FakeKey' was unexpected)", + "source": "SCHEMA", + "entity": { + "logicalId": "ElasticLoadBalancer", + "entityType": "Resource", + "resourceType": "AWS::ElasticLoadBalancing::LoadBalancer" + }, + "propertyPath": "Properties.HealthCheck.FakeKey", + "category": "Schema", + "startLine": 123, + "startColumn": 9, + "endLine": 123, "endColumn": 16, - "ruleDescription": "IAM policy with NotAction", - "phase": "LINT" + "documentationUrl": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb.html", + "ruleDescription": "Additional properties are not allowed", + "phase": "SCHEMA", + "context": { + "property": "FakeKey", + "extra": { + "allowed_properties": [ + "AccessLoggingPolicy", + "AppCookieStickinessPolicy", + "AvailabilityZones", + "CanonicalHostedZoneName", + "CanonicalHostedZoneNameID", + "ConnectionDrainingPolicy", + "ConnectionSettings", + "CrossZone", + "DNSName", + "HealthCheck", + "Instances", + "LBCookieStickinessPolicy", + "Listeners", + "LoadBalancerName", + "Policies", + "Scheme", + "SecurityGroups", + "SourceSecurityGroup", + "Subnets", + "Tags" + ] + } + } }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'WildcardUser' of type 'AWS::IAM::User' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "F3003", + "severity": "FATAL", + "message": "'AssumeRolePolicyDocument' is a required property", + "source": "SCHEMA", "entity": { - "logicalId": "WildcardUser", + "logicalId": "myIamProfile", "entityType": "Resource", - "resourceType": "AWS::IAM::User" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 5, + "propertyPath": "Properties", + "suggestedFix": "Add the required property 'AssumeRolePolicyDocument'", + "category": "Schema", + "startLine": 25, + "startColumn": 3, + "endLine": 25, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "ruleDescription": "Required property missing", + "phase": "SCHEMA" + }, + { + "ruleId": "F3003", + "severity": "FATAL", + "message": "'AssumeRolePolicyDocument' is a required property", + "source": "SCHEMA", + "entity": { + "logicalId": "myIamProfile2", + "entityType": "Resource", + "resourceType": "AWS::IAM::Role" + }, + "propertyPath": "Properties", + "suggestedFix": "Add the required property 'AssumeRolePolicyDocument'", + "category": "Schema", + "startLine": 29, "startColumn": 5, - "endLine": 5, + "endLine": 29, "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "ruleDescription": "Required property missing", + "phase": "SCHEMA" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'NotActionUser' of type 'AWS::IAM::User' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "F3003", + "severity": "FATAL", + "message": "'PolicyDocument' is a required property", + "source": "SCHEMA", "entity": { - "logicalId": "NotActionUser", + "logicalId": "RootRole", "entityType": "Resource", - "resourceType": "AWS::IAM::User" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 36, + "propertyPath": "Properties.Policies.0", + "suggestedFix": "Add the required property 'PolicyDocument'", + "category": "Schema", + "startLine": 83, + "startColumn": 21, + "endLine": 83, + "endColumn": 22, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "ruleDescription": "Required property missing", + "phase": "SCHEMA" + }, + { + "ruleId": "F3003", + "severity": "FATAL", + "message": "'IpProtocol' is a required property", + "source": "SCHEMA", + "entity": { + "logicalId": "SecurityGroup", + "entityType": "Resource", + "resourceType": "AWS::EC2::SecurityGroupIngress" + }, + "propertyPath": "Properties", + "suggestedFix": "Add the required property 'IpProtocol'", + "category": "Schema", + "startLine": 138, "startColumn": 5, - "endLine": 36, + "endLine": 138, "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "bad/if_wrong_arity.yaml": { - "filePath": "bad/if_wrong_arity.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 1, - "errors": 0, - "warnings": 1, - "informational": 2, - "debug": 0 + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Required property missing", + "phase": "SCHEMA" }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "F0013", + "ruleId": "F3003", "severity": "FATAL", - "message": "Fn::If: must have exactly 3 elements, got 2", + "message": "'DefaultAction' is a required property", "source": "SCHEMA", "entity": { - "logicalId": "R", + "logicalId": "myAcl", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::WAFRegional::WebACL" }, - "propertyPath": "Properties.BucketName.Fn::If", - "category": "Intrinsic Function", - "startLine": 12, - "startColumn": 9, - "endLine": 12, + "propertyPath": "Properties", + "suggestedFix": "Add the required property 'DefaultAction'", + "category": "Schema", + "startLine": 142, + "startColumn": 5, + "endLine": 142, "endColumn": 15, - "ruleDescription": "Fn::If must have exactly 3 elements", - "phase": "PARSE" + "ruleDescription": "Required property missing", + "phase": "SCHEMA" + }, + { + "ruleId": "F3003", + "severity": "FATAL", + "message": "'MetricName' is a required property", + "source": "SCHEMA", + "entity": { + "logicalId": "myAcl", + "entityType": "Resource", + "resourceType": "AWS::WAFRegional::WebACL" + }, + "propertyPath": "Properties", + "suggestedFix": "Add the required property 'MetricName'", + "category": "Schema", + "startLine": 142, + "startColumn": 5, + "endLine": 142, + "endColumn": 15, + "ruleDescription": "Required property missing", + "phase": "SCHEMA" + }, + { + "ruleId": "F3003", + "severity": "FATAL", + "message": "'Code' is a required property", + "source": "SCHEMA", + "entity": { + "logicalId": "myLambdaTwo", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties", + "suggestedFix": "Add the required property 'Code'", + "category": "Schema", + "startLine": 146, + "startColumn": 5, + "endLine": 146, + "endColumn": 15, + "ruleDescription": "Required property missing", + "phase": "SCHEMA" + }, + { + "ruleId": "F3003", + "severity": "FATAL", + "message": "'Role' is a required property", + "source": "SCHEMA", + "entity": { + "logicalId": "myLambdaTwo", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties", + "suggestedFix": "Add the required property 'Role'", + "category": "Schema", + "startLine": 146, + "startColumn": 5, + "endLine": 146, + "endColumn": 15, + "ruleDescription": "Required property missing", + "phase": "SCHEMA" + }, + { + "ruleId": "F3006", + "severity": "FATAL", + "message": "Unknown resource type 'AWS::EC2::Instance1'", + "source": "SCHEMA", + "entity": { + "logicalId": "MyEC2Instance1", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance1" + }, + "category": "Schema", + "startLine": 23, + "startColumn": 3, + "endLine": 23, + "endColumn": 17, + "ruleDescription": "AWS resource type must be recognized and available in the configured region", + "phase": "SCHEMA", + "context": { + "extra": { + "resource_type": "AWS::EC2::Instance1" + } + } + }, + { + "ruleId": "F3012", + "severity": "FATAL", + "message": "['1'] is not of type 'string'", + "source": "SCHEMA", + "entity": { + "logicalId": "MyEC2Instance", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Properties.NetworkInterfaces.0.DeviceIndex", + "category": "Schema", + "startLine": 57, + "startColumn": 11, + "endLine": 57, + "endColumn": 22, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Property type mismatch", + "phase": "SCHEMA", + "context": { + "actualValue": [ + "1" + ] + } + }, + { + "ruleId": "F3012", + "severity": "FATAL", + "message": "'Test' is not of type 'integer'", + "source": "SCHEMA", + "entity": { + "logicalId": "SecurityGroup", + "entityType": "Resource", + "resourceType": "AWS::EC2::SecurityGroupIngress" + }, + "propertyPath": "Properties.FromPort", + "category": "Schema", + "startLine": 139, + "startColumn": 7, + "endLine": 139, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Property type mismatch", + "phase": "SCHEMA", + "context": { + "actualValue": "Test", + "expectedConstraint": "integer" + } + }, + { + "ruleId": "F3014", + "severity": "FATAL", + "message": "Exactly one of ['CidrIp', 'CidrIpv6', 'SourcePrefixListId', 'SourceSecurityGroupId', 'SourceSecurityGroupName'] must be specified", + "source": "SCHEMA", + "entity": { + "logicalId": "SecurityGroup", + "entityType": "Resource", + "resourceType": "AWS::EC2::SecurityGroupIngress" + }, + "propertyPath": "Properties", + "category": "Schema", + "startLine": 138, + "startColumn": 5, + "endLine": 138, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Exactly one of properties required (requiredXor)", + "phase": "SCHEMA" + }, + { + "ruleId": "F6101", + "severity": "FATAL", + "message": "'DNE' is not one of ['CanonicalHostedZoneName', 'CanonicalHostedZoneNameID', 'DNSName', 'SourceSecurityGroup', 'SourceSecurityGroup.GroupName', 'SourceSecurityGroup.OwnerAlias']", + "source": "SCHEMA", + "entity": { + "logicalId": "myErrorOutput", + "entityType": "Output" + }, + "propertyPath": "Outputs/myErrorOutput/Value.Fn::GetAtt.1", + "category": "Structure", + "startLine": 228, + "startColumn": 3, + "endLine": 228, + "endColumn": 16, + "ruleDescription": "Output value must be a string", + "phase": "SCHEMA" + }, + { + "ruleId": "E3530", + "severity": "ERROR", + "message": "'Statement' is a required property", + "source": "CFN_LINT", + "entity": { + "logicalId": "myIamProfile3", + "entityType": "Resource", + "resourceType": "AWS::IAM::Role" + }, + "propertyPath": "Properties.AssumeRolePolicyDocument", + "suggestedFix": "Add a Statement array to the AssumeRolePolicyDocument", + "category": "Resource", + "startLine": 33, + "startColumn": 7, + "endLine": 33, + "endColumn": 31, + "ruleDescription": "Validate IAM trust policies", + "phase": "LINT" + }, + { + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'myParam' is not referenced anywhere in the template", + "source": "CFN_LINT", + "entity": { + "logicalId": "myParam", + "entityType": "Parameter" + }, + "propertyPath": "Parameters/myParam", + "category": "Best Practice", + "startLine": 15, + "startColumn": 3, + "endLine": 15, + "endColumn": 10, + "ruleDescription": "Check if Parameters are Used", + "phase": "LINT" + }, + { + "ruleId": "W3696", + "severity": "WARN", + "message": "Resource type 'AWS::WAFRegional::WebACL' is from a service that is sunsetting", + "source": "CFN_LINT", + "entity": { + "logicalId": "myAcl", + "entityType": "Resource", + "resourceType": "AWS::WAFRegional::WebACL" + }, + "category": "Deprecation", + "startLine": 140, + "startColumn": 3, + "endLine": 140, + "endColumn": 8, + "ruleDescription": "Resource type is from a service that is sunsetting", + "phase": "SCHEMA" }, { "ruleId": "W8003", "severity": "WARN", - "message": "Fn::Equals in condition 'IsProd' will always return False", + "message": "Fn::Equals in condition 'IsProduction' will always return True", "source": "CFN_LINT", "entity": { - "logicalId": "IsProd", + "logicalId": "IsProduction", "entityType": "Condition" }, - "propertyPath": "Conditions/IsProd", + "propertyPath": "Conditions/IsProduction", "category": "Best Practice", - "startLine": 3, + "startLine": 20, "startColumn": 3, - "endLine": 3, - "endColumn": 9, + "endLine": 20, + "endColumn": 15, "ruleDescription": "Fn::Equals will always return true or false", "phase": "PARSE" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W9003", + "severity": "WARN", + "message": "1 is not of type 'string' - automatically coerced (number to string)", + "source": "CFN_LINT", "entity": { - "logicalId": "R", + "logicalId": "MyEC2Instance", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.BucketName", + "propertyPath": "Properties.KeyName", "category": "Best Practice", - "startLine": 11, + "startLine": 45, "startColumn": 7, - "endLine": 11, - "endColumn": 17, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "endLine": 45, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Property type coercion warning", + "phase": "SCHEMA" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'R' of type 'AWS::S3::Bucket' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W9003", + "severity": "WARN", + "message": "5 is not of type 'string' - automatically coerced (number to string)", + "source": "CFN_LINT", "entity": { - "logicalId": "R", + "logicalId": "ElasticLoadBalancer", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::ElasticLoadBalancing::LoadBalancer" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.HealthCheck.UnhealthyThreshold", "category": "Best Practice", - "startLine": 10, + "startLine": 132, + "startColumn": 9, + "endLine": 132, + "endColumn": 27, + "documentationUrl": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb.html", + "ruleDescription": "Property type coercion warning", + "phase": "SCHEMA" + }, + { + "ruleId": "W9003", + "severity": "WARN", + "message": "'true' is not of type 'boolean' - automatically coerced (string to boolean)", + "source": "CFN_LINT", + "entity": { + "logicalId": "conditionLoadBalancer", + "entityType": "Resource", + "resourceType": "AWS::ElasticLoadBalancing::LoadBalancer" + }, + "propertyPath": "Properties.ConnectionDrainingPolicy.Enabled", + "category": "Best Practice", + "startLine": 150, "startColumn": 5, - "endLine": 10, + "endLine": 150, "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "bad/invalid_deletion_policy.yaml": { - "filePath": "bad/invalid_deletion_policy.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 1, - "errors": 0, - "warnings": 1, - "informational": 1, - "debug": 0 + "conditionScenario": { + "IsProduction": true + }, + "documentationUrl": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb.html", + "ruleDescription": "Property type coercion warning", + "phase": "SCHEMA" }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "F3016", - "severity": "FATAL", - "message": "DeletionPolicy must be one of Delete, Retain, RetainExceptOnCreate, got 'Remove'", - "source": "SCHEMA", + "ruleId": "W9003", + "severity": "WARN", + "message": "'60' is not of type 'integer' - automatically coerced (string to integer)", + "source": "CFN_LINT", "entity": { - "logicalId": "Bucket", + "logicalId": "conditionLoadBalancer", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::ElasticLoadBalancing::LoadBalancer" }, - "propertyPath": "DeletionPolicy", - "category": "Structure", - "startLine": 5, + "propertyPath": "Properties.ConnectionDrainingPolicy.Timeout", + "category": "Best Practice", + "startLine": 150, "startColumn": 5, - "endLine": 5, - "endColumn": 19, - "ruleDescription": "DeletionPolicy must be valid", + "endLine": 150, + "endColumn": 15, + "conditionScenario": { + "IsProduction": true + }, + "documentationUrl": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb.html", + "ruleDescription": "Property type coercion warning", "phase": "SCHEMA" }, { - "ruleId": "W3011", + "ruleId": "W9003", "severity": "WARN", - "message": "Both 'UpdateReplacePolicy' and 'DeletionPolicy' are needed to protect resource from deletion", + "message": "true is not of type 'string' - automatically coerced (boolean to string)", "source": "CFN_LINT", "entity": { - "logicalId": "Bucket", + "logicalId": "conditionLoadBalancer", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::ElasticLoadBalancing::LoadBalancer" }, + "propertyPath": "Properties.Tags.{}.Value", "category": "Best Practice", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 9, - "ruleDescription": "Check resources with UpdateReplacePolicy/DeletionPolicy have both", - "phase": "LINT" + "startLine": 150, + "startColumn": 5, + "endLine": 150, + "endColumn": 15, + "conditionScenario": { + "IsProduction": true + }, + "documentationUrl": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb.html", + "ruleDescription": "Property type coercion warning", + "phase": "SCHEMA" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "ruleId": "W9010", + "severity": "WARN", + "message": "Hardcoded AMI ID - use a parameter or mapping for portability", "source": "ENGINE", "entity": { - "logicalId": "Bucket", + "logicalId": "MyEC2Instance", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 9, - "ruleDescription": "Resource should have Tags", + "propertyPath": "Properties.ImageId", + "category": "Security", + "startLine": 43, + "startColumn": 7, + "endLine": 43, + "endColumn": 14, + "ruleDescription": "Hardcoded AMI ID", "phase": "LINT" - } - ] - }, - "bad/invalid_mapping_structure.yaml": { - "filePath": "bad/invalid_mapping_structure.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 1, - "errors": 0, - "warnings": 1, - "informational": 1, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "F0017", - "severity": "FATAL", - "message": "Mapping 'BadMap' second level key 'Key1' must be a map", - "source": "SCHEMA", + "ruleId": "W9010", + "severity": "WARN", + "message": "Hardcoded AMI ID - use a parameter or mapping for portability", + "source": "ENGINE", "entity": { - "logicalId": "BadMap", - "entityType": "Mapping" + "logicalId": "MyEC2Instance3", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Mappings/BadMap/Key1", - "category": "Structure", - "startLine": 4, - "startColumn": 5, - "endLine": 4, - "endColumn": 9, - "ruleDescription": "Mapping level must be a map", - "phase": "PARSE" + "propertyPath": "Properties.ImageId", + "category": "Security", + "startLine": 63, + "startColumn": 7, + "endLine": 63, + "endColumn": 14, + "ruleDescription": "Hardcoded AMI ID", + "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W9010", "severity": "WARN", - "message": "Mapping 'BadMap' is not referenced by any Fn::FindInMap", - "source": "CFN_LINT", + "message": "Hardcoded AMI ID - use a parameter or mapping for portability", + "source": "ENGINE", "entity": { - "logicalId": "BadMap", - "entityType": "Mapping" + "logicalId": "MyEc2BlockDevice", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Mappings/BadMap", - "category": "Best Practice", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 9, - "ruleDescription": "Check if Mappings are Used", + "propertyPath": "Properties.ImageId", + "category": "Security", + "startLine": 219, + "startColumn": 7, + "endLine": 219, + "endColumn": 14, + "ruleDescription": "Hardcoded AMI ID", "phase": "LINT" }, { - "ruleId": "I9040", + "ruleId": "I1022", "severity": "INFO", - "message": "Resource 'R' of type 'AWS::S3::Bucket' supports Tags but none are configured", - "source": "ENGINE", + "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", + "source": "CFN_LINT", "entity": { - "logicalId": "R", + "logicalId": "ElasticLoadBalancer", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::ElasticLoadBalancing::LoadBalancer" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 6, - "startColumn": 3, - "endLine": 6, - "endColumn": 4, - "ruleDescription": "Resource should have Tags", + "propertyPath": "Properties.HealthCheck.Target.Fn::Join", + "category": "Intrinsic Function", + "startLine": 125, + "startColumn": 11, + "endLine": 125, + "endColumn": 19, + "ruleDescription": "Use Sub instead of Join", "phase": "LINT" - } - ] - }, - "bad/invalid_update_replace_policy.yaml": { - "filePath": "bad/invalid_update_replace_policy.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 1, - "errors": 0, - "warnings": 1, - "informational": 1, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "F0018", - "severity": "FATAL", - "message": "UpdateReplacePolicy must be one of Delete, Retain, got 'Remove'", - "source": "SCHEMA", + "ruleId": "I3100", + "severity": "INFO", + "message": "Previous generation instance type 't1.micro' - consider upgrading", + "source": "CFN_LINT", "entity": { - "logicalId": "Bucket", + "logicalId": "MyEC2Instance", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "UpdateReplacePolicy", - "category": "Structure", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 24, - "ruleDescription": "UpdateReplacePolicy must be valid", - "phase": "SCHEMA" + "propertyPath": "Properties.InstanceType", + "suggestedFix": "Upgrade to a current generation instance type", + "category": "Best Practice", + "startLine": 44, + "startColumn": 7, + "endLine": 44, + "endColumn": 19, + "ruleDescription": "Checks for legacy instance type generations", + "phase": "LINT" }, { - "ruleId": "W3011", - "severity": "WARN", - "message": "Both 'UpdateReplacePolicy' and 'DeletionPolicy' are needed to protect resource from deletion", + "ruleId": "I3100", + "severity": "INFO", + "message": "Previous generation instance type 't1.micro' - consider upgrading", "source": "CFN_LINT", "entity": { - "logicalId": "Bucket", + "logicalId": "MyEc2BlockDevice", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::EC2::Instance" }, + "propertyPath": "Properties.InstanceType", + "suggestedFix": "Upgrade to a current generation instance type", "category": "Best Practice", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 9, - "ruleDescription": "Check resources with UpdateReplacePolicy/DeletionPolicy have both", + "startLine": 220, + "startColumn": 7, + "endLine": 220, + "endColumn": 19, + "ruleDescription": "Checks for legacy instance type generations", "phase": "LINT" }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Bucket", + "logicalId": "MyEC2Instance", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 9, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "bad/issues.yaml": { - "filePath": "bad/issues.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 1, - "errors": 0, - "warnings": 0, - "informational": 4, - "debug": 0 + "startLine": 43, + "startColumn": 7, + "endLine": 43, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "F1020", - "severity": "FATAL", - "message": "'PrivateSecurityGroup' is not one of ['AWS::AccountId', 'AWS::NoValue', 'AWS::NotificationARNs', 'AWS::Partition', 'AWS::Region', 'AWS::StackId', 'AWS::StackName', 'AWS::URLSuffix', 'RDSOptionGroup']", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "RDSOptionGroup", + "logicalId": "MyEC2Instance", "entityType": "Resource", - "resourceType": "AWS::RDS::OptionGroup" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.OptionConfigurations.0.VpcSecurityGroupMemberships.0", - "suggestedFix": "Check that the Ref target exists as a resource, parameter, or pseudo-parameter", - "category": "Intrinsic Function", - "startLine": 12, - "startColumn": 20, - "endLine": 12, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", - "ruleDescription": "Ref/GetAtt target must exist", - "phase": "SCHEMA" + "propertyPath": "Properties.InstanceType", + "category": "Best Practice", + "startLine": 44, + "startColumn": 7, + "endLine": 44, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'EngineName' is create-only; updating it will cause resource replacement", + "message": "Property 'KeyName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "RDSOptionGroup", + "logicalId": "MyEC2Instance", "entityType": "Resource", - "resourceType": "AWS::RDS::OptionGroup" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.EngineName", + "propertyPath": "Properties.KeyName", "category": "Best Practice", - "startLine": 6, + "startLine": 45, "startColumn": 7, - "endLine": 6, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", + "endLine": 45, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -6764,43 +6502,43 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'MajorEngineVersion' is create-only; updating it will cause resource replacement", + "message": "Property 'BlockDeviceMappings' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "RDSOptionGroup", + "logicalId": "MyEC2Instance", "entityType": "Resource", - "resourceType": "AWS::RDS::OptionGroup" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.MajorEngineVersion", + "propertyPath": "Properties.BlockDeviceMappings", "category": "Best Practice", - "startLine": 7, + "startLine": 48, "startColumn": 7, - "endLine": 7, - "endColumn": 25, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", + "endLine": 48, + "endColumn": 26, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'OptionGroupDescription' is create-only; updating it will cause resource replacement", + "message": "Property 'NetworkInterfaces' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "RDSOptionGroup", + "logicalId": "MyEC2Instance", "entityType": "Resource", - "resourceType": "AWS::RDS::OptionGroup" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.OptionGroupDescription", + "propertyPath": "Properties.NetworkInterfaces", "category": "Best Practice", - "startLine": 8, + "startLine": 56, "startColumn": 7, - "endLine": 8, - "endColumn": 29, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", + "endLine": 56, + "endColumn": 24, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -6808,213 +6546,180 @@ } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'RDSOptionGroup' of type 'AWS::RDS::OptionGroup' supports Tags but none are configured", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "RDSOptionGroup", + "logicalId": "MyEC2Instance3", "entityType": "Resource", - "resourceType": "AWS::RDS::OptionGroup" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "bad/json_parse.json": { - "filePath": "bad/json_parse.json", - "status": "ERROR", - "metadata": { - "resourcesScanned": 0, - "counts": { - "fatal": 1, - "errors": 0, - "warnings": 0, - "informational": 0, - "debug": 0 + "startLine": 63, + "startColumn": 7, + "endLine": 63, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "F1101", - "severity": "FATAL", - "message": "JSON parse error: expected `:` at line 5 column 11", - "source": "SCHEMA", - "category": "Structure", - "startLine": 5, - "startColumn": 11, - "endLine": 5, + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Path' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "RootRole", + "entityType": "Resource", + "resourceType": "AWS::IAM::Role" + }, + "propertyPath": "Properties.Path", + "category": "Best Practice", + "startLine": 81, + "startColumn": 7, + "endLine": 81, "endColumn": 11, - "ruleDescription": "Invalid YAML/JSON syntax", - "phase": "PARSE" - } - ] - }, - "bad/lambda_image_handler_intrinsic.yaml": { - "filePath": "bad/lambda_image_handler_intrinsic.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 1, - "errors": 1, - "warnings": 0, - "informational": 2, - "debug": 0 + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "F3003", - "severity": "FATAL", - "message": "'Role' is a required property", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Path' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Fn", + "logicalId": "RootInstanceProfile", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::IAM::InstanceProfile" }, - "propertyPath": "Properties", - "suggestedFix": "Add the required property 'Role'", - "category": "Schema", - "startLine": 10, - "startColumn": 5, - "endLine": 10, - "endColumn": 15, - "ruleDescription": "Required property missing", - "phase": "SCHEMA" + "propertyPath": "Properties.Path", + "category": "Best Practice", + "startLine": 105, + "startColumn": 7, + "endLine": 105, + "endColumn": 11, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "E3685", - "severity": "ERROR", - "message": "Container image functions cannot specify Handler, Runtime, or Layers properties", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'AvailabilityZones' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Fn", + "logicalId": "ElasticLoadBalancer", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::ElasticLoadBalancing::LoadBalancer" }, - "propertyPath": "Properties.Handler", - "category": "Resource", - "startLine": 12, + "propertyPath": "Properties.AvailabilityZones", + "category": "Best Practice", + "startLine": 113, "startColumn": 7, - "endLine": 12, - "endColumn": 14, - "ruleDescription": "Container image functions cannot use Handler, Runtime, or Layers", - "phase": "LINT" + "endLine": 113, + "endColumn": 24, + "documentationUrl": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'PackageType' is create-only; updating it will cause resource replacement", + "message": "Property 'HealthCheck' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Fn", + "logicalId": "ElasticLoadBalancer", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::ElasticLoadBalancing::LoadBalancer" }, - "propertyPath": "Properties.PackageType", + "propertyPath": "Properties.HealthCheck", "category": "Best Practice", - "startLine": 11, + "startLine": 122, "startColumn": 7, - "endLine": 11, + "endLine": 122, "endColumn": 18, + "documentationUrl": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'Fn' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "message": "Property 'FromPort' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Fn", + "logicalId": "SecurityGroup", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::EC2::SecurityGroupIngress" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.FromPort", "category": "Best Practice", - "startLine": 10, - "startColumn": 5, - "endLine": 10, + "startLine": 139, + "startColumn": 7, + "endLine": 139, "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "bad/lambda_no_snapstart.yaml": { - "filePath": "bad/lambda_no_snapstart.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 3, - "debug": 0 + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "I2530", + "ruleId": "I9001", "severity": "INFO", - "message": "Runtime 'java21' should consider using SnapStart for improved performance", - "source": "CFN_LINT", + "message": "Property 'Name' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Func", + "logicalId": "myAcl", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::WAFRegional::WebACL" }, - "propertyPath": "Properties.SnapStart.ApplyOn", - "suggestedFix": "Add SnapStart with ApplyOn set to 'PublishedVersions'", + "propertyPath": "Properties.Name", "category": "Best Practice", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "documentationUrl": "https://docs.aws.amazon.com/lambda/latest/dg/snapstart.html", - "ruleDescription": "Validate that SnapStart is configured for >= Java11 runtimes", - "phase": "LINT" + "startLine": 143, + "startColumn": 7, + "endLine": 143, + "endColumn": 11, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Func", + "logicalId": "lambdaMap1", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.FunctionName", + "propertyPath": "Properties.GroupDescription", "category": "Best Practice", - "startLine": 6, + "startLine": 196, "startColumn": 7, - "endLine": 6, - "endColumn": 19, + "endLine": 196, + "endColumn": 23, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -7022,99 +6727,67 @@ } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'Func' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Func", + "logicalId": "lambdaMap2", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.GroupDescription", "category": "Best Practice", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "bad/lambda_permission_no_source_account.yaml": { - "filePath": "bad/lambda_permission_no_source_account.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 2, - "informational": 4, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "W3663", - "severity": "WARN", - "message": "Lambda Permission with a SourceArn that has no account id should also specify SourceAccount", - "source": "CFN_LINT", - "entity": { - "logicalId": "Perm", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" - }, - "propertyPath": "Properties", - "suggestedFix": "Add SourceAccount property", - "category": "Security", - "startLine": 4, - "startColumn": 5, - "endLine": 4, - "endColumn": 15, - "ruleDescription": "Validate SourceAccount is required property", - "phase": "LINT" + "startLine": 204, + "startColumn": 7, + "endLine": 204, + "endColumn": 23, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W9002", - "severity": "WARN", - "message": "Property 'SourceArn' has a hardcoded ARN - use Ref, GetAtt, or a parameter instead", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'NetworkAclId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Perm", + "logicalId": "PermitAllInbound", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::EC2::NetworkAclEntry" }, - "propertyPath": "Properties.SourceArn", + "propertyPath": "Properties.NetworkAclId", "category": "Best Practice", - "startLine": 8, + "startLine": 212, "startColumn": 7, - "endLine": 8, - "endColumn": 16, - "ruleDescription": "Hardcoded ARN property", - "phase": "LINT" + "endLine": 212, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Action' is create-only; updating it will cause resource replacement", + "message": "Property 'RuleNumber' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Perm", + "logicalId": "PermitAllInbound", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::EC2::NetworkAclEntry" }, - "propertyPath": "Properties.Action", + "propertyPath": "Properties.RuleNumber", "category": "Best Practice", - "startLine": 5, + "startLine": 213, "startColumn": 7, - "endLine": 5, - "endColumn": 13, + "endLine": 213, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -7124,19 +6797,20 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Perm", + "logicalId": "MyEc2BlockDevice", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.FunctionName", + "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 6, + "startLine": 219, "startColumn": 7, - "endLine": 6, - "endColumn": 19, + "endLine": 219, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -7146,343 +6820,240 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Principal' is create-only; updating it will cause resource replacement", + "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Perm", + "logicalId": "MyEc2BlockDevice", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Principal", + "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 7, + "startLine": 220, "startColumn": 7, - "endLine": 7, - "endColumn": 16, + "endLine": 220, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'SourceArn' is create-only; updating it will cause resource replacement", + "message": "Property 'KeyName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Perm", + "logicalId": "MyEc2BlockDevice", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.SourceArn", + "propertyPath": "Properties.KeyName", "category": "Best Practice", - "startLine": 8, + "startLine": 221, "startColumn": 7, - "endLine": 8, - "endColumn": 16, + "endLine": 221, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only" } - } - ] - }, - "bad/lambda_snapstart_bad_runtime.yaml": { - "filePath": "bad/lambda_snapstart_bad_runtime.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 2, - "informational": 2, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "W2530", - "severity": "WARN", - "message": "SnapStart is enabled but no AWS::Lambda::Version resource is attached", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'BlockDeviceMappings' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "SnapStartFunc", + "logicalId": "MyEc2BlockDevice", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.SnapStart", - "suggestedFix": "Add an AWS::Lambda::Version resource that references this function", + "propertyPath": "Properties.BlockDeviceMappings", "category": "Best Practice", - "startLine": 13, + "startLine": 222, "startColumn": 7, - "endLine": 13, - "endColumn": 16, - "ruleDescription": "Validate that SnapStart is properly configured", - "phase": "LINT" - }, - { - "ruleId": "W9013", - "severity": "WARN", - "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", - "source": "ENGINE", - "entity": { - "logicalId": "SnapStartFunc", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "category": "Security", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 16, - "ruleDescription": "Hardcoded account ID in ARN", - "phase": "LINT" + "endLine": 222, + "endColumn": 26, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "message": "Property 'NetworkInterfaces' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SnapStartFunc", + "logicalId": "MyEc2BlockDevice", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.FunctionName", + "propertyPath": "Properties.NetworkInterfaces", "category": "Best Practice", - "startLine": 6, + "startLine": 223, "startColumn": 7, - "endLine": 6, - "endColumn": 19, + "endLine": 223, + "endColumn": 24, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only" } }, + { + "ruleId": "I9003", + "severity": "INFO", + "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", + "source": "ENGINE", + "category": "Best Practice", + "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", + "phase": "LINT" + }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'SnapStartFunc' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "message": "Resource 'myIamProfile' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "SnapStartFunc", + "logicalId": "myIamProfile", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::IAM::Role" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 5, - "startColumn": 5, - "endLine": 5, + "startLine": 25, + "startColumn": 3, + "endLine": 25, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" - } - ] - }, - "bad/lambda_snapstart_no_version.yaml": { - "filePath": "bad/lambda_snapstart_no_version.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 1, - "informational": 1, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "W2530", - "severity": "WARN", - "message": "SnapStart is enabled but no AWS::Lambda::Version resource is attached", - "source": "CFN_LINT", - "entity": { - "logicalId": "Func", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "Properties.SnapStart", - "suggestedFix": "Add an AWS::Lambda::Version resource that references this function", - "category": "Best Practice", - "startLine": 12, - "startColumn": 7, - "endLine": 12, - "endColumn": 16, - "ruleDescription": "Validate that SnapStart is properly configured", - "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Func' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "message": "Resource 'myIamProfile2' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Func", + "logicalId": "myIamProfile2", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::IAM::Role" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 5, + "startLine": 29, "startColumn": 5, - "endLine": 5, + "endLine": 29, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" - } - ] - }, - "bad/lambda_sqs_timeout.yaml": { - "filePath": "bad/lambda_sqs_timeout.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 3, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 0, - "informational": 7, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "E3505", - "severity": "ERROR", - "message": "Queue visibility timeout (10) is less than Function timeout (60) seconds", - "source": "CFN_LINT", - "entity": { - "logicalId": "Queue", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "propertyPath": "Properties.VisibilityTimeout", - "suggestedFix": "Set the SQS VisibilityTimeout to at least the Lambda function Timeout", - "category": "Resource", - "startLine": 6, - "startColumn": 7, - "endLine": 6, - "endColumn": 24, - "ruleDescription": "Validate SQS VisibilityTimeout is greater than a function's Timeout", - "phase": "LINT", - "context": { - "extra": { - "visibility_timeout": 10 - } - } }, { - "ruleId": "I3011", + "ruleId": "I9040", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Resource 'myIamProfile3' of type 'AWS::IAM::Role' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Queue", + "logicalId": "myIamProfile3", "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" + "resourceType": "AWS::IAM::Role" }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 8, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "startLine": 32, + "startColumn": 5, + "endLine": 32, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "I3011", + "ruleId": "I9040", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Resource 'MyEC2Instance' of type 'AWS::EC2::Instance' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Queue", + "logicalId": "MyEC2Instance", "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" + "resourceType": "AWS::EC2::Instance" }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 8, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "startLine": 42, + "startColumn": 5, + "endLine": 42, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "I3013", + "ruleId": "I9040", "severity": "INFO", - "message": "'MessageRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", + "message": "Resource 'MyEC2Instance3' of type 'AWS::EC2::Instance' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Queue", + "logicalId": "MyEC2Instance3", "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 5, + "startLine": 62, "startColumn": 5, - "endLine": 5, + "endLine": 62, "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'EventSourceArn' is create-only; updating it will cause resource replacement", + "message": "Resource 'myEc2Instance4' of type 'AWS::EC2::Instance' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ESM", + "logicalId": "myEc2Instance4", "entityType": "Resource", - "resourceType": "AWS::Lambda::EventSourceMapping" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.EventSourceArn", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 21, - "startColumn": 7, - "endLine": 21, - "endColumn": 21, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt Queue.Arn" - } + "startLine": 67, + "startColumn": 5, + "endLine": 67, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Queue' of type 'AWS::SQS::Queue' supports Tags but none are configured", + "message": "Resource 'RootRole' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Queue", + "logicalId": "RootRole", "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" + "resourceType": "AWS::IAM::Role" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 5, + "startLine": 71, "startColumn": 5, - "endLine": 5, + "endLine": 71, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -7490,19 +7061,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Func' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "message": "Resource 'ElasticLoadBalancer' of type 'AWS::ElasticLoadBalancing::LoadBalancer' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Func", + "logicalId": "ElasticLoadBalancer", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::ElasticLoadBalancing::LoadBalancer" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 9, + "startLine": 112, "startColumn": 5, - "endLine": 9, + "endLine": 112, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -7510,116 +7081,95 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'ESM' of type 'AWS::Lambda::EventSourceMapping' supports Tags but none are configured", + "message": "Resource 'myLambdaTwo' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ESM", + "logicalId": "myLambdaTwo", "entityType": "Resource", - "resourceType": "AWS::Lambda::EventSourceMapping" + "resourceType": "AWS::Lambda::Function" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 19, + "startLine": 146, "startColumn": 5, - "endLine": 19, + "endLine": 146, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" - } - ] - }, - "bad/lambda_zip_no_handler.yaml": { - "filePath": "bad/lambda_zip_no_handler.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 1, - "informational": 2, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "W2533", - "severity": "WARN", - "message": "Properties ['Handler', 'Runtime'] missing for zip file deployment at Resources/Func/Properties", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'lambdaMap1' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Func", + "logicalId": "lambdaMap1", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.Code", - "suggestedFix": "Add the missing properties for zip file deployment", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 7, - "startColumn": 7, - "endLine": 7, - "endColumn": 11, - "ruleDescription": "Check required properties for Lambda if the deployment package is a .zip file", + "startLine": 195, + "startColumn": 5, + "endLine": 195, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "message": "Resource 'lambdaMap2' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Func", + "logicalId": "lambdaMap2", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.FunctionName", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 6, - "startColumn": 7, - "endLine": 6, - "endColumn": 19, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 203, + "startColumn": 5, + "endLine": 203, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Func' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "message": "Resource 'MyEc2BlockDevice' of type 'AWS::EC2::Instance' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Func", + "logicalId": "MyEc2BlockDevice", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 5, + "startLine": 218, "startColumn": 5, - "endLine": 5, + "endLine": 218, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "bad/lambda_zipfile_java.yaml": { - "filePath": "bad/lambda_zipfile_java.yaml", + "bad/getatt_object_attribute_member.yaml": { + "filePath": "bad/getatt_object_attribute_member.yaml", "status": "OK", "metadata": { - "resourcesScanned": 1, + "resourcesScanned": 2, "counts": { "fatal": 0, "errors": 1, - "warnings": 1, - "informational": 3, + "warnings": 0, + "informational": 2, "debug": 0 }, "suppressed": 0, @@ -7628,115 +7178,76 @@ }, "diagnostics": [ { - "ruleId": "E3677", + "ruleId": "E9004", "severity": "ERROR", - "message": "Runtime 'java21' is not supported with Code.ZipFile - use nodejs or python", - "source": "CFN_LINT", - "entity": { - "logicalId": "LambdaFn", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "category": "Resource", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 11, - "ruleDescription": "Lambda ZipFile requires nodejs or python runtime", - "phase": "LINT" - }, - { - "ruleId": "W9013", - "severity": "WARN", - "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", - "source": "ENGINE", - "entity": { - "logicalId": "LambdaFn", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "category": "Security", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 11, - "ruleDescription": "Hardcoded account ID in ARN", - "phase": "LINT" - }, - { - "ruleId": "I2530", - "severity": "INFO", - "message": "Runtime 'java21' should consider using SnapStart for improved performance", - "source": "CFN_LINT", + "message": "'Tags.0' is not one of ['Arn', 'DomainName', 'DualStackDomainName', 'MetadataConfiguration.AnnotationTableConfiguration.TableArn', 'MetadataConfiguration.AnnotationTableConfiguration.TableName', 'MetadataConfiguration.Destination', 'MetadataConfiguration.InventoryTableConfiguration.TableArn', 'MetadataConfiguration.InventoryTableConfiguration.TableName', 'MetadataConfiguration.JournalTableConfiguration.TableArn', 'MetadataConfiguration.JournalTableConfiguration.TableName', 'MetadataTableConfiguration.S3TablesDestination.TableArn', 'MetadataTableConfiguration.S3TablesDestination.TableNamespace', 'RegionalDomainName', 'WebsiteURL']", + "source": "SCHEMA", "entity": { - "logicalId": "LambdaFn", + "logicalId": "Param", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::SSM::Parameter" }, - "propertyPath": "Properties.SnapStart.ApplyOn", - "suggestedFix": "Add SnapStart with ApplyOn set to 'PublishedVersions'", - "category": "Best Practice", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "documentationUrl": "https://docs.aws.amazon.com/lambda/latest/dg/snapstart.html", - "ruleDescription": "Validate that SnapStart is configured for >= Java11 runtimes", + "propertyPath": "Properties.Value", + "suggestedFix": "Check the resource type documentation for valid GetAtt attributes", + "category": "Intrinsic Function", + "startLine": 15, + "startColumn": 7, + "endLine": 15, + "endColumn": 12, + "ruleDescription": "GetAtt attribute must exist on target resource type", "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "message": "Resource 'Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "LambdaFn", + "logicalId": "Bucket", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.FunctionName", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 6, - "startColumn": 7, - "endLine": 6, - "endColumn": 19, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 9, + "startColumn": 3, + "endLine": 9, + "endColumn": 9, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'LambdaFn' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "message": "Resource 'Param' of type 'AWS::SSM::Parameter' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "LambdaFn", + "logicalId": "Param", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::SSM::Parameter" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 5, + "startLine": 13, "startColumn": 5, - "endLine": 5, + "endLine": 13, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "bad/lifecycle_conditional_invalid_policies.yaml": { - "filePath": "bad/lifecycle_conditional_invalid_policies.yaml", + "bad/hard_coded_arn_properties.yaml": { + "filePath": "bad/hard_coded_arn_properties.yaml", "status": "OK", "metadata": { - "resourcesScanned": 7, + "resourcesScanned": 6, "counts": { - "fatal": 11, + "fatal": 0, "errors": 0, - "warnings": 4, + "warnings": 2, "informational": 6, "debug": 0 }, @@ -7746,418 +7257,305 @@ }, "diagnostics": [ { - "ruleId": "F0018", - "severity": "FATAL", - "message": "UpdateReplacePolicy must be one of Delete, Retain, got 'BadValue'", - "source": "SCHEMA", - "entity": { - "logicalId": "ConditionalInvalidUpdate", - "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" - }, - "propertyPath": "UpdateReplacePolicy", - "category": "Structure", - "startLine": 21, - "startColumn": 5, - "endLine": 21, - "endColumn": 24, - "ruleDescription": "UpdateReplacePolicy must be valid", - "phase": "SCHEMA" - }, - { - "ruleId": "F0018", - "severity": "FATAL", - "message": "UpdateReplacePolicy must be one of Delete, Retain, got null", - "source": "SCHEMA", - "entity": { - "logicalId": "DirectNoValuePolicies", - "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" - }, - "propertyPath": "UpdateReplacePolicy", - "category": "Structure", - "startLine": 30, - "startColumn": 5, - "endLine": 30, - "endColumn": 24, - "ruleDescription": "UpdateReplacePolicy must be valid", - "phase": "SCHEMA" - }, - { - "ruleId": "F0018", - "severity": "FATAL", - "message": "UpdateReplacePolicy must be one of Delete, Retain, got 'arn:aws:cloudformation:us-east-1:123456789012:stack/teststack/51af3dc0-da77-11e4-872e-1234567db123'", - "source": "SCHEMA", - "entity": { - "logicalId": "StackIdPolicies", - "entityType": "Resource", - "resourceType": "AWS::CloudFormation::WaitConditionHandle" - }, - "propertyPath": "UpdateReplacePolicy", - "category": "Structure", - "startLine": 35, - "startColumn": 5, - "endLine": 35, - "endColumn": 24, - "ruleDescription": "UpdateReplacePolicy must be valid", - "phase": "SCHEMA" - }, - { - "ruleId": "F0018", - "severity": "FATAL", - "message": "UpdateReplacePolicy must be one of Delete, Retain, got null", - "source": "SCHEMA", - "entity": { - "logicalId": "ConditionalNoValuePolicies", - "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" - }, - "propertyPath": "UpdateReplacePolicy", - "category": "Structure", - "startLine": 40, - "startColumn": 5, - "endLine": 40, - "endColumn": 24, - "ruleDescription": "UpdateReplacePolicy must be valid", - "phase": "SCHEMA" - }, - { - "ruleId": "F3016", - "severity": "FATAL", - "message": "DeletionPolicy must be one of Delete, Retain, RetainExceptOnCreate, got 'InvalidPolicy'", - "source": "SCHEMA", - "entity": { - "logicalId": "ConditionalInvalidDeletion", - "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" - }, - "propertyPath": "DeletionPolicy", - "category": "Structure", - "startLine": 17, - "startColumn": 5, - "endLine": 17, - "endColumn": 19, - "ruleDescription": "DeletionPolicy must be valid", - "phase": "SCHEMA" - }, - { - "ruleId": "F3016", - "severity": "FATAL", - "message": "DeletionPolicy must be one of Delete, Retain, RetainExceptOnCreate, got 'AlsoWrong'", - "source": "SCHEMA", - "entity": { - "logicalId": "BothBranchesInvalid", - "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" - }, - "propertyPath": "DeletionPolicy", - "category": "Structure", - "startLine": 25, - "startColumn": 5, - "endLine": 25, - "endColumn": 19, - "ruleDescription": "DeletionPolicy must be valid", - "phase": "SCHEMA" - }, - { - "ruleId": "F3016", - "severity": "FATAL", - "message": "DeletionPolicy must be one of Delete, Retain, RetainExceptOnCreate, got 'WrongOne'", - "source": "SCHEMA", - "entity": { - "logicalId": "BothBranchesInvalid", - "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" - }, - "propertyPath": "DeletionPolicy", - "category": "Structure", - "startLine": 25, - "startColumn": 5, - "endLine": 25, - "endColumn": 19, - "ruleDescription": "DeletionPolicy must be valid", - "phase": "SCHEMA" - }, - { - "ruleId": "F3016", - "severity": "FATAL", - "message": "DeletionPolicy must be one of Delete, Retain, RetainExceptOnCreate, got null", - "source": "SCHEMA", - "entity": { - "logicalId": "DirectNoValuePolicies", - "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" - }, - "propertyPath": "DeletionPolicy", - "category": "Structure", - "startLine": 29, - "startColumn": 5, - "endLine": 29, - "endColumn": 19, - "ruleDescription": "DeletionPolicy must be valid", - "phase": "SCHEMA" - }, - { - "ruleId": "F3016", - "severity": "FATAL", - "message": "DeletionPolicy must be one of Delete, Retain, RetainExceptOnCreate, got 'arn:aws:cloudformation:us-east-1:123456789012:stack/teststack/51af3dc0-da77-11e4-872e-1234567db123'", - "source": "SCHEMA", - "entity": { - "logicalId": "StackIdPolicies", - "entityType": "Resource", - "resourceType": "AWS::CloudFormation::WaitConditionHandle" - }, - "propertyPath": "DeletionPolicy", - "category": "Structure", - "startLine": 34, - "startColumn": 5, - "endLine": 34, - "endColumn": 19, - "ruleDescription": "DeletionPolicy must be valid", - "phase": "SCHEMA" - }, - { - "ruleId": "F3016", - "severity": "FATAL", - "message": "DeletionPolicy must be one of Delete, Retain, RetainExceptOnCreate, got null", - "source": "SCHEMA", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "ConditionalNoValuePolicies", + "logicalId": "S3BadBucket", "entityType": "Resource", "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "DeletionPolicy", - "category": "Structure", - "startLine": 39, - "startColumn": 5, - "endLine": 39, - "endColumn": 19, - "ruleDescription": "DeletionPolicy must be valid", - "phase": "SCHEMA" + "propertyPath": "Properties.NotificationConfiguration.TopicConfigurations.0.Topic.Fn::Sub", + "category": "Best Practice", + "startLine": 9, + "startColumn": 11, + "endLine": 9, + "endColumn": 18, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "F3016", - "severity": "FATAL", - "message": "DeletionPolicy must be one of Delete, Retain, RetainExceptOnCreate, got an object", - "source": "SCHEMA", + "ruleId": "W3045", + "severity": "WARN", + "message": "AccessControl property is deprecated. Use bucket policies instead", + "source": "CFN_LINT", "entity": { - "logicalId": "DynamicObjectPolicy", + "logicalId": "S3BadBucket", "entityType": "Resource", "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "DeletionPolicy", - "category": "Structure", - "startLine": 44, - "startColumn": 5, - "endLine": 44, - "endColumn": 19, - "ruleDescription": "DeletionPolicy must be valid", - "phase": "SCHEMA" + "propertyPath": "Properties.AccessControl", + "suggestedFix": "Remove AccessControl and use an AWS::S3::BucketPolicy resource", + "category": "Deprecation", + "startLine": 6, + "startColumn": 7, + "endLine": 6, + "endColumn": 20, + "ruleDescription": "Controlling access to an S3 bucket should be done with bucket policies", + "phase": "LINT", + "context": { + "actualValue": "Private" + } }, { - "ruleId": "W3011", - "severity": "WARN", - "message": "Both 'UpdateReplacePolicy' and 'DeletionPolicy' are needed to protect resource from deletion", + "ruleId": "I3042", + "severity": "INFO", + "message": "ARN in Resource S3BadBucket contains hardcoded Partition in ARN or incorrectly placed Pseudo Parameters", "source": "CFN_LINT", "entity": { - "logicalId": "ConditionalInvalidDeletion", + "logicalId": "S3BadBucket", "entityType": "Resource", "resourceType": "AWS::S3::Bucket" }, + "propertyPath": "Properties.NotificationConfiguration.TopicConfigurations.0.Topic.Fn::Sub", "category": "Best Practice", - "startLine": 15, - "startColumn": 3, - "endLine": 15, - "endColumn": 29, - "ruleDescription": "Check resources with UpdateReplacePolicy/DeletionPolicy have both", + "startLine": 9, + "startColumn": 11, + "endLine": 9, + "endColumn": 18, + "ruleDescription": "ARNs should use correctly placed Pseudo Parameters", "phase": "LINT" - }, - { - "ruleId": "W3011", - "severity": "WARN", - "message": "Both 'UpdateReplacePolicy' and 'DeletionPolicy' are needed to protect resource from deletion", + }, + { + "ruleId": "I3042", + "severity": "INFO", + "message": "ARN in Resource SampleBadBucketPolicy contains hardcoded Partition in ARN or incorrectly placed Pseudo Parameters", "source": "CFN_LINT", "entity": { - "logicalId": "ConditionalInvalidUpdate", + "logicalId": "SampleBadBucketPolicy", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::S3::BucketPolicy" }, + "propertyPath": "Properties.PolicyDocument.Statement.0.Resource.Fn::Sub", "category": "Best Practice", - "startLine": 19, - "startColumn": 3, - "endLine": 19, - "endColumn": 27, - "ruleDescription": "Check resources with UpdateReplacePolicy/DeletionPolicy have both", + "startLine": 21, + "startColumn": 13, + "endLine": 21, + "endColumn": 20, + "ruleDescription": "ARNs should use correctly placed Pseudo Parameters", "phase": "LINT" }, { - "ruleId": "W3011", - "severity": "WARN", - "message": "Both 'UpdateReplacePolicy' and 'DeletionPolicy' are needed to protect resource from deletion", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Bucket' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "BothBranchesInvalid", + "logicalId": "SampleBadBucketPolicy", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::S3::BucketPolicy" }, + "propertyPath": "Properties.Bucket", "category": "Best Practice", - "startLine": 23, - "startColumn": 3, - "endLine": 23, - "endColumn": 22, - "ruleDescription": "Check resources with UpdateReplacePolicy/DeletionPolicy have both", - "phase": "LINT" + "startLine": 15, + "startColumn": 7, + "endLine": 15, + "endColumn": 13, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'S3BadBucket'" + } }, { - "ruleId": "W3011", - "severity": "WARN", - "message": "Both 'UpdateReplacePolicy' and 'DeletionPolicy' are needed to protect resource from deletion", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Path' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "DynamicObjectPolicy", + "logicalId": "SampleRole", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::IAM::Role" }, + "propertyPath": "Properties.Path", "category": "Best Practice", - "startLine": 42, - "startColumn": 3, - "endLine": 42, - "endColumn": 22, - "ruleDescription": "Check resources with UpdateReplacePolicy/DeletionPolicy have both", - "phase": "LINT" + "startLine": 36, + "startColumn": 7, + "endLine": 36, + "endColumn": 11, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'ConditionalInvalidDeletion' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Resource 'S3BadBucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ConditionalInvalidDeletion", + "logicalId": "S3BadBucket", "entityType": "Resource", "resourceType": "AWS::S3::Bucket" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 15, - "startColumn": 3, - "endLine": 15, - "endColumn": 29, + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'ConditionalInvalidUpdate' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Resource 'SampleRole' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ConditionalInvalidUpdate", + "logicalId": "SampleRole", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::IAM::Role" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 19, - "startColumn": 3, - "endLine": 19, - "endColumn": 27, + "startLine": 26, + "startColumn": 5, + "endLine": 26, + "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "bad/hardcoded_partition.yaml": { + "filePath": "bad/hardcoded_partition.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 2, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 1, + "informational": 4, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'BothBranchesInvalid' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "ruleId": "W9013", + "severity": "WARN", + "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", "source": "ENGINE", "entity": { - "logicalId": "BothBranchesInvalid", + "logicalId": "Topic", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 23, + "category": "Security", + "startLine": 7, "startColumn": 3, - "endLine": 23, - "endColumn": 22, - "ruleDescription": "Resource should have Tags", + "endLine": 7, + "endColumn": 8, + "ruleDescription": "Hardcoded account ID in ARN", "phase": "LINT" }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'DirectNoValuePolicies' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DirectNoValuePolicies", + "logicalId": "Bucket", "entityType": "Resource", "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.BucketName", "category": "Best Practice", - "startLine": 27, - "startColumn": 3, - "endLine": 27, - "endColumn": 24, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 6, + "startColumn": 7, + "endLine": 6, + "endColumn": 17, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'TopicName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "Topic", + "entityType": "Resource", + "resourceType": "AWS::SNS::Topic" + }, + "propertyPath": "Properties.TopicName", + "category": "Best Practice", + "startLine": 10, + "startColumn": 7, + "endLine": 10, + "endColumn": 16, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sns", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'ConditionalNoValuePolicies' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Resource 'Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ConditionalNoValuePolicies", + "logicalId": "Bucket", "entityType": "Resource", "resourceType": "AWS::S3::Bucket" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 37, - "startColumn": 3, - "endLine": 37, - "endColumn": 29, + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'DynamicObjectPolicy' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Resource 'Topic' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "DynamicObjectPolicy", + "logicalId": "Topic", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 42, - "startColumn": 3, - "endLine": 42, - "endColumn": 22, + "startLine": 9, + "startColumn": 5, + "endLine": 9, + "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "bad/lifecycle_policy_shapes.yaml": { - "filePath": "bad/lifecycle_policy_shapes.yaml", + "bad/iam_bad_statement.yaml": { + "filePath": "bad/iam_bad_statement.yaml", "status": "OK", "metadata": { - "resourcesScanned": 11, + "resourcesScanned": 1, "counts": { - "fatal": 12, + "fatal": 0, "errors": 1, - "warnings": 1, - "informational": 5, + "warnings": 0, + "informational": 0, "debug": 0 }, "suppressed": 0, @@ -8166,384 +7564,389 @@ }, "diagnostics": [ { - "ruleId": "F0018", - "severity": "FATAL", - "message": "UpdateReplacePolicy must be one of Delete, Retain, got a list", - "source": "SCHEMA", - "entity": { - "logicalId": "ListPolicies", - "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" - }, - "propertyPath": "UpdateReplacePolicy", - "category": "Structure", - "startLine": 19, - "startColumn": 5, - "endLine": 19, - "endColumn": 24, - "ruleDescription": "UpdateReplacePolicy must be valid", - "phase": "SCHEMA" - }, - { - "ruleId": "F0018", - "severity": "FATAL", - "message": "UpdateReplacePolicy must be one of Delete, Retain, got an object", - "source": "SCHEMA", - "entity": { - "logicalId": "ObjectPolicies", - "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" - }, - "propertyPath": "UpdateReplacePolicy", - "category": "Structure", - "startLine": 25, - "startColumn": 5, - "endLine": 25, - "endColumn": 24, - "ruleDescription": "UpdateReplacePolicy must be valid", - "phase": "SCHEMA" - }, - { - "ruleId": "F0018", - "severity": "FATAL", - "message": "UpdateReplacePolicy must be one of Delete, Retain, got null", - "source": "SCHEMA", - "entity": { - "logicalId": "NoValuePoliciesWithoutTransform", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "propertyPath": "UpdateReplacePolicy", - "category": "Structure", - "startLine": 65, - "startColumn": 5, - "endLine": 65, - "endColumn": 24, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sqs.git", - "ruleDescription": "UpdateReplacePolicy must be valid", - "phase": "SCHEMA" - }, - { - "ruleId": "F1101", - "severity": "FATAL", - "message": "Ref is not supported as a top-level CreationPolicy value; CreationPolicy must be an object or Fn::If returning an object", - "source": "SCHEMA", + "ruleId": "E3510", + "severity": "ERROR", + "message": "'Effect' is a required property", + "source": "CFN_LINT", "entity": { - "logicalId": "CreationRootRef", + "logicalId": "Policy", "entityType": "Resource", - "resourceType": "AWS::CloudFormation::WaitCondition" + "resourceType": "AWS::IAM::Policy" }, - "propertyPath": "CreationPolicy", - "category": "Structure", - "startLine": 30, - "startColumn": 5, - "endLine": 30, - "endColumn": 19, - "ruleDescription": "Invalid YAML/JSON syntax", - "phase": "PARSE" + "propertyPath": "Properties.PolicyDocument.Statement.0", + "category": "Resource", + "startLine": 10, + "startColumn": 19, + "endLine": 10, + "endColumn": 20, + "ruleDescription": "Validate identity based IAM policies", + "phase": "LINT" + } + ] + }, + "bad/iam_ref_with_path.yaml": { + "filePath": "bad/iam_ref_with_path.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 2, + "counts": { + "fatal": 0, + "errors": 1, + "warnings": 0, + "informational": 3, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "F1101", - "severity": "FATAL", - "message": "Fn::FindInMap is not supported as a top-level CreationPolicy value; CreationPolicy must be an object or Fn::If returning an object", - "source": "SCHEMA", + "ruleId": "E3050", + "severity": "ERROR", + "message": "Ref to IAM role 'Role' with Path '/custom/path/' - use GetAtt Role.Arn instead", + "source": "CFN_LINT", "entity": { - "logicalId": "CreationRootFindInMap", + "logicalId": "Project", "entityType": "Resource", - "resourceType": "AWS::CloudFormation::WaitCondition" + "resourceType": "AWS::CodeBuild::Project" }, - "propertyPath": "CreationPolicy", - "category": "Structure", - "startLine": 34, - "startColumn": 5, - "endLine": 34, - "endColumn": 19, - "ruleDescription": "Invalid YAML/JSON syntax", - "phase": "PARSE" + "propertyPath": "Properties.ServiceRole", + "suggestedFix": "Switch from Ref to !GetAtt .Arn when Path is not '/'", + "category": "Resource", + "startLine": 17, + "startColumn": 7, + "endLine": 17, + "endColumn": 18, + "ruleDescription": "Check if REFing to a IAM resource with path set", + "phase": "LINT" }, { - "ruleId": "F1101", - "severity": "FATAL", - "message": "Fn::Select is not supported as a top-level CreationPolicy value; CreationPolicy must be an object or Fn::If returning an object", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Path' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "CreationRootSelect", + "logicalId": "Role", "entityType": "Resource", - "resourceType": "AWS::CloudFormation::WaitCondition" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "CreationPolicy", - "category": "Structure", - "startLine": 38, - "startColumn": 5, - "endLine": 38, - "endColumn": 19, - "ruleDescription": "Invalid YAML/JSON syntax", - "phase": "PARSE" + "propertyPath": "Properties.Path", + "category": "Best Practice", + "startLine": 6, + "startColumn": 7, + "endLine": 6, + "endColumn": 11, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "F1101", - "severity": "FATAL", - "message": "Fn::Sub is not supported as a top-level CreationPolicy value; CreationPolicy must be an object or Fn::If returning an object", - "source": "SCHEMA", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Role' of type 'AWS::IAM::Role' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "CreationRootSub", + "logicalId": "Role", "entityType": "Resource", - "resourceType": "AWS::CloudFormation::WaitCondition" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "CreationPolicy", - "category": "Structure", - "startLine": 45, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 5, "startColumn": 5, - "endLine": 45, - "endColumn": 19, - "ruleDescription": "Invalid YAML/JSON syntax", - "phase": "PARSE" - }, - { - "ruleId": "F1101", - "severity": "FATAL", - "message": "Fn::If branch in CreationPolicy must be an object, got a string", - "source": "SCHEMA", - "entity": { - "logicalId": "CreationConditionalInvalid", - "entityType": "Resource", - "resourceType": "AWS::CloudFormation::WaitCondition" - }, - "propertyPath": "CreationPolicy.Fn::If.2", - "category": "Structure", - "startLine": 51, - "startColumn": 63, - "endLine": 51, - "endColumn": 64, - "ruleDescription": "Invalid YAML/JSON syntax", - "phase": "PARSE" + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "F1101", - "severity": "FATAL", - "message": "Ref is not supported as a top-level CreationPolicy value; CreationPolicy must be an object or Fn::If returning an object", - "source": "SCHEMA", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Project' of type 'AWS::CodeBuild::Project' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "CreationNoValueOnUnsupportedType", + "logicalId": "Project", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::CodeBuild::Project" }, - "propertyPath": "CreationPolicy", - "category": "Structure", - "startLine": 55, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 16, "startColumn": 5, - "endLine": 55, - "endColumn": 19, - "ruleDescription": "Invalid YAML/JSON syntax", - "phase": "PARSE" + "endLine": 16, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "bad/iam_wildcard_all_types.yaml": { + "filePath": "bad/iam_wildcard_all_types.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 4, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 1, + "informational": 2, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "F3016", - "severity": "FATAL", - "message": "DeletionPolicy must be one of Delete, Retain, RetainExceptOnCreate, got a list", - "source": "SCHEMA", + "ruleId": "W2512", + "severity": "WARN", + "message": "IAM policy uses NotAction which grants all actions except those listed - consider using Action instead", + "source": "ENGINE", "entity": { - "logicalId": "ListPolicies", + "logicalId": "NotActionUser", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::IAM::User" }, - "propertyPath": "DeletionPolicy", - "category": "Structure", - "startLine": 18, - "startColumn": 5, - "endLine": 18, - "endColumn": 19, - "ruleDescription": "DeletionPolicy must be valid", - "phase": "SCHEMA" + "category": "Security", + "startLine": 34, + "startColumn": 3, + "endLine": 34, + "endColumn": 16, + "ruleDescription": "IAM policy with NotAction", + "phase": "LINT" }, { - "ruleId": "F3016", - "severity": "FATAL", - "message": "DeletionPolicy must be one of Delete, Retain, RetainExceptOnCreate, got an object", - "source": "SCHEMA", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'WildcardUser' of type 'AWS::IAM::User' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "ObjectPolicies", + "logicalId": "WildcardUser", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::IAM::User" }, - "propertyPath": "DeletionPolicy", - "category": "Structure", - "startLine": 23, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 5, "startColumn": 5, - "endLine": 23, - "endColumn": 19, - "ruleDescription": "DeletionPolicy must be valid", - "phase": "SCHEMA" + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "F3016", - "severity": "FATAL", - "message": "DeletionPolicy must be one of Delete, Retain, RetainExceptOnCreate, got null", - "source": "SCHEMA", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'NotActionUser' of type 'AWS::IAM::User' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "NoValuePoliciesWithoutTransform", + "logicalId": "NotActionUser", "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" + "resourceType": "AWS::IAM::User" }, - "propertyPath": "DeletionPolicy", - "category": "Structure", - "startLine": 64, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 36, "startColumn": 5, - "endLine": 64, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sqs.git", - "ruleDescription": "DeletionPolicy must be valid", - "phase": "SCHEMA" + "endLine": 36, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "bad/if_wrong_arity.yaml": { + "filePath": "bad/if_wrong_arity.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 1, + "errors": 0, + "warnings": 1, + "informational": 2, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "E3055", - "severity": "ERROR", - "message": "CreationPolicy is not supported on resource type 'AWS::S3::Bucket'", - "source": "CFN_LINT", + "ruleId": "F0013", + "severity": "FATAL", + "message": "Fn::If: must have exactly 3 elements, got 2", + "source": "SCHEMA", "entity": { - "logicalId": "CreationNoValueOnUnsupportedType", + "logicalId": "R", "entityType": "Resource", "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "CreationPolicy", - "suggestedFix": "Remove CreationPolicy or change resource type to one of: AWS::AppStream::Fleet, AWS::AutoScaling::AutoScalingGroup, AWS::CloudFormation::WaitCondition, AWS::EC2::Instance", - "category": "Resource", - "startLine": 55, - "startColumn": 5, - "endLine": 55, - "endColumn": 19, - "ruleDescription": "Check CreationPolicy values for Resources", - "phase": "LINT" + "propertyPath": "Properties.BucketName.Fn::If", + "category": "Intrinsic Function", + "startLine": 12, + "startColumn": 9, + "endLine": 12, + "endColumn": 15, + "ruleDescription": "Fn::If must have exactly 3 elements", + "phase": "PARSE" }, { "ruleId": "W8003", "severity": "WARN", - "message": "Fn::Equals in condition 'Never' will always return False", + "message": "Fn::Equals in condition 'IsProd' will always return False", "source": "CFN_LINT", "entity": { - "logicalId": "Never", + "logicalId": "IsProd", "entityType": "Condition" }, - "propertyPath": "Conditions/Never", + "propertyPath": "Conditions/IsProd", "category": "Best Practice", - "startLine": 13, + "startLine": 3, "startColumn": 3, - "endLine": 13, - "endColumn": 8, + "endLine": 3, + "endColumn": 9, "ruleDescription": "Fn::Equals will always return true or false", "phase": "PARSE" }, { - "ruleId": "I3013", + "ruleId": "I9001", "severity": "INFO", - "message": "'MessageRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "NoValuePoliciesWithoutTransform", + "logicalId": "R", "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties", + "propertyPath": "Properties.BucketName", "category": "Best Practice", - "startLine": 62, - "startColumn": 3, - "endLine": 62, - "endColumn": 34, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", - "phase": "LINT" + "startLine": 11, + "startColumn": 7, + "endLine": 11, + "endColumn": 17, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'ListPolicies' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Resource 'R' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ListPolicies", + "logicalId": "R", "entityType": "Resource", "resourceType": "AWS::S3::Bucket" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 16, - "startColumn": 3, - "endLine": 16, + "startLine": 10, + "startColumn": 5, + "endLine": 10, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "bad/invalid_deletion_policy.yaml": { + "filePath": "bad/invalid_deletion_policy.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 1, + "errors": 0, + "warnings": 1, + "informational": 1, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'ObjectPolicies' of type 'AWS::S3::Bucket' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "F3016", + "severity": "FATAL", + "message": "DeletionPolicy must be one of Delete, Retain, RetainExceptOnCreate, got 'Remove'", + "source": "SCHEMA", "entity": { - "logicalId": "ObjectPolicies", + "logicalId": "Bucket", "entityType": "Resource", "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 21, - "startColumn": 3, - "endLine": 21, - "endColumn": 17, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "propertyPath": "DeletionPolicy", + "category": "Structure", + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 19, + "ruleDescription": "DeletionPolicy must be valid", + "phase": "SCHEMA" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'CreationNoValueOnUnsupportedType' of type 'AWS::S3::Bucket' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W3011", + "severity": "WARN", + "message": "Both 'UpdateReplacePolicy' and 'DeletionPolicy' are needed to protect resource from deletion", + "source": "CFN_LINT", "entity": { - "logicalId": "CreationNoValueOnUnsupportedType", + "logicalId": "Bucket", "entityType": "Resource", "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 53, + "startLine": 3, "startColumn": 3, - "endLine": 53, - "endColumn": 35, - "ruleDescription": "Resource should have Tags", + "endLine": 3, + "endColumn": 9, + "ruleDescription": "Check resources with UpdateReplacePolicy/DeletionPolicy have both", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'NoValuePoliciesWithoutTransform' of type 'AWS::SQS::Queue' supports Tags but none are configured", + "message": "Resource 'Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "NoValuePoliciesWithoutTransform", + "logicalId": "Bucket", "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" + "resourceType": "AWS::S3::Bucket" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 62, + "startLine": 3, "startColumn": 3, - "endLine": 62, - "endColumn": 34, + "endLine": 3, + "endColumn": 9, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "bad/limit_numbers.yaml": { - "filePath": "bad/limit_numbers.yaml", + "bad/invalid_mapping_structure.yaml": { + "filePath": "bad/invalid_mapping_structure.yaml", "status": "OK", "metadata": { - "resourcesScanned": 501, + "resourcesScanned": 1, "counts": { - "fatal": 5, + "fatal": 1, "errors": 0, - "warnings": 401, - "informational": 501, + "warnings": 1, + "informational": 1, "debug": 0 }, "suppressed": 0, @@ -8552,1673 +7955,2218 @@ }, "diagnostics": [ { - "ruleId": "F0003", - "severity": "FATAL", - "message": "Template has 201 parameters, maximum is 200", - "source": "SCHEMA", - "category": "Structure", - "startLine": 1, - "startColumn": 1, - "endLine": 1, - "endColumn": 11, - "ruleDescription": "Maximum 200 parameters", - "phase": "SCHEMA" - }, - { - "ruleId": "F0004", - "severity": "FATAL", - "message": "Template has 201 outputs, maximum is 200", - "source": "SCHEMA", - "category": "Structure", - "startLine": 1407, - "startColumn": 1, - "endLine": 1407, - "endColumn": 8, - "ruleDescription": "Maximum 200 outputs", - "phase": "SCHEMA" - }, - { - "ruleId": "F0007", - "severity": "FATAL", - "message": "Template has 501 resources, maximum is 500", - "source": "SCHEMA", - "category": "Structure", - "startLine": 404, - "startColumn": 1, - "endLine": 404, - "endColumn": 10, - "ruleDescription": "Maximum 500 resources", - "phase": "SCHEMA" - }, - { - "ruleId": "F0008", - "severity": "FATAL", - "message": "Template has 201 mappings, maximum is 200", - "source": "SCHEMA", - "category": "Structure", - "startLine": 1810, - "startColumn": 1, - "endLine": 1810, - "endColumn": 9, - "ruleDescription": "Maximum 200 mappings", - "phase": "SCHEMA" - }, - { - "ruleId": "F0050", + "ruleId": "F0017", "severity": "FATAL", - "message": "Mapping 'Mapping201'.'Key' has 202 attributes, maximum is 200", + "message": "Mapping 'BadMap' second level key 'Key1' must be a map", "source": "SCHEMA", "entity": { - "logicalId": "Mapping201", + "logicalId": "BadMap", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping201/Key", + "propertyPath": "Mappings/BadMap/Key1", "category": "Structure", - "startLine": 2412, + "startLine": 4, "startColumn": 5, - "endLine": 2412, - "endColumn": 8, - "ruleDescription": "Mapping must have valid 3-level structure", - "phase": "SCHEMA" + "endLine": 4, + "endColumn": 9, + "ruleDescription": "Mapping level must be a map", + "phase": "PARSE" }, { - "ruleId": "W2001", + "ruleId": "W7001", "severity": "WARN", - "message": "Parameter 'Parameter2' is not referenced anywhere in the template", + "message": "Mapping 'BadMap' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter2", - "entityType": "Parameter" + "logicalId": "BadMap", + "entityType": "Mapping" }, - "propertyPath": "Parameters/Parameter2", + "propertyPath": "Mappings/BadMap", "category": "Best Practice", - "startLine": 4, + "startLine": 3, "startColumn": 3, - "endLine": 4, - "endColumn": 13, - "ruleDescription": "Check if Parameters are Used", + "endLine": 3, + "endColumn": 9, + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter3' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'R' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Parameter3", - "entityType": "Parameter" + "logicalId": "R", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Parameters/Parameter3", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", "startLine": 6, "startColumn": 3, "endLine": 6, - "endColumn": 13, - "ruleDescription": "Check if Parameters are Used", + "endColumn": 4, + "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "bad/invalid_update_replace_policy.yaml": { + "filePath": "bad/invalid_update_replace_policy.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 1, + "errors": 0, + "warnings": 1, + "informational": 1, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter4' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "F0018", + "severity": "FATAL", + "message": "UpdateReplacePolicy must be one of Delete, Retain, got 'Remove'", + "source": "SCHEMA", "entity": { - "logicalId": "Parameter4", - "entityType": "Parameter" + "logicalId": "Bucket", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Parameters/Parameter4", - "category": "Best Practice", - "startLine": 8, - "startColumn": 3, - "endLine": 8, - "endColumn": 13, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "propertyPath": "UpdateReplacePolicy", + "category": "Structure", + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 24, + "ruleDescription": "UpdateReplacePolicy must be valid", + "phase": "SCHEMA" }, { - "ruleId": "W2001", + "ruleId": "W3011", "severity": "WARN", - "message": "Parameter 'Parameter5' is not referenced anywhere in the template", + "message": "Both 'UpdateReplacePolicy' and 'DeletionPolicy' are needed to protect resource from deletion", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter5", - "entityType": "Parameter" + "logicalId": "Bucket", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Parameters/Parameter5", "category": "Best Practice", - "startLine": 10, + "startLine": 3, "startColumn": 3, - "endLine": 10, - "endColumn": 13, - "ruleDescription": "Check if Parameters are Used", + "endLine": 3, + "endColumn": 9, + "ruleDescription": "Check resources with UpdateReplacePolicy/DeletionPolicy have both", "phase": "LINT" }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter6' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Parameter6", - "entityType": "Parameter" + "logicalId": "Bucket", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Parameters/Parameter6", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 12, + "startLine": 3, "startColumn": 3, - "endLine": 12, - "endColumn": 13, - "ruleDescription": "Check if Parameters are Used", + "endLine": 3, + "endColumn": 9, + "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "bad/issues.yaml": { + "filePath": "bad/issues.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 1, + "errors": 0, + "warnings": 0, + "informational": 4, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter7' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "F1020", + "severity": "FATAL", + "message": "'PrivateSecurityGroup' is not one of ['AWS::AccountId', 'AWS::NoValue', 'AWS::NotificationARNs', 'AWS::Partition', 'AWS::Region', 'AWS::StackId', 'AWS::StackName', 'AWS::URLSuffix', 'RDSOptionGroup']", + "source": "SCHEMA", "entity": { - "logicalId": "Parameter7", - "entityType": "Parameter" + "logicalId": "RDSOptionGroup", + "entityType": "Resource", + "resourceType": "AWS::RDS::OptionGroup" }, - "propertyPath": "Parameters/Parameter7", - "category": "Best Practice", - "startLine": 14, - "startColumn": 3, - "endLine": 14, - "endColumn": 13, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "propertyPath": "Properties.OptionConfigurations.0.VpcSecurityGroupMemberships.0", + "suggestedFix": "Check that the Ref target exists as a resource, parameter, or pseudo-parameter", + "category": "Intrinsic Function", + "startLine": 12, + "startColumn": 20, + "endLine": 12, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", + "ruleDescription": "Ref/GetAtt target must exist", + "phase": "SCHEMA" }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter8' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'EngineName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Parameter8", - "entityType": "Parameter" + "logicalId": "RDSOptionGroup", + "entityType": "Resource", + "resourceType": "AWS::RDS::OptionGroup" }, - "propertyPath": "Parameters/Parameter8", - "category": "Best Practice", - "startLine": 16, - "startColumn": 3, - "endLine": 16, - "endColumn": 13, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "propertyPath": "Properties.EngineName", + "category": "Best Practice", + "startLine": 6, + "startColumn": 7, + "endLine": 6, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter9' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'MajorEngineVersion' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Parameter9", - "entityType": "Parameter" + "logicalId": "RDSOptionGroup", + "entityType": "Resource", + "resourceType": "AWS::RDS::OptionGroup" }, - "propertyPath": "Parameters/Parameter9", + "propertyPath": "Properties.MajorEngineVersion", "category": "Best Practice", - "startLine": 18, - "startColumn": 3, - "endLine": 18, - "endColumn": 13, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "startLine": 7, + "startColumn": 7, + "endLine": 7, + "endColumn": 25, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter10' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'OptionGroupDescription' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Parameter10", - "entityType": "Parameter" + "logicalId": "RDSOptionGroup", + "entityType": "Resource", + "resourceType": "AWS::RDS::OptionGroup" }, - "propertyPath": "Parameters/Parameter10", + "propertyPath": "Properties.OptionGroupDescription", "category": "Best Practice", - "startLine": 20, - "startColumn": 3, - "endLine": 20, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "startLine": 8, + "startColumn": 7, + "endLine": 8, + "endColumn": 29, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter11' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'RDSOptionGroup' of type 'AWS::RDS::OptionGroup' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Parameter11", - "entityType": "Parameter" + "logicalId": "RDSOptionGroup", + "entityType": "Resource", + "resourceType": "AWS::RDS::OptionGroup" }, - "propertyPath": "Parameters/Parameter11", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 22, - "startColumn": 3, - "endLine": 22, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "bad/json_parse.json": { + "filePath": "bad/json_parse.json", + "status": "ERROR", + "metadata": { + "resourcesScanned": 0, + "counts": { + "fatal": 1, + "errors": 0, + "warnings": 0, + "informational": 0, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter12' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "F1101", + "severity": "FATAL", + "message": "JSON parse error: expected `:` at line 5 column 11", + "source": "SCHEMA", + "category": "Structure", + "startLine": 5, + "startColumn": 11, + "endLine": 5, + "endColumn": 11, + "ruleDescription": "Invalid YAML/JSON syntax", + "phase": "PARSE" + } + ] + }, + "bad/lambda_image_handler_intrinsic.yaml": { + "filePath": "bad/lambda_image_handler_intrinsic.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 1, + "errors": 1, + "warnings": 0, + "informational": 2, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "F3003", + "severity": "FATAL", + "message": "'Role' is a required property", + "source": "SCHEMA", "entity": { - "logicalId": "Parameter12", - "entityType": "Parameter" + "logicalId": "Fn", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Parameters/Parameter12", - "category": "Best Practice", - "startLine": 24, - "startColumn": 3, - "endLine": 24, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "propertyPath": "Properties", + "suggestedFix": "Add the required property 'Role'", + "category": "Schema", + "startLine": 10, + "startColumn": 5, + "endLine": 10, + "endColumn": 15, + "ruleDescription": "Required property missing", + "phase": "SCHEMA" }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter13' is not referenced anywhere in the template", + "ruleId": "E3685", + "severity": "ERROR", + "message": "Container image functions cannot specify Handler, Runtime, or Layers properties", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter13", - "entityType": "Parameter" + "logicalId": "Fn", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Parameters/Parameter13", - "category": "Best Practice", - "startLine": 26, - "startColumn": 3, - "endLine": 26, + "propertyPath": "Properties.Handler", + "category": "Resource", + "startLine": 12, + "startColumn": 7, + "endLine": 12, "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", + "ruleDescription": "Container image functions cannot use Handler, Runtime, or Layers", "phase": "LINT" }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter14' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'PackageType' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Parameter14", - "entityType": "Parameter" + "logicalId": "Fn", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Parameters/Parameter14", + "propertyPath": "Properties.PackageType", "category": "Best Practice", - "startLine": 28, - "startColumn": 3, - "endLine": 28, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "startLine": 11, + "startColumn": 7, + "endLine": 11, + "endColumn": 18, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter15' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Fn' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Parameter15", - "entityType": "Parameter" + "logicalId": "Fn", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Parameters/Parameter15", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 30, - "startColumn": 3, - "endLine": 30, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", + "startLine": 10, + "startColumn": 5, + "endLine": 10, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "bad/lambda_no_snapstart.yaml": { + "filePath": "bad/lambda_no_snapstart.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 3, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter16' is not referenced anywhere in the template", + "ruleId": "I2530", + "severity": "INFO", + "message": "Runtime 'java21' should consider using SnapStart for improved performance", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter16", - "entityType": "Parameter" + "logicalId": "Func", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Parameters/Parameter16", + "propertyPath": "Properties.SnapStart.ApplyOn", + "suggestedFix": "Add SnapStart with ApplyOn set to 'PublishedVersions'", "category": "Best Practice", - "startLine": 32, - "startColumn": 3, - "endLine": 32, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "documentationUrl": "https://docs.aws.amazon.com/lambda/latest/dg/snapstart.html", + "ruleDescription": "Validate that SnapStart is configured for >= Java11 runtimes", "phase": "LINT" }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter17' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Parameter17", - "entityType": "Parameter" + "logicalId": "Func", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Parameters/Parameter17", + "propertyPath": "Properties.FunctionName", "category": "Best Practice", - "startLine": 34, - "startColumn": 3, - "endLine": 34, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "startLine": 6, + "startColumn": 7, + "endLine": 6, + "endColumn": 19, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter18' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Func' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Parameter18", - "entityType": "Parameter" + "logicalId": "Func", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Parameters/Parameter18", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 36, - "startColumn": 3, - "endLine": 36, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "bad/lambda_permission_no_source_account.yaml": { + "filePath": "bad/lambda_permission_no_source_account.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 2, + "informational": 4, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "W2001", + "ruleId": "W3663", "severity": "WARN", - "message": "Parameter 'Parameter19' is not referenced anywhere in the template", + "message": "Lambda Permission with a SourceArn that has no account id should also specify SourceAccount", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter19", - "entityType": "Parameter" + "logicalId": "Perm", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" }, - "propertyPath": "Parameters/Parameter19", - "category": "Best Practice", - "startLine": 38, - "startColumn": 3, - "endLine": 38, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", + "propertyPath": "Properties", + "suggestedFix": "Add SourceAccount property", + "category": "Security", + "startLine": 4, + "startColumn": 5, + "endLine": 4, + "endColumn": 15, + "ruleDescription": "Validate SourceAccount is required property", "phase": "LINT" }, { - "ruleId": "W2001", + "ruleId": "W9002", "severity": "WARN", - "message": "Parameter 'Parameter20' is not referenced anywhere in the template", - "source": "CFN_LINT", + "message": "Property 'SourceArn' has a hardcoded ARN - use Ref, GetAtt, or a parameter instead", + "source": "ENGINE", "entity": { - "logicalId": "Parameter20", - "entityType": "Parameter" + "logicalId": "Perm", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" }, - "propertyPath": "Parameters/Parameter20", + "propertyPath": "Properties.SourceArn", "category": "Best Practice", - "startLine": 40, - "startColumn": 3, - "endLine": 40, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", + "startLine": 8, + "startColumn": 7, + "endLine": 8, + "endColumn": 16, + "ruleDescription": "Hardcoded ARN property", "phase": "LINT" }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter21' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Action' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Parameter21", - "entityType": "Parameter" + "logicalId": "Perm", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" }, - "propertyPath": "Parameters/Parameter21", + "propertyPath": "Properties.Action", "category": "Best Practice", - "startLine": 42, - "startColumn": 3, - "endLine": 42, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "startLine": 5, + "startColumn": 7, + "endLine": 5, + "endColumn": 13, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter22' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Parameter22", - "entityType": "Parameter" + "logicalId": "Perm", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" }, - "propertyPath": "Parameters/Parameter22", + "propertyPath": "Properties.FunctionName", "category": "Best Practice", - "startLine": 44, - "startColumn": 3, - "endLine": 44, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "startLine": 6, + "startColumn": 7, + "endLine": 6, + "endColumn": 19, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter23' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Principal' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Parameter23", - "entityType": "Parameter" + "logicalId": "Perm", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" }, - "propertyPath": "Parameters/Parameter23", + "propertyPath": "Properties.Principal", "category": "Best Practice", - "startLine": 46, - "startColumn": 3, - "endLine": 46, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "startLine": 7, + "startColumn": 7, + "endLine": 7, + "endColumn": 16, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter24' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'SourceArn' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Parameter24", - "entityType": "Parameter" + "logicalId": "Perm", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" }, - "propertyPath": "Parameters/Parameter24", + "propertyPath": "Properties.SourceArn", "category": "Best Practice", - "startLine": 48, - "startColumn": 3, - "endLine": 48, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "startLine": 8, + "startColumn": 7, + "endLine": 8, + "endColumn": 16, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + } + ] + }, + "bad/lambda_snapstart_bad_runtime.yaml": { + "filePath": "bad/lambda_snapstart_bad_runtime.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 2, + "informational": 2, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "W2001", + "ruleId": "W2530", "severity": "WARN", - "message": "Parameter 'Parameter25' is not referenced anywhere in the template", + "message": "SnapStart is enabled but no AWS::Lambda::Version resource is attached", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter25", - "entityType": "Parameter" + "logicalId": "SnapStartFunc", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Parameters/Parameter25", + "propertyPath": "Properties.SnapStart.ApplyOn", + "suggestedFix": "Add an AWS::Lambda::Version resource that references this function", "category": "Best Practice", - "startLine": 50, - "startColumn": 3, - "endLine": 50, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", + "startLine": 14, + "startColumn": 9, + "endLine": 14, + "endColumn": 16, + "ruleDescription": "Validate that SnapStart is properly configured", "phase": "LINT" }, { - "ruleId": "W2001", + "ruleId": "W9013", "severity": "WARN", - "message": "Parameter 'Parameter26' is not referenced anywhere in the template", - "source": "CFN_LINT", + "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", + "source": "ENGINE", "entity": { - "logicalId": "Parameter26", - "entityType": "Parameter" + "logicalId": "SnapStartFunc", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Parameters/Parameter26", - "category": "Best Practice", - "startLine": 52, + "category": "Security", + "startLine": 3, "startColumn": 3, - "endLine": 52, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", + "endLine": 3, + "endColumn": 16, + "ruleDescription": "Hardcoded account ID in ARN", "phase": "LINT" }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter27' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Parameter27", - "entityType": "Parameter" + "logicalId": "SnapStartFunc", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Parameters/Parameter27", + "propertyPath": "Properties.FunctionName", "category": "Best Practice", - "startLine": 54, - "startColumn": 3, - "endLine": 54, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "startLine": 6, + "startColumn": 7, + "endLine": 6, + "endColumn": 19, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter28' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'SnapStartFunc' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Parameter28", - "entityType": "Parameter" + "logicalId": "SnapStartFunc", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Parameters/Parameter28", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 56, - "startColumn": 3, - "endLine": 56, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "bad/lambda_snapstart_no_version.yaml": { + "filePath": "bad/lambda_snapstart_no_version.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 1, + "informational": 1, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "W2001", + "ruleId": "W2530", "severity": "WARN", - "message": "Parameter 'Parameter29' is not referenced anywhere in the template", + "message": "SnapStart is enabled but no AWS::Lambda::Version resource is attached", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter29", - "entityType": "Parameter" + "logicalId": "Func", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Parameters/Parameter29", + "propertyPath": "Properties.SnapStart.ApplyOn", + "suggestedFix": "Add an AWS::Lambda::Version resource that references this function", "category": "Best Practice", - "startLine": 58, - "startColumn": 3, - "endLine": 58, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", + "startLine": 13, + "startColumn": 9, + "endLine": 13, + "endColumn": 16, + "ruleDescription": "Validate that SnapStart is properly configured", "phase": "LINT" }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter30' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Func' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Parameter30", - "entityType": "Parameter" + "logicalId": "Func", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Parameters/Parameter30", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 60, - "startColumn": 3, - "endLine": 60, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "bad/lambda_sqs_timeout.yaml": { + "filePath": "bad/lambda_sqs_timeout.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 3, + "counts": { + "fatal": 0, + "errors": 1, + "warnings": 0, + "informational": 7, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter31' is not referenced anywhere in the template", + "ruleId": "E3505", + "severity": "ERROR", + "message": "Queue visibility timeout (10) is less than Function timeout (60) seconds", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter31", - "entityType": "Parameter" + "logicalId": "Queue", + "entityType": "Resource", + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Parameters/Parameter31", - "category": "Best Practice", - "startLine": 62, - "startColumn": 3, - "endLine": 62, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "propertyPath": "Properties.VisibilityTimeout", + "suggestedFix": "Set the SQS VisibilityTimeout to at least the Lambda function Timeout", + "category": "Resource", + "startLine": 6, + "startColumn": 7, + "endLine": 6, + "endColumn": 24, + "ruleDescription": "Validate SQS VisibilityTimeout is greater than a function's Timeout", + "phase": "LINT", + "context": { + "extra": { + "visibility_timeout": 10 + } + } }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter32' is not referenced anywhere in the template", + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter32", - "entityType": "Parameter" + "logicalId": "Queue", + "entityType": "Resource", + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Parameters/Parameter32", "category": "Best Practice", - "startLine": 64, + "startLine": 3, "startColumn": 3, - "endLine": 64, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", + "endLine": 3, + "endColumn": 8, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter33' is not referenced anywhere in the template", + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter33", - "entityType": "Parameter" + "logicalId": "Queue", + "entityType": "Resource", + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Parameters/Parameter33", "category": "Best Practice", - "startLine": 66, + "startLine": 3, "startColumn": 3, - "endLine": 66, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", + "endLine": 3, + "endColumn": 8, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter34' is not referenced anywhere in the template", + "ruleId": "I3013", + "severity": "INFO", + "message": "'MessageRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter34", - "entityType": "Parameter" + "logicalId": "Queue", + "entityType": "Resource", + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Parameters/Parameter34", + "propertyPath": "Properties", "category": "Best Practice", - "startLine": 68, - "startColumn": 3, - "endLine": 68, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", "phase": "LINT" }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter35' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'EventSourceArn' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Parameter35", - "entityType": "Parameter" + "logicalId": "ESM", + "entityType": "Resource", + "resourceType": "AWS::Lambda::EventSourceMapping" }, - "propertyPath": "Parameters/Parameter35", + "propertyPath": "Properties.EventSourceArn", "category": "Best Practice", - "startLine": 70, - "startColumn": 3, - "endLine": 70, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "startLine": 21, + "startColumn": 7, + "endLine": 21, + "endColumn": 21, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "GetAtt Queue.Arn" + } }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter36' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Queue' of type 'AWS::SQS::Queue' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Parameter36", - "entityType": "Parameter" + "logicalId": "Queue", + "entityType": "Resource", + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Parameters/Parameter36", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 72, - "startColumn": 3, - "endLine": 72, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter37' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Func' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Parameter37", - "entityType": "Parameter" + "logicalId": "Func", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Parameters/Parameter37", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 74, - "startColumn": 3, - "endLine": 74, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", + "startLine": 9, + "startColumn": 5, + "endLine": 9, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter38' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'ESM' of type 'AWS::Lambda::EventSourceMapping' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Parameter38", - "entityType": "Parameter" + "logicalId": "ESM", + "entityType": "Resource", + "resourceType": "AWS::Lambda::EventSourceMapping" }, - "propertyPath": "Parameters/Parameter38", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 76, - "startColumn": 3, - "endLine": 76, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", + "startLine": 19, + "startColumn": 5, + "endLine": 19, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "bad/lambda_zip_no_handler.yaml": { + "filePath": "bad/lambda_zip_no_handler.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 1, + "informational": 2, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "W2001", + "ruleId": "W2533", "severity": "WARN", - "message": "Parameter 'Parameter39' is not referenced anywhere in the template", + "message": "Properties ['Handler', 'Runtime'] missing for zip file deployment at Resources/Func/Properties", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter39", - "entityType": "Parameter" + "logicalId": "Func", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Parameters/Parameter39", + "propertyPath": "Properties.Code", + "suggestedFix": "Add the missing properties for zip file deployment", "category": "Best Practice", - "startLine": 78, - "startColumn": 3, - "endLine": 78, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", + "startLine": 7, + "startColumn": 7, + "endLine": 7, + "endColumn": 11, + "ruleDescription": "Check required properties for Lambda if the deployment package is a .zip file", "phase": "LINT" }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter40' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Parameter40", - "entityType": "Parameter" + "logicalId": "Func", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Parameters/Parameter40", + "propertyPath": "Properties.FunctionName", "category": "Best Practice", - "startLine": 80, - "startColumn": 3, - "endLine": 80, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "startLine": 6, + "startColumn": 7, + "endLine": 6, + "endColumn": 19, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter41' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Func' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Parameter41", - "entityType": "Parameter" + "logicalId": "Func", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Parameters/Parameter41", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 82, - "startColumn": 3, - "endLine": 82, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "bad/lambda_zipfile_java.yaml": { + "filePath": "bad/lambda_zipfile_java.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 1, + "warnings": 1, + "informational": 3, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter42' is not referenced anywhere in the template", + "ruleId": "E3677", + "severity": "ERROR", + "message": "Runtime 'java21' is not supported with Code.ZipFile - use nodejs or python", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter42", - "entityType": "Parameter" + "logicalId": "LambdaFn", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Parameters/Parameter42", - "category": "Best Practice", - "startLine": 84, + "category": "Resource", + "startLine": 3, "startColumn": 3, - "endLine": 84, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", + "endLine": 3, + "endColumn": 11, + "ruleDescription": "Lambda ZipFile requires nodejs or python runtime", "phase": "LINT" }, { - "ruleId": "W2001", + "ruleId": "W9013", "severity": "WARN", - "message": "Parameter 'Parameter43' is not referenced anywhere in the template", - "source": "CFN_LINT", + "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", + "source": "ENGINE", "entity": { - "logicalId": "Parameter43", - "entityType": "Parameter" + "logicalId": "LambdaFn", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Parameters/Parameter43", - "category": "Best Practice", - "startLine": 86, + "category": "Security", + "startLine": 3, "startColumn": 3, - "endLine": 86, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", + "endLine": 3, + "endColumn": 11, + "ruleDescription": "Hardcoded account ID in ARN", "phase": "LINT" }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter44' is not referenced anywhere in the template", + "ruleId": "I2530", + "severity": "INFO", + "message": "Runtime 'java21' should consider using SnapStart for improved performance", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter44", - "entityType": "Parameter" + "logicalId": "LambdaFn", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Parameters/Parameter44", + "propertyPath": "Properties.SnapStart.ApplyOn", + "suggestedFix": "Add SnapStart with ApplyOn set to 'PublishedVersions'", "category": "Best Practice", - "startLine": 88, - "startColumn": 3, - "endLine": 88, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "documentationUrl": "https://docs.aws.amazon.com/lambda/latest/dg/snapstart.html", + "ruleDescription": "Validate that SnapStart is configured for >= Java11 runtimes", "phase": "LINT" }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter45' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Parameter45", - "entityType": "Parameter" + "logicalId": "LambdaFn", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Parameters/Parameter45", + "propertyPath": "Properties.FunctionName", "category": "Best Practice", - "startLine": 90, - "startColumn": 3, - "endLine": 90, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "startLine": 6, + "startColumn": 7, + "endLine": 6, + "endColumn": 19, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter46' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'LambdaFn' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Parameter46", - "entityType": "Parameter" + "logicalId": "LambdaFn", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Parameters/Parameter46", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 92, - "startColumn": 3, - "endLine": 92, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "bad/lifecycle_conditional_invalid_policies.yaml": { + "filePath": "bad/lifecycle_conditional_invalid_policies.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 7, + "counts": { + "fatal": 11, + "errors": 0, + "warnings": 4, + "informational": 6, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter47' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "F0018", + "severity": "FATAL", + "message": "UpdateReplacePolicy must be one of Delete, Retain, got 'BadValue'", + "source": "SCHEMA", "entity": { - "logicalId": "Parameter47", - "entityType": "Parameter" + "logicalId": "ConditionalInvalidUpdate", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Parameters/Parameter47", - "category": "Best Practice", - "startLine": 94, - "startColumn": 3, - "endLine": 94, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "propertyPath": "UpdateReplacePolicy", + "category": "Structure", + "startLine": 21, + "startColumn": 5, + "endLine": 21, + "endColumn": 24, + "ruleDescription": "UpdateReplacePolicy must be valid", + "phase": "SCHEMA" }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter48' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "F0018", + "severity": "FATAL", + "message": "UpdateReplacePolicy must be one of Delete, Retain, got null", + "source": "SCHEMA", "entity": { - "logicalId": "Parameter48", - "entityType": "Parameter" + "logicalId": "DirectNoValuePolicies", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Parameters/Parameter48", - "category": "Best Practice", - "startLine": 96, - "startColumn": 3, - "endLine": 96, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "propertyPath": "UpdateReplacePolicy", + "category": "Structure", + "startLine": 30, + "startColumn": 5, + "endLine": 30, + "endColumn": 24, + "ruleDescription": "UpdateReplacePolicy must be valid", + "phase": "SCHEMA" }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter49' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "F0018", + "severity": "FATAL", + "message": "UpdateReplacePolicy must be one of Delete, Retain, got 'arn:aws:cloudformation:us-east-1:123456789012:stack/teststack/51af3dc0-da77-11e4-872e-1234567db123'", + "source": "SCHEMA", "entity": { - "logicalId": "Parameter49", - "entityType": "Parameter" + "logicalId": "StackIdPolicies", + "entityType": "Resource", + "resourceType": "AWS::CloudFormation::WaitConditionHandle" }, - "propertyPath": "Parameters/Parameter49", - "category": "Best Practice", - "startLine": 98, - "startColumn": 3, - "endLine": 98, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "propertyPath": "UpdateReplacePolicy", + "category": "Structure", + "startLine": 35, + "startColumn": 5, + "endLine": 35, + "endColumn": 24, + "ruleDescription": "UpdateReplacePolicy must be valid", + "phase": "SCHEMA" }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter50' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "F0018", + "severity": "FATAL", + "message": "UpdateReplacePolicy must be one of Delete, Retain, got null", + "source": "SCHEMA", "entity": { - "logicalId": "Parameter50", - "entityType": "Parameter" + "logicalId": "ConditionalNoValuePolicies", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Parameters/Parameter50", - "category": "Best Practice", - "startLine": 100, - "startColumn": 3, - "endLine": 100, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "propertyPath": "UpdateReplacePolicy", + "category": "Structure", + "startLine": 40, + "startColumn": 5, + "endLine": 40, + "endColumn": 24, + "ruleDescription": "UpdateReplacePolicy must be valid", + "phase": "SCHEMA" }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter51' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "F3016", + "severity": "FATAL", + "message": "DeletionPolicy must be one of Delete, Retain, RetainExceptOnCreate, got 'InvalidPolicy'", + "source": "SCHEMA", "entity": { - "logicalId": "Parameter51", - "entityType": "Parameter" + "logicalId": "ConditionalInvalidDeletion", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Parameters/Parameter51", - "category": "Best Practice", - "startLine": 102, - "startColumn": 3, - "endLine": 102, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "propertyPath": "DeletionPolicy", + "category": "Structure", + "startLine": 17, + "startColumn": 5, + "endLine": 17, + "endColumn": 19, + "ruleDescription": "DeletionPolicy must be valid", + "phase": "SCHEMA" }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter52' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "F3016", + "severity": "FATAL", + "message": "DeletionPolicy must be one of Delete, Retain, RetainExceptOnCreate, got 'AlsoWrong'", + "source": "SCHEMA", "entity": { - "logicalId": "Parameter52", - "entityType": "Parameter" + "logicalId": "BothBranchesInvalid", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Parameters/Parameter52", - "category": "Best Practice", - "startLine": 104, - "startColumn": 3, - "endLine": 104, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "propertyPath": "DeletionPolicy", + "category": "Structure", + "startLine": 25, + "startColumn": 5, + "endLine": 25, + "endColumn": 19, + "ruleDescription": "DeletionPolicy must be valid", + "phase": "SCHEMA" }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter53' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "F3016", + "severity": "FATAL", + "message": "DeletionPolicy must be one of Delete, Retain, RetainExceptOnCreate, got 'WrongOne'", + "source": "SCHEMA", "entity": { - "logicalId": "Parameter53", - "entityType": "Parameter" + "logicalId": "BothBranchesInvalid", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Parameters/Parameter53", - "category": "Best Practice", - "startLine": 106, - "startColumn": 3, - "endLine": 106, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "propertyPath": "DeletionPolicy", + "category": "Structure", + "startLine": 25, + "startColumn": 5, + "endLine": 25, + "endColumn": 19, + "ruleDescription": "DeletionPolicy must be valid", + "phase": "SCHEMA" }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter54' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "F3016", + "severity": "FATAL", + "message": "DeletionPolicy must be one of Delete, Retain, RetainExceptOnCreate, got null", + "source": "SCHEMA", "entity": { - "logicalId": "Parameter54", - "entityType": "Parameter" + "logicalId": "DirectNoValuePolicies", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Parameters/Parameter54", - "category": "Best Practice", - "startLine": 108, - "startColumn": 3, - "endLine": 108, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "propertyPath": "DeletionPolicy", + "category": "Structure", + "startLine": 29, + "startColumn": 5, + "endLine": 29, + "endColumn": 19, + "ruleDescription": "DeletionPolicy must be valid", + "phase": "SCHEMA" }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter55' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "F3016", + "severity": "FATAL", + "message": "DeletionPolicy must be one of Delete, Retain, RetainExceptOnCreate, got 'arn:aws:cloudformation:us-east-1:123456789012:stack/teststack/51af3dc0-da77-11e4-872e-1234567db123'", + "source": "SCHEMA", "entity": { - "logicalId": "Parameter55", - "entityType": "Parameter" + "logicalId": "StackIdPolicies", + "entityType": "Resource", + "resourceType": "AWS::CloudFormation::WaitConditionHandle" }, - "propertyPath": "Parameters/Parameter55", - "category": "Best Practice", - "startLine": 110, - "startColumn": 3, - "endLine": 110, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "propertyPath": "DeletionPolicy", + "category": "Structure", + "startLine": 34, + "startColumn": 5, + "endLine": 34, + "endColumn": 19, + "ruleDescription": "DeletionPolicy must be valid", + "phase": "SCHEMA" }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter56' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "F3016", + "severity": "FATAL", + "message": "DeletionPolicy must be one of Delete, Retain, RetainExceptOnCreate, got null", + "source": "SCHEMA", "entity": { - "logicalId": "Parameter56", - "entityType": "Parameter" + "logicalId": "ConditionalNoValuePolicies", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Parameters/Parameter56", - "category": "Best Practice", - "startLine": 112, - "startColumn": 3, - "endLine": 112, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "propertyPath": "DeletionPolicy", + "category": "Structure", + "startLine": 39, + "startColumn": 5, + "endLine": 39, + "endColumn": 19, + "ruleDescription": "DeletionPolicy must be valid", + "phase": "SCHEMA" }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter57' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "F3016", + "severity": "FATAL", + "message": "DeletionPolicy must be one of Delete, Retain, RetainExceptOnCreate, got an object", + "source": "SCHEMA", "entity": { - "logicalId": "Parameter57", - "entityType": "Parameter" + "logicalId": "DynamicObjectPolicy", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Parameters/Parameter57", - "category": "Best Practice", - "startLine": 114, - "startColumn": 3, - "endLine": 114, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "propertyPath": "DeletionPolicy", + "category": "Structure", + "startLine": 44, + "startColumn": 5, + "endLine": 44, + "endColumn": 19, + "ruleDescription": "DeletionPolicy must be valid", + "phase": "SCHEMA" }, { - "ruleId": "W2001", + "ruleId": "W3011", "severity": "WARN", - "message": "Parameter 'Parameter58' is not referenced anywhere in the template", + "message": "Both 'UpdateReplacePolicy' and 'DeletionPolicy' are needed to protect resource from deletion", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter58", - "entityType": "Parameter" + "logicalId": "ConditionalInvalidDeletion", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Parameters/Parameter58", "category": "Best Practice", - "startLine": 116, + "startLine": 15, "startColumn": 3, - "endLine": 116, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", + "endLine": 15, + "endColumn": 29, + "ruleDescription": "Check resources with UpdateReplacePolicy/DeletionPolicy have both", "phase": "LINT" }, { - "ruleId": "W2001", + "ruleId": "W3011", "severity": "WARN", - "message": "Parameter 'Parameter59' is not referenced anywhere in the template", + "message": "Both 'UpdateReplacePolicy' and 'DeletionPolicy' are needed to protect resource from deletion", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter59", - "entityType": "Parameter" + "logicalId": "ConditionalInvalidUpdate", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Parameters/Parameter59", "category": "Best Practice", - "startLine": 118, + "startLine": 19, "startColumn": 3, - "endLine": 118, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", + "endLine": 19, + "endColumn": 27, + "ruleDescription": "Check resources with UpdateReplacePolicy/DeletionPolicy have both", "phase": "LINT" }, { - "ruleId": "W2001", + "ruleId": "W3011", "severity": "WARN", - "message": "Parameter 'Parameter60' is not referenced anywhere in the template", + "message": "Both 'UpdateReplacePolicy' and 'DeletionPolicy' are needed to protect resource from deletion", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter60", - "entityType": "Parameter" + "logicalId": "BothBranchesInvalid", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Parameters/Parameter60", "category": "Best Practice", - "startLine": 120, + "startLine": 23, "startColumn": 3, - "endLine": 120, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", + "endLine": 23, + "endColumn": 22, + "ruleDescription": "Check resources with UpdateReplacePolicy/DeletionPolicy have both", "phase": "LINT" }, { - "ruleId": "W2001", + "ruleId": "W3011", "severity": "WARN", - "message": "Parameter 'Parameter61' is not referenced anywhere in the template", + "message": "Both 'UpdateReplacePolicy' and 'DeletionPolicy' are needed to protect resource from deletion", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter61", - "entityType": "Parameter" + "logicalId": "DynamicObjectPolicy", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Parameters/Parameter61", "category": "Best Practice", - "startLine": 122, + "startLine": 42, "startColumn": 3, - "endLine": 122, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", + "endLine": 42, + "endColumn": 22, + "ruleDescription": "Check resources with UpdateReplacePolicy/DeletionPolicy have both", "phase": "LINT" }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter62' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'ConditionalInvalidDeletion' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Parameter62", - "entityType": "Parameter" + "logicalId": "ConditionalInvalidDeletion", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Parameters/Parameter62", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 124, + "startLine": 15, "startColumn": 3, - "endLine": 124, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", + "endLine": 15, + "endColumn": 29, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter63' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'ConditionalInvalidUpdate' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Parameter63", - "entityType": "Parameter" + "logicalId": "ConditionalInvalidUpdate", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Parameters/Parameter63", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 126, + "startLine": 19, "startColumn": 3, - "endLine": 126, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", + "endLine": 19, + "endColumn": 27, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter64' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'BothBranchesInvalid' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Parameter64", - "entityType": "Parameter" + "logicalId": "BothBranchesInvalid", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Parameters/Parameter64", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 128, + "startLine": 23, "startColumn": 3, - "endLine": 128, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", + "endLine": 23, + "endColumn": 22, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter65' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'DirectNoValuePolicies' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Parameter65", - "entityType": "Parameter" + "logicalId": "DirectNoValuePolicies", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Parameters/Parameter65", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 130, + "startLine": 27, "startColumn": 3, - "endLine": 130, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", + "endLine": 27, + "endColumn": 24, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter66' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'ConditionalNoValuePolicies' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Parameter66", - "entityType": "Parameter" + "logicalId": "ConditionalNoValuePolicies", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Parameters/Parameter66", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 132, + "startLine": 37, "startColumn": 3, - "endLine": 132, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", + "endLine": 37, + "endColumn": 29, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter67' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'DynamicObjectPolicy' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Parameter67", - "entityType": "Parameter" + "logicalId": "DynamicObjectPolicy", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Parameters/Parameter67", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 134, + "startLine": 42, "startColumn": 3, - "endLine": 134, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", + "endLine": 42, + "endColumn": 22, + "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "bad/lifecycle_policy_shapes.yaml": { + "filePath": "bad/lifecycle_policy_shapes.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 11, + "counts": { + "fatal": 12, + "errors": 1, + "warnings": 1, + "informational": 5, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter68' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "F0018", + "severity": "FATAL", + "message": "UpdateReplacePolicy must be one of Delete, Retain, got a list", + "source": "SCHEMA", "entity": { - "logicalId": "Parameter68", - "entityType": "Parameter" + "logicalId": "ListPolicies", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Parameters/Parameter68", - "category": "Best Practice", - "startLine": 136, - "startColumn": 3, - "endLine": 136, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "propertyPath": "UpdateReplacePolicy", + "category": "Structure", + "startLine": 19, + "startColumn": 5, + "endLine": 19, + "endColumn": 24, + "ruleDescription": "UpdateReplacePolicy must be valid", + "phase": "SCHEMA" }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter69' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "F0018", + "severity": "FATAL", + "message": "UpdateReplacePolicy must be one of Delete, Retain, got an object", + "source": "SCHEMA", "entity": { - "logicalId": "Parameter69", - "entityType": "Parameter" + "logicalId": "ObjectPolicies", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Parameters/Parameter69", - "category": "Best Practice", - "startLine": 138, - "startColumn": 3, - "endLine": 138, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "propertyPath": "UpdateReplacePolicy", + "category": "Structure", + "startLine": 25, + "startColumn": 5, + "endLine": 25, + "endColumn": 24, + "ruleDescription": "UpdateReplacePolicy must be valid", + "phase": "SCHEMA" }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter70' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "F0018", + "severity": "FATAL", + "message": "UpdateReplacePolicy must be one of Delete, Retain, got null", + "source": "SCHEMA", "entity": { - "logicalId": "Parameter70", - "entityType": "Parameter" + "logicalId": "NoValuePoliciesWithoutTransform", + "entityType": "Resource", + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Parameters/Parameter70", - "category": "Best Practice", - "startLine": 140, - "startColumn": 3, - "endLine": 140, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "propertyPath": "UpdateReplacePolicy", + "category": "Structure", + "startLine": 65, + "startColumn": 5, + "endLine": 65, + "endColumn": 24, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sqs.git", + "ruleDescription": "UpdateReplacePolicy must be valid", + "phase": "SCHEMA" }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter71' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "F1101", + "severity": "FATAL", + "message": "Ref is not supported as a top-level CreationPolicy value; CreationPolicy must be an object or Fn::If returning an object", + "source": "SCHEMA", "entity": { - "logicalId": "Parameter71", - "entityType": "Parameter" + "logicalId": "CreationRootRef", + "entityType": "Resource", + "resourceType": "AWS::CloudFormation::WaitCondition" }, - "propertyPath": "Parameters/Parameter71", - "category": "Best Practice", - "startLine": 142, - "startColumn": 3, - "endLine": 142, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "propertyPath": "CreationPolicy", + "category": "Structure", + "startLine": 30, + "startColumn": 5, + "endLine": 30, + "endColumn": 19, + "ruleDescription": "Invalid YAML/JSON syntax", + "phase": "PARSE" }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter72' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "F1101", + "severity": "FATAL", + "message": "Fn::FindInMap is not supported as a top-level CreationPolicy value; CreationPolicy must be an object or Fn::If returning an object", + "source": "SCHEMA", "entity": { - "logicalId": "Parameter72", - "entityType": "Parameter" + "logicalId": "CreationRootFindInMap", + "entityType": "Resource", + "resourceType": "AWS::CloudFormation::WaitCondition" }, - "propertyPath": "Parameters/Parameter72", - "category": "Best Practice", - "startLine": 144, - "startColumn": 3, - "endLine": 144, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "propertyPath": "CreationPolicy", + "category": "Structure", + "startLine": 34, + "startColumn": 5, + "endLine": 34, + "endColumn": 19, + "ruleDescription": "Invalid YAML/JSON syntax", + "phase": "PARSE" + }, + { + "ruleId": "F1101", + "severity": "FATAL", + "message": "Fn::Select is not supported as a top-level CreationPolicy value; CreationPolicy must be an object or Fn::If returning an object", + "source": "SCHEMA", + "entity": { + "logicalId": "CreationRootSelect", + "entityType": "Resource", + "resourceType": "AWS::CloudFormation::WaitCondition" + }, + "propertyPath": "CreationPolicy", + "category": "Structure", + "startLine": 38, + "startColumn": 5, + "endLine": 38, + "endColumn": 19, + "ruleDescription": "Invalid YAML/JSON syntax", + "phase": "PARSE" + }, + { + "ruleId": "F1101", + "severity": "FATAL", + "message": "Fn::Sub is not supported as a top-level CreationPolicy value; CreationPolicy must be an object or Fn::If returning an object", + "source": "SCHEMA", + "entity": { + "logicalId": "CreationRootSub", + "entityType": "Resource", + "resourceType": "AWS::CloudFormation::WaitCondition" + }, + "propertyPath": "CreationPolicy", + "category": "Structure", + "startLine": 45, + "startColumn": 5, + "endLine": 45, + "endColumn": 19, + "ruleDescription": "Invalid YAML/JSON syntax", + "phase": "PARSE" + }, + { + "ruleId": "F1101", + "severity": "FATAL", + "message": "Fn::If branch in CreationPolicy must be an object, got a string", + "source": "SCHEMA", + "entity": { + "logicalId": "CreationConditionalInvalid", + "entityType": "Resource", + "resourceType": "AWS::CloudFormation::WaitCondition" + }, + "propertyPath": "CreationPolicy.Fn::If.2", + "category": "Structure", + "startLine": 51, + "startColumn": 63, + "endLine": 51, + "endColumn": 64, + "ruleDescription": "Invalid YAML/JSON syntax", + "phase": "PARSE" + }, + { + "ruleId": "F1101", + "severity": "FATAL", + "message": "Ref is not supported as a top-level CreationPolicy value; CreationPolicy must be an object or Fn::If returning an object", + "source": "SCHEMA", + "entity": { + "logicalId": "CreationNoValueOnUnsupportedType", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" + }, + "propertyPath": "CreationPolicy", + "category": "Structure", + "startLine": 55, + "startColumn": 5, + "endLine": 55, + "endColumn": 19, + "ruleDescription": "Invalid YAML/JSON syntax", + "phase": "PARSE" + }, + { + "ruleId": "F3016", + "severity": "FATAL", + "message": "DeletionPolicy must be one of Delete, Retain, RetainExceptOnCreate, got a list", + "source": "SCHEMA", + "entity": { + "logicalId": "ListPolicies", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" + }, + "propertyPath": "DeletionPolicy", + "category": "Structure", + "startLine": 18, + "startColumn": 5, + "endLine": 18, + "endColumn": 19, + "ruleDescription": "DeletionPolicy must be valid", + "phase": "SCHEMA" + }, + { + "ruleId": "F3016", + "severity": "FATAL", + "message": "DeletionPolicy must be one of Delete, Retain, RetainExceptOnCreate, got an object", + "source": "SCHEMA", + "entity": { + "logicalId": "ObjectPolicies", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" + }, + "propertyPath": "DeletionPolicy", + "category": "Structure", + "startLine": 23, + "startColumn": 5, + "endLine": 23, + "endColumn": 19, + "ruleDescription": "DeletionPolicy must be valid", + "phase": "SCHEMA" + }, + { + "ruleId": "F3016", + "severity": "FATAL", + "message": "DeletionPolicy must be one of Delete, Retain, RetainExceptOnCreate, got null", + "source": "SCHEMA", + "entity": { + "logicalId": "NoValuePoliciesWithoutTransform", + "entityType": "Resource", + "resourceType": "AWS::SQS::Queue" + }, + "propertyPath": "DeletionPolicy", + "category": "Structure", + "startLine": 64, + "startColumn": 5, + "endLine": 64, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sqs.git", + "ruleDescription": "DeletionPolicy must be valid", + "phase": "SCHEMA" }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter73' is not referenced anywhere in the template", + "ruleId": "E3055", + "severity": "ERROR", + "message": "CreationPolicy is not supported on resource type 'AWS::S3::Bucket'", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter73", - "entityType": "Parameter" + "logicalId": "CreationNoValueOnUnsupportedType", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Parameters/Parameter73", - "category": "Best Practice", - "startLine": 146, - "startColumn": 3, - "endLine": 146, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", + "propertyPath": "CreationPolicy", + "suggestedFix": "Remove CreationPolicy or change resource type to one of: AWS::AppStream::Fleet, AWS::AutoScaling::AutoScalingGroup, AWS::CloudFormation::WaitCondition, AWS::EC2::Instance", + "category": "Resource", + "startLine": 55, + "startColumn": 5, + "endLine": 55, + "endColumn": 19, + "ruleDescription": "Check CreationPolicy values for Resources", "phase": "LINT" }, { - "ruleId": "W2001", + "ruleId": "W8003", "severity": "WARN", - "message": "Parameter 'Parameter74' is not referenced anywhere in the template", + "message": "Fn::Equals in condition 'Never' will always return False", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter74", - "entityType": "Parameter" + "logicalId": "Never", + "entityType": "Condition" }, - "propertyPath": "Parameters/Parameter74", + "propertyPath": "Conditions/Never", "category": "Best Practice", - "startLine": 148, + "startLine": 13, "startColumn": 3, - "endLine": 148, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "endLine": 13, + "endColumn": 8, + "ruleDescription": "Fn::Equals will always return true or false", + "phase": "PARSE" }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter75' is not referenced anywhere in the template", + "ruleId": "I3013", + "severity": "INFO", + "message": "'MessageRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter75", - "entityType": "Parameter" + "logicalId": "NoValuePoliciesWithoutTransform", + "entityType": "Resource", + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Parameters/Parameter75", + "propertyPath": "Properties", "category": "Best Practice", - "startLine": 150, + "startLine": 62, "startColumn": 3, - "endLine": 150, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", + "endLine": 62, + "endColumn": 34, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", "phase": "LINT" }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter76' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'ListPolicies' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Parameter76", - "entityType": "Parameter" + "logicalId": "ListPolicies", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Parameters/Parameter76", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 152, + "startLine": 16, "startColumn": 3, - "endLine": 152, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", + "endLine": 16, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter77' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'ObjectPolicies' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Parameter77", - "entityType": "Parameter" + "logicalId": "ObjectPolicies", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Parameters/Parameter77", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 154, + "startLine": 21, "startColumn": 3, - "endLine": 154, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", + "endLine": 21, + "endColumn": 17, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter78' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'CreationNoValueOnUnsupportedType' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Parameter78", - "entityType": "Parameter" + "logicalId": "CreationNoValueOnUnsupportedType", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Parameters/Parameter78", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 156, + "startLine": 53, "startColumn": 3, - "endLine": 156, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", + "endLine": 53, + "endColumn": 35, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter79' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'NoValuePoliciesWithoutTransform' of type 'AWS::SQS::Queue' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Parameter79", - "entityType": "Parameter" + "logicalId": "NoValuePoliciesWithoutTransform", + "entityType": "Resource", + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Parameters/Parameter79", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 158, + "startLine": 62, "startColumn": 3, - "endLine": 158, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", + "endLine": 62, + "endColumn": 34, + "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "bad/limit_numbers.yaml": { + "filePath": "bad/limit_numbers.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 501, + "counts": { + "fatal": 5, + "errors": 0, + "warnings": 401, + "informational": 501, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter80' is not referenced anywhere in the template", - "source": "CFN_LINT", - "entity": { - "logicalId": "Parameter80", - "entityType": "Parameter" - }, - "propertyPath": "Parameters/Parameter80", - "category": "Best Practice", - "startLine": 160, - "startColumn": 3, - "endLine": 160, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "ruleId": "F0003", + "severity": "FATAL", + "message": "Template has 201 parameters, maximum is 200", + "source": "SCHEMA", + "category": "Structure", + "startLine": 1, + "startColumn": 1, + "endLine": 1, + "endColumn": 11, + "ruleDescription": "Maximum 200 parameters", + "phase": "SCHEMA" }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Parameter81' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "F0004", + "severity": "FATAL", + "message": "Template has 201 outputs, maximum is 200", + "source": "SCHEMA", + "category": "Structure", + "startLine": 1407, + "startColumn": 1, + "endLine": 1407, + "endColumn": 8, + "ruleDescription": "Maximum 200 outputs", + "phase": "SCHEMA" + }, + { + "ruleId": "F0007", + "severity": "FATAL", + "message": "Template has 501 resources, maximum is 500", + "source": "SCHEMA", + "category": "Structure", + "startLine": 404, + "startColumn": 1, + "endLine": 404, + "endColumn": 10, + "ruleDescription": "Maximum 500 resources", + "phase": "SCHEMA" + }, + { + "ruleId": "F0008", + "severity": "FATAL", + "message": "Template has 201 mappings, maximum is 200", + "source": "SCHEMA", + "category": "Structure", + "startLine": 1810, + "startColumn": 1, + "endLine": 1810, + "endColumn": 9, + "ruleDescription": "Maximum 200 mappings", + "phase": "SCHEMA" + }, + { + "ruleId": "F0050", + "severity": "FATAL", + "message": "Mapping 'Mapping201'.'Key' has 202 attributes, maximum is 200", + "source": "SCHEMA", "entity": { - "logicalId": "Parameter81", - "entityType": "Parameter" + "logicalId": "Mapping201", + "entityType": "Mapping" }, - "propertyPath": "Parameters/Parameter81", - "category": "Best Practice", - "startLine": 162, - "startColumn": 3, - "endLine": 162, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "propertyPath": "Mappings/Mapping201/Key", + "category": "Structure", + "startLine": 2412, + "startColumn": 5, + "endLine": 2412, + "endColumn": 8, + "ruleDescription": "Mapping must have valid 3-level structure", + "phase": "SCHEMA" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter82' is not referenced anywhere in the template", + "message": "Parameter 'Parameter2' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter82", + "logicalId": "Parameter2", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter82", + "propertyPath": "Parameters/Parameter2", "category": "Best Practice", - "startLine": 164, + "startLine": 4, "startColumn": 3, - "endLine": 164, - "endColumn": 14, + "endLine": 4, + "endColumn": 13, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter83' is not referenced anywhere in the template", + "message": "Parameter 'Parameter3' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter83", + "logicalId": "Parameter3", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter83", + "propertyPath": "Parameters/Parameter3", "category": "Best Practice", - "startLine": 166, + "startLine": 6, "startColumn": 3, - "endLine": 166, - "endColumn": 14, + "endLine": 6, + "endColumn": 13, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter84' is not referenced anywhere in the template", + "message": "Parameter 'Parameter4' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter84", + "logicalId": "Parameter4", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter84", + "propertyPath": "Parameters/Parameter4", "category": "Best Practice", - "startLine": 168, + "startLine": 8, "startColumn": 3, - "endLine": 168, - "endColumn": 14, + "endLine": 8, + "endColumn": 13, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter85' is not referenced anywhere in the template", + "message": "Parameter 'Parameter5' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter85", + "logicalId": "Parameter5", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter85", + "propertyPath": "Parameters/Parameter5", "category": "Best Practice", - "startLine": 170, + "startLine": 10, "startColumn": 3, - "endLine": 170, - "endColumn": 14, + "endLine": 10, + "endColumn": 13, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter86' is not referenced anywhere in the template", + "message": "Parameter 'Parameter6' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter86", + "logicalId": "Parameter6", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter86", + "propertyPath": "Parameters/Parameter6", "category": "Best Practice", - "startLine": 172, + "startLine": 12, "startColumn": 3, - "endLine": 172, - "endColumn": 14, + "endLine": 12, + "endColumn": 13, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter87' is not referenced anywhere in the template", + "message": "Parameter 'Parameter7' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter87", + "logicalId": "Parameter7", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter87", + "propertyPath": "Parameters/Parameter7", "category": "Best Practice", - "startLine": 174, + "startLine": 14, "startColumn": 3, - "endLine": 174, - "endColumn": 14, + "endLine": 14, + "endColumn": 13, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter88' is not referenced anywhere in the template", + "message": "Parameter 'Parameter8' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter88", + "logicalId": "Parameter8", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter88", + "propertyPath": "Parameters/Parameter8", "category": "Best Practice", - "startLine": 176, + "startLine": 16, "startColumn": 3, - "endLine": 176, - "endColumn": 14, + "endLine": 16, + "endColumn": 13, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter89' is not referenced anywhere in the template", + "message": "Parameter 'Parameter9' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter89", + "logicalId": "Parameter9", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter89", + "propertyPath": "Parameters/Parameter9", "category": "Best Practice", - "startLine": 178, + "startLine": 18, "startColumn": 3, - "endLine": 178, - "endColumn": 14, + "endLine": 18, + "endColumn": 13, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter90' is not referenced anywhere in the template", + "message": "Parameter 'Parameter10' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter90", + "logicalId": "Parameter10", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter90", + "propertyPath": "Parameters/Parameter10", "category": "Best Practice", - "startLine": 180, + "startLine": 20, "startColumn": 3, - "endLine": 180, + "endLine": 20, "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" @@ -10226,17 +10174,17 @@ { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter91' is not referenced anywhere in the template", + "message": "Parameter 'Parameter11' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter91", + "logicalId": "Parameter11", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter91", + "propertyPath": "Parameters/Parameter11", "category": "Best Practice", - "startLine": 182, + "startLine": 22, "startColumn": 3, - "endLine": 182, + "endLine": 22, "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" @@ -10244,17 +10192,17 @@ { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter92' is not referenced anywhere in the template", + "message": "Parameter 'Parameter12' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter92", + "logicalId": "Parameter12", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter92", + "propertyPath": "Parameters/Parameter12", "category": "Best Practice", - "startLine": 184, + "startLine": 24, "startColumn": 3, - "endLine": 184, + "endLine": 24, "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" @@ -10262,17 +10210,17 @@ { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter93' is not referenced anywhere in the template", + "message": "Parameter 'Parameter13' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter93", + "logicalId": "Parameter13", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter93", + "propertyPath": "Parameters/Parameter13", "category": "Best Practice", - "startLine": 186, + "startLine": 26, "startColumn": 3, - "endLine": 186, + "endLine": 26, "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" @@ -10280,17 +10228,17 @@ { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter94' is not referenced anywhere in the template", + "message": "Parameter 'Parameter14' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter94", + "logicalId": "Parameter14", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter94", + "propertyPath": "Parameters/Parameter14", "category": "Best Practice", - "startLine": 188, + "startLine": 28, "startColumn": 3, - "endLine": 188, + "endLine": 28, "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" @@ -10298,17 +10246,17 @@ { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter95' is not referenced anywhere in the template", + "message": "Parameter 'Parameter15' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter95", + "logicalId": "Parameter15", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter95", + "propertyPath": "Parameters/Parameter15", "category": "Best Practice", - "startLine": 190, + "startLine": 30, "startColumn": 3, - "endLine": 190, + "endLine": 30, "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" @@ -10316,17 +10264,17 @@ { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter96' is not referenced anywhere in the template", + "message": "Parameter 'Parameter16' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter96", + "logicalId": "Parameter16", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter96", + "propertyPath": "Parameters/Parameter16", "category": "Best Practice", - "startLine": 192, + "startLine": 32, "startColumn": 3, - "endLine": 192, + "endLine": 32, "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" @@ -10334,17 +10282,17 @@ { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter97' is not referenced anywhere in the template", + "message": "Parameter 'Parameter17' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter97", + "logicalId": "Parameter17", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter97", + "propertyPath": "Parameters/Parameter17", "category": "Best Practice", - "startLine": 194, + "startLine": 34, "startColumn": 3, - "endLine": 194, + "endLine": 34, "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" @@ -10352,17 +10300,17 @@ { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter98' is not referenced anywhere in the template", + "message": "Parameter 'Parameter18' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter98", + "logicalId": "Parameter18", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter98", + "propertyPath": "Parameters/Parameter18", "category": "Best Practice", - "startLine": 196, + "startLine": 36, "startColumn": 3, - "endLine": 196, + "endLine": 36, "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" @@ -10370,17 +10318,17 @@ { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter99' is not referenced anywhere in the template", + "message": "Parameter 'Parameter19' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter99", + "logicalId": "Parameter19", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter99", + "propertyPath": "Parameters/Parameter19", "category": "Best Practice", - "startLine": 198, + "startLine": 38, "startColumn": 3, - "endLine": 198, + "endLine": 38, "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" @@ -10388,1457 +10336,1457 @@ { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter100' is not referenced anywhere in the template", + "message": "Parameter 'Parameter20' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter100", + "logicalId": "Parameter20", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter100", + "propertyPath": "Parameters/Parameter20", "category": "Best Practice", - "startLine": 200, + "startLine": 40, "startColumn": 3, - "endLine": 200, - "endColumn": 15, + "endLine": 40, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter101' is not referenced anywhere in the template", + "message": "Parameter 'Parameter21' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter101", + "logicalId": "Parameter21", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter101", + "propertyPath": "Parameters/Parameter21", "category": "Best Practice", - "startLine": 202, + "startLine": 42, "startColumn": 3, - "endLine": 202, - "endColumn": 15, + "endLine": 42, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter102' is not referenced anywhere in the template", + "message": "Parameter 'Parameter22' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter102", + "logicalId": "Parameter22", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter102", + "propertyPath": "Parameters/Parameter22", "category": "Best Practice", - "startLine": 204, + "startLine": 44, "startColumn": 3, - "endLine": 204, - "endColumn": 15, + "endLine": 44, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter103' is not referenced anywhere in the template", + "message": "Parameter 'Parameter23' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter103", + "logicalId": "Parameter23", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter103", + "propertyPath": "Parameters/Parameter23", "category": "Best Practice", - "startLine": 206, + "startLine": 46, "startColumn": 3, - "endLine": 206, - "endColumn": 15, + "endLine": 46, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter104' is not referenced anywhere in the template", + "message": "Parameter 'Parameter24' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter104", + "logicalId": "Parameter24", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter104", + "propertyPath": "Parameters/Parameter24", "category": "Best Practice", - "startLine": 208, + "startLine": 48, "startColumn": 3, - "endLine": 208, - "endColumn": 15, + "endLine": 48, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter105' is not referenced anywhere in the template", + "message": "Parameter 'Parameter25' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter105", + "logicalId": "Parameter25", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter105", + "propertyPath": "Parameters/Parameter25", "category": "Best Practice", - "startLine": 210, + "startLine": 50, "startColumn": 3, - "endLine": 210, - "endColumn": 15, + "endLine": 50, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter106' is not referenced anywhere in the template", + "message": "Parameter 'Parameter26' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter106", + "logicalId": "Parameter26", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter106", + "propertyPath": "Parameters/Parameter26", "category": "Best Practice", - "startLine": 212, + "startLine": 52, "startColumn": 3, - "endLine": 212, - "endColumn": 15, + "endLine": 52, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter107' is not referenced anywhere in the template", + "message": "Parameter 'Parameter27' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter107", + "logicalId": "Parameter27", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter107", + "propertyPath": "Parameters/Parameter27", "category": "Best Practice", - "startLine": 214, + "startLine": 54, "startColumn": 3, - "endLine": 214, - "endColumn": 15, + "endLine": 54, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter108' is not referenced anywhere in the template", + "message": "Parameter 'Parameter28' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter108", + "logicalId": "Parameter28", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter108", + "propertyPath": "Parameters/Parameter28", "category": "Best Practice", - "startLine": 216, + "startLine": 56, "startColumn": 3, - "endLine": 216, - "endColumn": 15, + "endLine": 56, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter109' is not referenced anywhere in the template", + "message": "Parameter 'Parameter29' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter109", + "logicalId": "Parameter29", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter109", + "propertyPath": "Parameters/Parameter29", "category": "Best Practice", - "startLine": 218, + "startLine": 58, "startColumn": 3, - "endLine": 218, - "endColumn": 15, + "endLine": 58, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter110' is not referenced anywhere in the template", + "message": "Parameter 'Parameter30' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter110", + "logicalId": "Parameter30", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter110", + "propertyPath": "Parameters/Parameter30", "category": "Best Practice", - "startLine": 220, + "startLine": 60, "startColumn": 3, - "endLine": 220, - "endColumn": 15, + "endLine": 60, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter111' is not referenced anywhere in the template", + "message": "Parameter 'Parameter31' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter111", + "logicalId": "Parameter31", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter111", + "propertyPath": "Parameters/Parameter31", "category": "Best Practice", - "startLine": 222, + "startLine": 62, "startColumn": 3, - "endLine": 222, - "endColumn": 15, + "endLine": 62, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter112' is not referenced anywhere in the template", + "message": "Parameter 'Parameter32' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter112", + "logicalId": "Parameter32", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter112", + "propertyPath": "Parameters/Parameter32", "category": "Best Practice", - "startLine": 224, + "startLine": 64, "startColumn": 3, - "endLine": 224, - "endColumn": 15, + "endLine": 64, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter113' is not referenced anywhere in the template", + "message": "Parameter 'Parameter33' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter113", + "logicalId": "Parameter33", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter113", + "propertyPath": "Parameters/Parameter33", "category": "Best Practice", - "startLine": 226, + "startLine": 66, "startColumn": 3, - "endLine": 226, - "endColumn": 15, + "endLine": 66, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter114' is not referenced anywhere in the template", + "message": "Parameter 'Parameter34' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter114", + "logicalId": "Parameter34", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter114", + "propertyPath": "Parameters/Parameter34", "category": "Best Practice", - "startLine": 228, + "startLine": 68, "startColumn": 3, - "endLine": 228, - "endColumn": 15, + "endLine": 68, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter115' is not referenced anywhere in the template", + "message": "Parameter 'Parameter35' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter115", + "logicalId": "Parameter35", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter115", + "propertyPath": "Parameters/Parameter35", "category": "Best Practice", - "startLine": 230, + "startLine": 70, "startColumn": 3, - "endLine": 230, - "endColumn": 15, + "endLine": 70, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter116' is not referenced anywhere in the template", + "message": "Parameter 'Parameter36' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter116", + "logicalId": "Parameter36", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter116", + "propertyPath": "Parameters/Parameter36", "category": "Best Practice", - "startLine": 232, + "startLine": 72, "startColumn": 3, - "endLine": 232, - "endColumn": 15, + "endLine": 72, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter117' is not referenced anywhere in the template", + "message": "Parameter 'Parameter37' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter117", + "logicalId": "Parameter37", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter117", + "propertyPath": "Parameters/Parameter37", "category": "Best Practice", - "startLine": 234, + "startLine": 74, "startColumn": 3, - "endLine": 234, - "endColumn": 15, + "endLine": 74, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter118' is not referenced anywhere in the template", + "message": "Parameter 'Parameter38' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter118", + "logicalId": "Parameter38", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter118", + "propertyPath": "Parameters/Parameter38", "category": "Best Practice", - "startLine": 236, + "startLine": 76, "startColumn": 3, - "endLine": 236, - "endColumn": 15, + "endLine": 76, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter119' is not referenced anywhere in the template", + "message": "Parameter 'Parameter39' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter119", + "logicalId": "Parameter39", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter119", + "propertyPath": "Parameters/Parameter39", "category": "Best Practice", - "startLine": 238, + "startLine": 78, "startColumn": 3, - "endLine": 238, - "endColumn": 15, + "endLine": 78, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter120' is not referenced anywhere in the template", + "message": "Parameter 'Parameter40' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter120", + "logicalId": "Parameter40", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter120", + "propertyPath": "Parameters/Parameter40", "category": "Best Practice", - "startLine": 240, + "startLine": 80, "startColumn": 3, - "endLine": 240, - "endColumn": 15, + "endLine": 80, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter121' is not referenced anywhere in the template", + "message": "Parameter 'Parameter41' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter121", + "logicalId": "Parameter41", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter121", + "propertyPath": "Parameters/Parameter41", "category": "Best Practice", - "startLine": 242, + "startLine": 82, "startColumn": 3, - "endLine": 242, - "endColumn": 15, + "endLine": 82, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter122' is not referenced anywhere in the template", + "message": "Parameter 'Parameter42' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter122", + "logicalId": "Parameter42", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter122", + "propertyPath": "Parameters/Parameter42", "category": "Best Practice", - "startLine": 244, + "startLine": 84, "startColumn": 3, - "endLine": 244, - "endColumn": 15, + "endLine": 84, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter123' is not referenced anywhere in the template", + "message": "Parameter 'Parameter43' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter123", + "logicalId": "Parameter43", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter123", + "propertyPath": "Parameters/Parameter43", "category": "Best Practice", - "startLine": 246, + "startLine": 86, "startColumn": 3, - "endLine": 246, - "endColumn": 15, + "endLine": 86, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter124' is not referenced anywhere in the template", + "message": "Parameter 'Parameter44' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter124", + "logicalId": "Parameter44", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter124", + "propertyPath": "Parameters/Parameter44", "category": "Best Practice", - "startLine": 248, + "startLine": 88, "startColumn": 3, - "endLine": 248, - "endColumn": 15, + "endLine": 88, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter125' is not referenced anywhere in the template", + "message": "Parameter 'Parameter45' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter125", + "logicalId": "Parameter45", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter125", + "propertyPath": "Parameters/Parameter45", "category": "Best Practice", - "startLine": 250, + "startLine": 90, "startColumn": 3, - "endLine": 250, - "endColumn": 15, + "endLine": 90, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter126' is not referenced anywhere in the template", + "message": "Parameter 'Parameter46' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter126", + "logicalId": "Parameter46", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter126", + "propertyPath": "Parameters/Parameter46", "category": "Best Practice", - "startLine": 252, + "startLine": 92, "startColumn": 3, - "endLine": 252, - "endColumn": 15, + "endLine": 92, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter127' is not referenced anywhere in the template", + "message": "Parameter 'Parameter47' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter127", + "logicalId": "Parameter47", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter127", + "propertyPath": "Parameters/Parameter47", "category": "Best Practice", - "startLine": 254, + "startLine": 94, "startColumn": 3, - "endLine": 254, - "endColumn": 15, + "endLine": 94, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter128' is not referenced anywhere in the template", + "message": "Parameter 'Parameter48' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter128", + "logicalId": "Parameter48", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter128", + "propertyPath": "Parameters/Parameter48", "category": "Best Practice", - "startLine": 256, + "startLine": 96, "startColumn": 3, - "endLine": 256, - "endColumn": 15, + "endLine": 96, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter129' is not referenced anywhere in the template", + "message": "Parameter 'Parameter49' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter129", + "logicalId": "Parameter49", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter129", + "propertyPath": "Parameters/Parameter49", "category": "Best Practice", - "startLine": 258, + "startLine": 98, "startColumn": 3, - "endLine": 258, - "endColumn": 15, + "endLine": 98, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter130' is not referenced anywhere in the template", + "message": "Parameter 'Parameter50' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter130", + "logicalId": "Parameter50", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter130", + "propertyPath": "Parameters/Parameter50", "category": "Best Practice", - "startLine": 260, + "startLine": 100, "startColumn": 3, - "endLine": 260, - "endColumn": 15, + "endLine": 100, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter131' is not referenced anywhere in the template", + "message": "Parameter 'Parameter51' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter131", + "logicalId": "Parameter51", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter131", + "propertyPath": "Parameters/Parameter51", "category": "Best Practice", - "startLine": 262, + "startLine": 102, "startColumn": 3, - "endLine": 262, - "endColumn": 15, + "endLine": 102, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter132' is not referenced anywhere in the template", + "message": "Parameter 'Parameter52' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter132", + "logicalId": "Parameter52", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter132", + "propertyPath": "Parameters/Parameter52", "category": "Best Practice", - "startLine": 264, + "startLine": 104, "startColumn": 3, - "endLine": 264, - "endColumn": 15, + "endLine": 104, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter133' is not referenced anywhere in the template", + "message": "Parameter 'Parameter53' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter133", + "logicalId": "Parameter53", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter133", + "propertyPath": "Parameters/Parameter53", "category": "Best Practice", - "startLine": 266, + "startLine": 106, "startColumn": 3, - "endLine": 266, - "endColumn": 15, + "endLine": 106, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter134' is not referenced anywhere in the template", + "message": "Parameter 'Parameter54' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter134", + "logicalId": "Parameter54", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter134", + "propertyPath": "Parameters/Parameter54", "category": "Best Practice", - "startLine": 268, + "startLine": 108, "startColumn": 3, - "endLine": 268, - "endColumn": 15, + "endLine": 108, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter135' is not referenced anywhere in the template", + "message": "Parameter 'Parameter55' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter135", + "logicalId": "Parameter55", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter135", + "propertyPath": "Parameters/Parameter55", "category": "Best Practice", - "startLine": 270, + "startLine": 110, "startColumn": 3, - "endLine": 270, - "endColumn": 15, + "endLine": 110, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter136' is not referenced anywhere in the template", + "message": "Parameter 'Parameter56' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter136", + "logicalId": "Parameter56", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter136", + "propertyPath": "Parameters/Parameter56", "category": "Best Practice", - "startLine": 272, + "startLine": 112, "startColumn": 3, - "endLine": 272, - "endColumn": 15, + "endLine": 112, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter137' is not referenced anywhere in the template", + "message": "Parameter 'Parameter57' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter137", + "logicalId": "Parameter57", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter137", + "propertyPath": "Parameters/Parameter57", "category": "Best Practice", - "startLine": 274, + "startLine": 114, "startColumn": 3, - "endLine": 274, - "endColumn": 15, + "endLine": 114, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter138' is not referenced anywhere in the template", + "message": "Parameter 'Parameter58' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter138", + "logicalId": "Parameter58", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter138", + "propertyPath": "Parameters/Parameter58", "category": "Best Practice", - "startLine": 276, + "startLine": 116, "startColumn": 3, - "endLine": 276, - "endColumn": 15, + "endLine": 116, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter139' is not referenced anywhere in the template", + "message": "Parameter 'Parameter59' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter139", + "logicalId": "Parameter59", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter139", + "propertyPath": "Parameters/Parameter59", "category": "Best Practice", - "startLine": 278, + "startLine": 118, "startColumn": 3, - "endLine": 278, - "endColumn": 15, + "endLine": 118, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter140' is not referenced anywhere in the template", + "message": "Parameter 'Parameter60' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter140", + "logicalId": "Parameter60", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter140", + "propertyPath": "Parameters/Parameter60", "category": "Best Practice", - "startLine": 280, + "startLine": 120, "startColumn": 3, - "endLine": 280, - "endColumn": 15, + "endLine": 120, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter141' is not referenced anywhere in the template", + "message": "Parameter 'Parameter61' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter141", + "logicalId": "Parameter61", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter141", + "propertyPath": "Parameters/Parameter61", "category": "Best Practice", - "startLine": 282, + "startLine": 122, "startColumn": 3, - "endLine": 282, - "endColumn": 15, + "endLine": 122, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter142' is not referenced anywhere in the template", + "message": "Parameter 'Parameter62' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter142", + "logicalId": "Parameter62", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter142", + "propertyPath": "Parameters/Parameter62", "category": "Best Practice", - "startLine": 284, + "startLine": 124, "startColumn": 3, - "endLine": 284, - "endColumn": 15, + "endLine": 124, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter143' is not referenced anywhere in the template", + "message": "Parameter 'Parameter63' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter143", + "logicalId": "Parameter63", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter143", + "propertyPath": "Parameters/Parameter63", "category": "Best Practice", - "startLine": 286, + "startLine": 126, "startColumn": 3, - "endLine": 286, - "endColumn": 15, + "endLine": 126, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter144' is not referenced anywhere in the template", + "message": "Parameter 'Parameter64' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter144", + "logicalId": "Parameter64", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter144", + "propertyPath": "Parameters/Parameter64", "category": "Best Practice", - "startLine": 288, + "startLine": 128, "startColumn": 3, - "endLine": 288, - "endColumn": 15, + "endLine": 128, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter145' is not referenced anywhere in the template", + "message": "Parameter 'Parameter65' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter145", + "logicalId": "Parameter65", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter145", + "propertyPath": "Parameters/Parameter65", "category": "Best Practice", - "startLine": 290, + "startLine": 130, "startColumn": 3, - "endLine": 290, - "endColumn": 15, + "endLine": 130, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter146' is not referenced anywhere in the template", + "message": "Parameter 'Parameter66' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter146", + "logicalId": "Parameter66", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter146", + "propertyPath": "Parameters/Parameter66", "category": "Best Practice", - "startLine": 292, + "startLine": 132, "startColumn": 3, - "endLine": 292, - "endColumn": 15, + "endLine": 132, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter147' is not referenced anywhere in the template", + "message": "Parameter 'Parameter67' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter147", + "logicalId": "Parameter67", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter147", + "propertyPath": "Parameters/Parameter67", "category": "Best Practice", - "startLine": 294, + "startLine": 134, "startColumn": 3, - "endLine": 294, - "endColumn": 15, + "endLine": 134, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter148' is not referenced anywhere in the template", + "message": "Parameter 'Parameter68' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter148", + "logicalId": "Parameter68", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter148", + "propertyPath": "Parameters/Parameter68", "category": "Best Practice", - "startLine": 296, + "startLine": 136, "startColumn": 3, - "endLine": 296, - "endColumn": 15, + "endLine": 136, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter149' is not referenced anywhere in the template", + "message": "Parameter 'Parameter69' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter149", + "logicalId": "Parameter69", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter149", + "propertyPath": "Parameters/Parameter69", "category": "Best Practice", - "startLine": 298, + "startLine": 138, "startColumn": 3, - "endLine": 298, - "endColumn": 15, + "endLine": 138, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter150' is not referenced anywhere in the template", + "message": "Parameter 'Parameter70' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter150", + "logicalId": "Parameter70", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter150", + "propertyPath": "Parameters/Parameter70", "category": "Best Practice", - "startLine": 300, + "startLine": 140, "startColumn": 3, - "endLine": 300, - "endColumn": 15, + "endLine": 140, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter151' is not referenced anywhere in the template", + "message": "Parameter 'Parameter71' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter151", + "logicalId": "Parameter71", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter151", + "propertyPath": "Parameters/Parameter71", "category": "Best Practice", - "startLine": 302, + "startLine": 142, "startColumn": 3, - "endLine": 302, - "endColumn": 15, + "endLine": 142, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter152' is not referenced anywhere in the template", + "message": "Parameter 'Parameter72' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter152", + "logicalId": "Parameter72", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter152", + "propertyPath": "Parameters/Parameter72", "category": "Best Practice", - "startLine": 304, + "startLine": 144, "startColumn": 3, - "endLine": 304, - "endColumn": 15, + "endLine": 144, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter153' is not referenced anywhere in the template", + "message": "Parameter 'Parameter73' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter153", + "logicalId": "Parameter73", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter153", + "propertyPath": "Parameters/Parameter73", "category": "Best Practice", - "startLine": 306, + "startLine": 146, "startColumn": 3, - "endLine": 306, - "endColumn": 15, + "endLine": 146, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter154' is not referenced anywhere in the template", + "message": "Parameter 'Parameter74' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter154", + "logicalId": "Parameter74", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter154", + "propertyPath": "Parameters/Parameter74", "category": "Best Practice", - "startLine": 308, + "startLine": 148, "startColumn": 3, - "endLine": 308, - "endColumn": 15, + "endLine": 148, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter155' is not referenced anywhere in the template", + "message": "Parameter 'Parameter75' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter155", + "logicalId": "Parameter75", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter155", + "propertyPath": "Parameters/Parameter75", "category": "Best Practice", - "startLine": 310, + "startLine": 150, "startColumn": 3, - "endLine": 310, - "endColumn": 15, + "endLine": 150, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter156' is not referenced anywhere in the template", + "message": "Parameter 'Parameter76' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter156", + "logicalId": "Parameter76", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter156", + "propertyPath": "Parameters/Parameter76", "category": "Best Practice", - "startLine": 312, + "startLine": 152, "startColumn": 3, - "endLine": 312, - "endColumn": 15, + "endLine": 152, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter157' is not referenced anywhere in the template", + "message": "Parameter 'Parameter77' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter157", + "logicalId": "Parameter77", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter157", + "propertyPath": "Parameters/Parameter77", "category": "Best Practice", - "startLine": 314, + "startLine": 154, "startColumn": 3, - "endLine": 314, - "endColumn": 15, + "endLine": 154, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter158' is not referenced anywhere in the template", + "message": "Parameter 'Parameter78' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter158", + "logicalId": "Parameter78", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter158", + "propertyPath": "Parameters/Parameter78", "category": "Best Practice", - "startLine": 316, + "startLine": 156, "startColumn": 3, - "endLine": 316, - "endColumn": 15, + "endLine": 156, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter159' is not referenced anywhere in the template", + "message": "Parameter 'Parameter79' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter159", + "logicalId": "Parameter79", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter159", + "propertyPath": "Parameters/Parameter79", "category": "Best Practice", - "startLine": 318, + "startLine": 158, "startColumn": 3, - "endLine": 318, - "endColumn": 15, + "endLine": 158, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter160' is not referenced anywhere in the template", + "message": "Parameter 'Parameter80' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter160", + "logicalId": "Parameter80", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter160", + "propertyPath": "Parameters/Parameter80", "category": "Best Practice", - "startLine": 320, + "startLine": 160, "startColumn": 3, - "endLine": 320, - "endColumn": 15, + "endLine": 160, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter161' is not referenced anywhere in the template", + "message": "Parameter 'Parameter81' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter161", + "logicalId": "Parameter81", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter161", + "propertyPath": "Parameters/Parameter81", "category": "Best Practice", - "startLine": 322, + "startLine": 162, "startColumn": 3, - "endLine": 322, - "endColumn": 15, + "endLine": 162, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter162' is not referenced anywhere in the template", + "message": "Parameter 'Parameter82' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter162", + "logicalId": "Parameter82", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter162", + "propertyPath": "Parameters/Parameter82", "category": "Best Practice", - "startLine": 324, + "startLine": 164, "startColumn": 3, - "endLine": 324, - "endColumn": 15, + "endLine": 164, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter163' is not referenced anywhere in the template", + "message": "Parameter 'Parameter83' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter163", + "logicalId": "Parameter83", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter163", + "propertyPath": "Parameters/Parameter83", "category": "Best Practice", - "startLine": 326, + "startLine": 166, "startColumn": 3, - "endLine": 326, - "endColumn": 15, + "endLine": 166, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter164' is not referenced anywhere in the template", + "message": "Parameter 'Parameter84' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter164", + "logicalId": "Parameter84", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter164", + "propertyPath": "Parameters/Parameter84", "category": "Best Practice", - "startLine": 328, + "startLine": 168, "startColumn": 3, - "endLine": 328, - "endColumn": 15, + "endLine": 168, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter165' is not referenced anywhere in the template", + "message": "Parameter 'Parameter85' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter165", + "logicalId": "Parameter85", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter165", + "propertyPath": "Parameters/Parameter85", "category": "Best Practice", - "startLine": 330, + "startLine": 170, "startColumn": 3, - "endLine": 330, - "endColumn": 15, + "endLine": 170, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter166' is not referenced anywhere in the template", + "message": "Parameter 'Parameter86' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter166", + "logicalId": "Parameter86", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter166", + "propertyPath": "Parameters/Parameter86", "category": "Best Practice", - "startLine": 332, + "startLine": 172, "startColumn": 3, - "endLine": 332, - "endColumn": 15, + "endLine": 172, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter167' is not referenced anywhere in the template", + "message": "Parameter 'Parameter87' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter167", + "logicalId": "Parameter87", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter167", + "propertyPath": "Parameters/Parameter87", "category": "Best Practice", - "startLine": 334, + "startLine": 174, "startColumn": 3, - "endLine": 334, - "endColumn": 15, + "endLine": 174, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter168' is not referenced anywhere in the template", + "message": "Parameter 'Parameter88' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter168", + "logicalId": "Parameter88", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter168", + "propertyPath": "Parameters/Parameter88", "category": "Best Practice", - "startLine": 336, + "startLine": 176, "startColumn": 3, - "endLine": 336, - "endColumn": 15, + "endLine": 176, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter169' is not referenced anywhere in the template", + "message": "Parameter 'Parameter89' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter169", + "logicalId": "Parameter89", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter169", + "propertyPath": "Parameters/Parameter89", "category": "Best Practice", - "startLine": 338, + "startLine": 178, "startColumn": 3, - "endLine": 338, - "endColumn": 15, + "endLine": 178, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter170' is not referenced anywhere in the template", + "message": "Parameter 'Parameter90' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter170", + "logicalId": "Parameter90", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter170", + "propertyPath": "Parameters/Parameter90", "category": "Best Practice", - "startLine": 340, + "startLine": 180, "startColumn": 3, - "endLine": 340, - "endColumn": 15, + "endLine": 180, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter171' is not referenced anywhere in the template", + "message": "Parameter 'Parameter91' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter171", + "logicalId": "Parameter91", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter171", + "propertyPath": "Parameters/Parameter91", "category": "Best Practice", - "startLine": 342, + "startLine": 182, "startColumn": 3, - "endLine": 342, - "endColumn": 15, + "endLine": 182, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter172' is not referenced anywhere in the template", + "message": "Parameter 'Parameter92' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter172", + "logicalId": "Parameter92", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter172", + "propertyPath": "Parameters/Parameter92", "category": "Best Practice", - "startLine": 344, + "startLine": 184, "startColumn": 3, - "endLine": 344, - "endColumn": 15, + "endLine": 184, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter173' is not referenced anywhere in the template", + "message": "Parameter 'Parameter93' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter173", + "logicalId": "Parameter93", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter173", + "propertyPath": "Parameters/Parameter93", "category": "Best Practice", - "startLine": 346, + "startLine": 186, "startColumn": 3, - "endLine": 346, - "endColumn": 15, + "endLine": 186, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter174' is not referenced anywhere in the template", + "message": "Parameter 'Parameter94' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter174", + "logicalId": "Parameter94", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter174", + "propertyPath": "Parameters/Parameter94", "category": "Best Practice", - "startLine": 348, + "startLine": 188, "startColumn": 3, - "endLine": 348, - "endColumn": 15, + "endLine": 188, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter175' is not referenced anywhere in the template", + "message": "Parameter 'Parameter95' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter175", + "logicalId": "Parameter95", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter175", + "propertyPath": "Parameters/Parameter95", "category": "Best Practice", - "startLine": 350, + "startLine": 190, "startColumn": 3, - "endLine": 350, - "endColumn": 15, + "endLine": 190, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter176' is not referenced anywhere in the template", + "message": "Parameter 'Parameter96' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter176", + "logicalId": "Parameter96", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter176", + "propertyPath": "Parameters/Parameter96", "category": "Best Practice", - "startLine": 352, + "startLine": 192, "startColumn": 3, - "endLine": 352, - "endColumn": 15, + "endLine": 192, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter177' is not referenced anywhere in the template", + "message": "Parameter 'Parameter97' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter177", + "logicalId": "Parameter97", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter177", + "propertyPath": "Parameters/Parameter97", "category": "Best Practice", - "startLine": 354, + "startLine": 194, "startColumn": 3, - "endLine": 354, - "endColumn": 15, + "endLine": 194, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter178' is not referenced anywhere in the template", + "message": "Parameter 'Parameter98' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter178", + "logicalId": "Parameter98", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter178", + "propertyPath": "Parameters/Parameter98", "category": "Best Practice", - "startLine": 356, + "startLine": 196, "startColumn": 3, - "endLine": 356, - "endColumn": 15, + "endLine": 196, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter179' is not referenced anywhere in the template", + "message": "Parameter 'Parameter99' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter179", + "logicalId": "Parameter99", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter179", + "propertyPath": "Parameters/Parameter99", "category": "Best Practice", - "startLine": 358, + "startLine": 198, "startColumn": 3, - "endLine": 358, - "endColumn": 15, + "endLine": 198, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter180' is not referenced anywhere in the template", + "message": "Parameter 'Parameter100' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter180", + "logicalId": "Parameter100", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter180", + "propertyPath": "Parameters/Parameter100", "category": "Best Practice", - "startLine": 360, + "startLine": 200, "startColumn": 3, - "endLine": 360, + "endLine": 200, "endColumn": 15, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" @@ -11846,17 +11794,17 @@ { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter181' is not referenced anywhere in the template", + "message": "Parameter 'Parameter101' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter181", + "logicalId": "Parameter101", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter181", + "propertyPath": "Parameters/Parameter101", "category": "Best Practice", - "startLine": 362, + "startLine": 202, "startColumn": 3, - "endLine": 362, + "endLine": 202, "endColumn": 15, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" @@ -11864,17 +11812,17 @@ { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter182' is not referenced anywhere in the template", + "message": "Parameter 'Parameter102' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter182", + "logicalId": "Parameter102", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter182", + "propertyPath": "Parameters/Parameter102", "category": "Best Practice", - "startLine": 364, + "startLine": 204, "startColumn": 3, - "endLine": 364, + "endLine": 204, "endColumn": 15, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" @@ -11882,17 +11830,17 @@ { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter183' is not referenced anywhere in the template", + "message": "Parameter 'Parameter103' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter183", + "logicalId": "Parameter103", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter183", + "propertyPath": "Parameters/Parameter103", "category": "Best Practice", - "startLine": 366, + "startLine": 206, "startColumn": 3, - "endLine": 366, + "endLine": 206, "endColumn": 15, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" @@ -11900,17 +11848,17 @@ { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter184' is not referenced anywhere in the template", + "message": "Parameter 'Parameter104' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter184", + "logicalId": "Parameter104", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter184", + "propertyPath": "Parameters/Parameter104", "category": "Best Practice", - "startLine": 368, + "startLine": 208, "startColumn": 3, - "endLine": 368, + "endLine": 208, "endColumn": 15, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" @@ -11918,17 +11866,17 @@ { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter185' is not referenced anywhere in the template", + "message": "Parameter 'Parameter105' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter185", + "logicalId": "Parameter105", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter185", + "propertyPath": "Parameters/Parameter105", "category": "Best Practice", - "startLine": 370, + "startLine": 210, "startColumn": 3, - "endLine": 370, + "endLine": 210, "endColumn": 15, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" @@ -11936,17 +11884,17 @@ { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter186' is not referenced anywhere in the template", + "message": "Parameter 'Parameter106' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter186", + "logicalId": "Parameter106", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter186", + "propertyPath": "Parameters/Parameter106", "category": "Best Practice", - "startLine": 372, + "startLine": 212, "startColumn": 3, - "endLine": 372, + "endLine": 212, "endColumn": 15, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" @@ -11954,17 +11902,17 @@ { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter187' is not referenced anywhere in the template", + "message": "Parameter 'Parameter107' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter187", + "logicalId": "Parameter107", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter187", + "propertyPath": "Parameters/Parameter107", "category": "Best Practice", - "startLine": 374, + "startLine": 214, "startColumn": 3, - "endLine": 374, + "endLine": 214, "endColumn": 15, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" @@ -11972,17 +11920,17 @@ { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter188' is not referenced anywhere in the template", + "message": "Parameter 'Parameter108' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter188", + "logicalId": "Parameter108", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter188", + "propertyPath": "Parameters/Parameter108", "category": "Best Practice", - "startLine": 376, + "startLine": 216, "startColumn": 3, - "endLine": 376, + "endLine": 216, "endColumn": 15, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" @@ -11990,17 +11938,17 @@ { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter189' is not referenced anywhere in the template", + "message": "Parameter 'Parameter109' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter189", + "logicalId": "Parameter109", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter189", + "propertyPath": "Parameters/Parameter109", "category": "Best Practice", - "startLine": 378, + "startLine": 218, "startColumn": 3, - "endLine": 378, + "endLine": 218, "endColumn": 15, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" @@ -12008,17 +11956,17 @@ { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter190' is not referenced anywhere in the template", + "message": "Parameter 'Parameter110' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter190", + "logicalId": "Parameter110", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter190", + "propertyPath": "Parameters/Parameter110", "category": "Best Practice", - "startLine": 380, + "startLine": 220, "startColumn": 3, - "endLine": 380, + "endLine": 220, "endColumn": 15, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" @@ -12026,17 +11974,17 @@ { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter191' is not referenced anywhere in the template", + "message": "Parameter 'Parameter111' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter191", + "logicalId": "Parameter111", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter191", + "propertyPath": "Parameters/Parameter111", "category": "Best Practice", - "startLine": 382, + "startLine": 222, "startColumn": 3, - "endLine": 382, + "endLine": 222, "endColumn": 15, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" @@ -12044,17 +11992,17 @@ { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter192' is not referenced anywhere in the template", + "message": "Parameter 'Parameter112' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter192", + "logicalId": "Parameter112", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter192", + "propertyPath": "Parameters/Parameter112", "category": "Best Practice", - "startLine": 384, + "startLine": 224, "startColumn": 3, - "endLine": 384, + "endLine": 224, "endColumn": 15, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" @@ -12062,17 +12010,17 @@ { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter193' is not referenced anywhere in the template", + "message": "Parameter 'Parameter113' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter193", + "logicalId": "Parameter113", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter193", + "propertyPath": "Parameters/Parameter113", "category": "Best Practice", - "startLine": 386, + "startLine": 226, "startColumn": 3, - "endLine": 386, + "endLine": 226, "endColumn": 15, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" @@ -12080,17 +12028,17 @@ { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter194' is not referenced anywhere in the template", + "message": "Parameter 'Parameter114' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter194", + "logicalId": "Parameter114", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter194", + "propertyPath": "Parameters/Parameter114", "category": "Best Practice", - "startLine": 388, + "startLine": 228, "startColumn": 3, - "endLine": 388, + "endLine": 228, "endColumn": 15, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" @@ -12098,17 +12046,17 @@ { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter195' is not referenced anywhere in the template", + "message": "Parameter 'Parameter115' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter195", + "logicalId": "Parameter115", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter195", + "propertyPath": "Parameters/Parameter115", "category": "Best Practice", - "startLine": 390, + "startLine": 230, "startColumn": 3, - "endLine": 390, + "endLine": 230, "endColumn": 15, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" @@ -12116,17 +12064,17 @@ { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter196' is not referenced anywhere in the template", + "message": "Parameter 'Parameter116' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter196", + "logicalId": "Parameter116", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter196", + "propertyPath": "Parameters/Parameter116", "category": "Best Practice", - "startLine": 392, + "startLine": 232, "startColumn": 3, - "endLine": 392, + "endLine": 232, "endColumn": 15, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" @@ -12134,17 +12082,17 @@ { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter197' is not referenced anywhere in the template", + "message": "Parameter 'Parameter117' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter197", + "logicalId": "Parameter117", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter197", + "propertyPath": "Parameters/Parameter117", "category": "Best Practice", - "startLine": 394, + "startLine": 234, "startColumn": 3, - "endLine": 394, + "endLine": 234, "endColumn": 15, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" @@ -12152,17 +12100,17 @@ { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter198' is not referenced anywhere in the template", + "message": "Parameter 'Parameter118' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter198", + "logicalId": "Parameter118", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter198", + "propertyPath": "Parameters/Parameter118", "category": "Best Practice", - "startLine": 396, + "startLine": 236, "startColumn": 3, - "endLine": 396, + "endLine": 236, "endColumn": 15, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" @@ -12170,17 +12118,17 @@ { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter199' is not referenced anywhere in the template", + "message": "Parameter 'Parameter119' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter199", + "logicalId": "Parameter119", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter199", + "propertyPath": "Parameters/Parameter119", "category": "Best Practice", - "startLine": 398, + "startLine": 238, "startColumn": 3, - "endLine": 398, + "endLine": 238, "endColumn": 15, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" @@ -12188,17 +12136,17 @@ { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter200' is not referenced anywhere in the template", + "message": "Parameter 'Parameter120' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter200", + "logicalId": "Parameter120", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter200", + "propertyPath": "Parameters/Parameter120", "category": "Best Practice", - "startLine": 400, + "startLine": 240, "startColumn": 3, - "endLine": 400, + "endLine": 240, "endColumn": 15, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" @@ -12206,1637 +12154,1637 @@ { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Parameter201' is not referenced anywhere in the template", + "message": "Parameter 'Parameter121' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Parameter201", + "logicalId": "Parameter121", "entityType": "Parameter" }, - "propertyPath": "Parameters/Parameter201", + "propertyPath": "Parameters/Parameter121", "category": "Best Practice", - "startLine": 402, + "startLine": 242, "startColumn": 3, - "endLine": 402, + "endLine": 242, "endColumn": 15, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping1' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter122' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping1", - "entityType": "Mapping" + "logicalId": "Parameter122", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping1", + "propertyPath": "Parameters/Parameter122", "category": "Best Practice", - "startLine": 1811, + "startLine": 244, "startColumn": 3, - "endLine": 1811, - "endColumn": 11, - "ruleDescription": "Check if Mappings are Used", + "endLine": 244, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping2' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter123' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping2", - "entityType": "Mapping" + "logicalId": "Parameter123", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping2", + "propertyPath": "Parameters/Parameter123", "category": "Best Practice", - "startLine": 1814, + "startLine": 246, "startColumn": 3, - "endLine": 1814, - "endColumn": 11, - "ruleDescription": "Check if Mappings are Used", + "endLine": 246, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping3' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter124' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping3", - "entityType": "Mapping" + "logicalId": "Parameter124", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping3", + "propertyPath": "Parameters/Parameter124", "category": "Best Practice", - "startLine": 1817, + "startLine": 248, "startColumn": 3, - "endLine": 1817, - "endColumn": 11, - "ruleDescription": "Check if Mappings are Used", + "endLine": 248, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping4' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter125' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping4", - "entityType": "Mapping" + "logicalId": "Parameter125", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping4", + "propertyPath": "Parameters/Parameter125", "category": "Best Practice", - "startLine": 1820, + "startLine": 250, "startColumn": 3, - "endLine": 1820, - "endColumn": 11, - "ruleDescription": "Check if Mappings are Used", + "endLine": 250, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping5' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter126' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping5", - "entityType": "Mapping" + "logicalId": "Parameter126", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping5", + "propertyPath": "Parameters/Parameter126", "category": "Best Practice", - "startLine": 1823, + "startLine": 252, "startColumn": 3, - "endLine": 1823, - "endColumn": 11, - "ruleDescription": "Check if Mappings are Used", + "endLine": 252, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping6' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter127' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping6", - "entityType": "Mapping" + "logicalId": "Parameter127", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping6", + "propertyPath": "Parameters/Parameter127", "category": "Best Practice", - "startLine": 1826, + "startLine": 254, "startColumn": 3, - "endLine": 1826, - "endColumn": 11, - "ruleDescription": "Check if Mappings are Used", + "endLine": 254, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping7' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter128' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping7", - "entityType": "Mapping" + "logicalId": "Parameter128", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping7", + "propertyPath": "Parameters/Parameter128", "category": "Best Practice", - "startLine": 1829, + "startLine": 256, "startColumn": 3, - "endLine": 1829, - "endColumn": 11, - "ruleDescription": "Check if Mappings are Used", + "endLine": 256, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping8' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter129' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping8", - "entityType": "Mapping" + "logicalId": "Parameter129", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping8", + "propertyPath": "Parameters/Parameter129", "category": "Best Practice", - "startLine": 1832, + "startLine": 258, "startColumn": 3, - "endLine": 1832, - "endColumn": 11, - "ruleDescription": "Check if Mappings are Used", + "endLine": 258, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping9' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter130' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping9", - "entityType": "Mapping" + "logicalId": "Parameter130", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping9", + "propertyPath": "Parameters/Parameter130", "category": "Best Practice", - "startLine": 1835, + "startLine": 260, "startColumn": 3, - "endLine": 1835, - "endColumn": 11, - "ruleDescription": "Check if Mappings are Used", + "endLine": 260, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping10' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter131' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping10", - "entityType": "Mapping" + "logicalId": "Parameter131", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping10", + "propertyPath": "Parameters/Parameter131", "category": "Best Practice", - "startLine": 1838, + "startLine": 262, "startColumn": 3, - "endLine": 1838, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 262, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping11' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter132' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping11", - "entityType": "Mapping" + "logicalId": "Parameter132", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping11", + "propertyPath": "Parameters/Parameter132", "category": "Best Practice", - "startLine": 1841, + "startLine": 264, "startColumn": 3, - "endLine": 1841, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 264, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping12' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter133' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping12", - "entityType": "Mapping" + "logicalId": "Parameter133", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping12", + "propertyPath": "Parameters/Parameter133", "category": "Best Practice", - "startLine": 1844, + "startLine": 266, "startColumn": 3, - "endLine": 1844, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 266, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping13' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter134' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping13", - "entityType": "Mapping" + "logicalId": "Parameter134", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping13", + "propertyPath": "Parameters/Parameter134", "category": "Best Practice", - "startLine": 1847, + "startLine": 268, "startColumn": 3, - "endLine": 1847, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 268, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping14' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter135' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping14", - "entityType": "Mapping" + "logicalId": "Parameter135", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping14", + "propertyPath": "Parameters/Parameter135", "category": "Best Practice", - "startLine": 1850, + "startLine": 270, "startColumn": 3, - "endLine": 1850, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 270, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping15' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter136' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping15", - "entityType": "Mapping" + "logicalId": "Parameter136", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping15", + "propertyPath": "Parameters/Parameter136", "category": "Best Practice", - "startLine": 1853, + "startLine": 272, "startColumn": 3, - "endLine": 1853, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 272, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping16' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter137' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping16", - "entityType": "Mapping" + "logicalId": "Parameter137", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping16", + "propertyPath": "Parameters/Parameter137", "category": "Best Practice", - "startLine": 1856, + "startLine": 274, "startColumn": 3, - "endLine": 1856, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 274, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping17' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter138' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping17", - "entityType": "Mapping" + "logicalId": "Parameter138", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping17", + "propertyPath": "Parameters/Parameter138", "category": "Best Practice", - "startLine": 1859, + "startLine": 276, "startColumn": 3, - "endLine": 1859, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 276, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping18' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter139' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping18", - "entityType": "Mapping" + "logicalId": "Parameter139", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping18", + "propertyPath": "Parameters/Parameter139", "category": "Best Practice", - "startLine": 1862, + "startLine": 278, "startColumn": 3, - "endLine": 1862, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 278, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping19' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter140' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping19", - "entityType": "Mapping" + "logicalId": "Parameter140", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping19", + "propertyPath": "Parameters/Parameter140", "category": "Best Practice", - "startLine": 1865, + "startLine": 280, "startColumn": 3, - "endLine": 1865, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 280, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping20' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter141' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping20", - "entityType": "Mapping" + "logicalId": "Parameter141", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping20", + "propertyPath": "Parameters/Parameter141", "category": "Best Practice", - "startLine": 1868, + "startLine": 282, "startColumn": 3, - "endLine": 1868, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 282, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping21' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter142' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping21", - "entityType": "Mapping" + "logicalId": "Parameter142", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping21", + "propertyPath": "Parameters/Parameter142", "category": "Best Practice", - "startLine": 1871, + "startLine": 284, "startColumn": 3, - "endLine": 1871, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 284, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping22' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter143' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping22", - "entityType": "Mapping" + "logicalId": "Parameter143", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping22", + "propertyPath": "Parameters/Parameter143", "category": "Best Practice", - "startLine": 1874, - "startColumn": 3, - "endLine": 1874, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "startLine": 286, + "startColumn": 3, + "endLine": 286, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping23' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter144' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping23", - "entityType": "Mapping" + "logicalId": "Parameter144", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping23", + "propertyPath": "Parameters/Parameter144", "category": "Best Practice", - "startLine": 1877, + "startLine": 288, "startColumn": 3, - "endLine": 1877, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 288, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping24' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter145' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping24", - "entityType": "Mapping" + "logicalId": "Parameter145", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping24", + "propertyPath": "Parameters/Parameter145", "category": "Best Practice", - "startLine": 1880, + "startLine": 290, "startColumn": 3, - "endLine": 1880, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 290, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping25' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter146' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping25", - "entityType": "Mapping" + "logicalId": "Parameter146", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping25", + "propertyPath": "Parameters/Parameter146", "category": "Best Practice", - "startLine": 1883, + "startLine": 292, "startColumn": 3, - "endLine": 1883, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 292, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping26' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter147' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping26", - "entityType": "Mapping" + "logicalId": "Parameter147", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping26", + "propertyPath": "Parameters/Parameter147", "category": "Best Practice", - "startLine": 1886, + "startLine": 294, "startColumn": 3, - "endLine": 1886, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 294, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping27' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter148' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping27", - "entityType": "Mapping" + "logicalId": "Parameter148", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping27", + "propertyPath": "Parameters/Parameter148", "category": "Best Practice", - "startLine": 1889, + "startLine": 296, "startColumn": 3, - "endLine": 1889, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 296, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping28' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter149' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping28", - "entityType": "Mapping" + "logicalId": "Parameter149", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping28", + "propertyPath": "Parameters/Parameter149", "category": "Best Practice", - "startLine": 1892, + "startLine": 298, "startColumn": 3, - "endLine": 1892, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 298, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping29' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter150' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping29", - "entityType": "Mapping" + "logicalId": "Parameter150", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping29", + "propertyPath": "Parameters/Parameter150", "category": "Best Practice", - "startLine": 1895, + "startLine": 300, "startColumn": 3, - "endLine": 1895, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 300, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping30' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter151' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping30", - "entityType": "Mapping" + "logicalId": "Parameter151", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping30", + "propertyPath": "Parameters/Parameter151", "category": "Best Practice", - "startLine": 1898, + "startLine": 302, "startColumn": 3, - "endLine": 1898, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 302, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping31' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter152' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping31", - "entityType": "Mapping" + "logicalId": "Parameter152", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping31", + "propertyPath": "Parameters/Parameter152", "category": "Best Practice", - "startLine": 1901, + "startLine": 304, "startColumn": 3, - "endLine": 1901, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 304, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping32' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter153' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping32", - "entityType": "Mapping" + "logicalId": "Parameter153", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping32", + "propertyPath": "Parameters/Parameter153", "category": "Best Practice", - "startLine": 1904, + "startLine": 306, "startColumn": 3, - "endLine": 1904, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 306, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping33' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter154' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping33", - "entityType": "Mapping" + "logicalId": "Parameter154", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping33", + "propertyPath": "Parameters/Parameter154", "category": "Best Practice", - "startLine": 1907, + "startLine": 308, "startColumn": 3, - "endLine": 1907, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 308, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping34' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter155' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping34", - "entityType": "Mapping" + "logicalId": "Parameter155", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping34", + "propertyPath": "Parameters/Parameter155", "category": "Best Practice", - "startLine": 1910, + "startLine": 310, "startColumn": 3, - "endLine": 1910, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 310, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping35' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter156' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping35", - "entityType": "Mapping" + "logicalId": "Parameter156", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping35", + "propertyPath": "Parameters/Parameter156", "category": "Best Practice", - "startLine": 1913, + "startLine": 312, "startColumn": 3, - "endLine": 1913, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 312, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping36' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter157' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping36", - "entityType": "Mapping" + "logicalId": "Parameter157", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping36", + "propertyPath": "Parameters/Parameter157", "category": "Best Practice", - "startLine": 1916, + "startLine": 314, "startColumn": 3, - "endLine": 1916, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 314, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping37' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter158' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping37", - "entityType": "Mapping" + "logicalId": "Parameter158", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping37", + "propertyPath": "Parameters/Parameter158", "category": "Best Practice", - "startLine": 1919, + "startLine": 316, "startColumn": 3, - "endLine": 1919, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 316, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping38' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter159' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping38", - "entityType": "Mapping" + "logicalId": "Parameter159", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping38", + "propertyPath": "Parameters/Parameter159", "category": "Best Practice", - "startLine": 1922, + "startLine": 318, "startColumn": 3, - "endLine": 1922, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 318, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping39' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter160' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping39", - "entityType": "Mapping" + "logicalId": "Parameter160", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping39", + "propertyPath": "Parameters/Parameter160", "category": "Best Practice", - "startLine": 1925, + "startLine": 320, "startColumn": 3, - "endLine": 1925, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 320, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping40' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter161' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping40", - "entityType": "Mapping" + "logicalId": "Parameter161", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping40", + "propertyPath": "Parameters/Parameter161", "category": "Best Practice", - "startLine": 1928, + "startLine": 322, "startColumn": 3, - "endLine": 1928, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 322, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping41' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter162' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping41", - "entityType": "Mapping" + "logicalId": "Parameter162", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping41", + "propertyPath": "Parameters/Parameter162", "category": "Best Practice", - "startLine": 1931, + "startLine": 324, "startColumn": 3, - "endLine": 1931, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 324, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping42' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter163' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping42", - "entityType": "Mapping" + "logicalId": "Parameter163", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping42", + "propertyPath": "Parameters/Parameter163", "category": "Best Practice", - "startLine": 1934, + "startLine": 326, "startColumn": 3, - "endLine": 1934, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 326, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping43' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter164' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping43", - "entityType": "Mapping" + "logicalId": "Parameter164", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping43", + "propertyPath": "Parameters/Parameter164", "category": "Best Practice", - "startLine": 1937, + "startLine": 328, "startColumn": 3, - "endLine": 1937, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 328, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping44' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter165' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping44", - "entityType": "Mapping" + "logicalId": "Parameter165", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping44", + "propertyPath": "Parameters/Parameter165", "category": "Best Practice", - "startLine": 1940, + "startLine": 330, "startColumn": 3, - "endLine": 1940, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 330, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping45' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter166' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping45", - "entityType": "Mapping" + "logicalId": "Parameter166", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping45", + "propertyPath": "Parameters/Parameter166", "category": "Best Practice", - "startLine": 1943, + "startLine": 332, "startColumn": 3, - "endLine": 1943, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 332, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping46' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter167' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping46", - "entityType": "Mapping" + "logicalId": "Parameter167", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping46", + "propertyPath": "Parameters/Parameter167", "category": "Best Practice", - "startLine": 1946, + "startLine": 334, "startColumn": 3, - "endLine": 1946, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 334, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping47' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter168' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping47", - "entityType": "Mapping" + "logicalId": "Parameter168", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping47", + "propertyPath": "Parameters/Parameter168", "category": "Best Practice", - "startLine": 1949, + "startLine": 336, "startColumn": 3, - "endLine": 1949, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 336, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping48' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter169' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping48", - "entityType": "Mapping" + "logicalId": "Parameter169", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping48", + "propertyPath": "Parameters/Parameter169", "category": "Best Practice", - "startLine": 1952, + "startLine": 338, "startColumn": 3, - "endLine": 1952, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 338, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping49' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter170' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping49", - "entityType": "Mapping" + "logicalId": "Parameter170", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping49", + "propertyPath": "Parameters/Parameter170", "category": "Best Practice", - "startLine": 1955, + "startLine": 340, "startColumn": 3, - "endLine": 1955, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 340, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping50' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter171' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping50", - "entityType": "Mapping" + "logicalId": "Parameter171", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping50", + "propertyPath": "Parameters/Parameter171", "category": "Best Practice", - "startLine": 1958, + "startLine": 342, "startColumn": 3, - "endLine": 1958, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 342, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping51' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter172' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping51", - "entityType": "Mapping" + "logicalId": "Parameter172", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping51", + "propertyPath": "Parameters/Parameter172", "category": "Best Practice", - "startLine": 1961, + "startLine": 344, "startColumn": 3, - "endLine": 1961, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 344, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping52' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter173' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping52", - "entityType": "Mapping" + "logicalId": "Parameter173", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping52", + "propertyPath": "Parameters/Parameter173", "category": "Best Practice", - "startLine": 1964, + "startLine": 346, "startColumn": 3, - "endLine": 1964, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 346, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping53' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter174' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping53", - "entityType": "Mapping" + "logicalId": "Parameter174", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping53", + "propertyPath": "Parameters/Parameter174", "category": "Best Practice", - "startLine": 1967, + "startLine": 348, "startColumn": 3, - "endLine": 1967, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 348, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping54' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter175' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping54", - "entityType": "Mapping" + "logicalId": "Parameter175", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping54", + "propertyPath": "Parameters/Parameter175", "category": "Best Practice", - "startLine": 1970, + "startLine": 350, "startColumn": 3, - "endLine": 1970, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 350, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping55' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter176' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping55", - "entityType": "Mapping" + "logicalId": "Parameter176", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping55", + "propertyPath": "Parameters/Parameter176", "category": "Best Practice", - "startLine": 1973, + "startLine": 352, "startColumn": 3, - "endLine": 1973, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 352, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping56' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter177' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping56", - "entityType": "Mapping" + "logicalId": "Parameter177", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping56", + "propertyPath": "Parameters/Parameter177", "category": "Best Practice", - "startLine": 1976, + "startLine": 354, "startColumn": 3, - "endLine": 1976, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 354, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping57' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter178' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping57", - "entityType": "Mapping" + "logicalId": "Parameter178", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping57", + "propertyPath": "Parameters/Parameter178", "category": "Best Practice", - "startLine": 1979, + "startLine": 356, "startColumn": 3, - "endLine": 1979, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 356, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping58' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter179' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping58", - "entityType": "Mapping" + "logicalId": "Parameter179", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping58", + "propertyPath": "Parameters/Parameter179", "category": "Best Practice", - "startLine": 1982, + "startLine": 358, "startColumn": 3, - "endLine": 1982, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 358, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping59' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter180' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping59", - "entityType": "Mapping" + "logicalId": "Parameter180", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping59", + "propertyPath": "Parameters/Parameter180", "category": "Best Practice", - "startLine": 1985, + "startLine": 360, "startColumn": 3, - "endLine": 1985, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 360, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping60' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter181' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping60", - "entityType": "Mapping" + "logicalId": "Parameter181", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping60", + "propertyPath": "Parameters/Parameter181", "category": "Best Practice", - "startLine": 1988, + "startLine": 362, "startColumn": 3, - "endLine": 1988, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 362, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping61' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter182' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping61", - "entityType": "Mapping" + "logicalId": "Parameter182", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping61", + "propertyPath": "Parameters/Parameter182", "category": "Best Practice", - "startLine": 1991, + "startLine": 364, "startColumn": 3, - "endLine": 1991, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 364, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping62' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter183' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping62", - "entityType": "Mapping" + "logicalId": "Parameter183", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping62", + "propertyPath": "Parameters/Parameter183", "category": "Best Practice", - "startLine": 1994, + "startLine": 366, "startColumn": 3, - "endLine": 1994, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 366, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping63' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter184' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping63", - "entityType": "Mapping" + "logicalId": "Parameter184", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping63", + "propertyPath": "Parameters/Parameter184", "category": "Best Practice", - "startLine": 1997, + "startLine": 368, "startColumn": 3, - "endLine": 1997, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 368, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping64' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter185' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping64", - "entityType": "Mapping" + "logicalId": "Parameter185", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping64", + "propertyPath": "Parameters/Parameter185", "category": "Best Practice", - "startLine": 2000, + "startLine": 370, "startColumn": 3, - "endLine": 2000, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 370, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping65' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter186' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping65", - "entityType": "Mapping" + "logicalId": "Parameter186", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping65", + "propertyPath": "Parameters/Parameter186", "category": "Best Practice", - "startLine": 2003, + "startLine": 372, "startColumn": 3, - "endLine": 2003, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 372, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping66' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter187' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping66", - "entityType": "Mapping" + "logicalId": "Parameter187", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping66", + "propertyPath": "Parameters/Parameter187", "category": "Best Practice", - "startLine": 2006, + "startLine": 374, "startColumn": 3, - "endLine": 2006, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 374, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping67' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter188' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping67", - "entityType": "Mapping" + "logicalId": "Parameter188", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping67", + "propertyPath": "Parameters/Parameter188", "category": "Best Practice", - "startLine": 2009, + "startLine": 376, "startColumn": 3, - "endLine": 2009, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 376, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping68' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter189' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping68", - "entityType": "Mapping" + "logicalId": "Parameter189", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping68", + "propertyPath": "Parameters/Parameter189", "category": "Best Practice", - "startLine": 2012, + "startLine": 378, "startColumn": 3, - "endLine": 2012, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 378, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping69' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter190' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping69", - "entityType": "Mapping" + "logicalId": "Parameter190", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping69", + "propertyPath": "Parameters/Parameter190", "category": "Best Practice", - "startLine": 2015, + "startLine": 380, "startColumn": 3, - "endLine": 2015, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 380, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping70' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter191' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping70", - "entityType": "Mapping" + "logicalId": "Parameter191", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping70", + "propertyPath": "Parameters/Parameter191", "category": "Best Practice", - "startLine": 2018, + "startLine": 382, "startColumn": 3, - "endLine": 2018, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 382, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping71' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter192' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping71", - "entityType": "Mapping" + "logicalId": "Parameter192", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping71", + "propertyPath": "Parameters/Parameter192", "category": "Best Practice", - "startLine": 2021, + "startLine": 384, "startColumn": 3, - "endLine": 2021, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 384, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping72' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter193' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping72", - "entityType": "Mapping" + "logicalId": "Parameter193", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping72", + "propertyPath": "Parameters/Parameter193", "category": "Best Practice", - "startLine": 2024, + "startLine": 386, "startColumn": 3, - "endLine": 2024, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 386, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping73' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter194' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping73", - "entityType": "Mapping" + "logicalId": "Parameter194", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping73", + "propertyPath": "Parameters/Parameter194", "category": "Best Practice", - "startLine": 2027, + "startLine": 388, "startColumn": 3, - "endLine": 2027, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 388, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping74' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter195' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping74", - "entityType": "Mapping" + "logicalId": "Parameter195", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping74", + "propertyPath": "Parameters/Parameter195", "category": "Best Practice", - "startLine": 2030, + "startLine": 390, "startColumn": 3, - "endLine": 2030, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 390, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping75' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter196' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping75", - "entityType": "Mapping" + "logicalId": "Parameter196", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping75", + "propertyPath": "Parameters/Parameter196", "category": "Best Practice", - "startLine": 2033, + "startLine": 392, "startColumn": 3, - "endLine": 2033, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 392, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping76' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter197' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping76", - "entityType": "Mapping" + "logicalId": "Parameter197", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping76", + "propertyPath": "Parameters/Parameter197", "category": "Best Practice", - "startLine": 2036, + "startLine": 394, "startColumn": 3, - "endLine": 2036, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 394, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping77' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter198' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping77", - "entityType": "Mapping" + "logicalId": "Parameter198", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping77", + "propertyPath": "Parameters/Parameter198", "category": "Best Practice", - "startLine": 2039, + "startLine": 396, "startColumn": 3, - "endLine": 2039, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 396, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping78' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter199' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping78", - "entityType": "Mapping" + "logicalId": "Parameter199", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping78", + "propertyPath": "Parameters/Parameter199", "category": "Best Practice", - "startLine": 2042, + "startLine": 398, "startColumn": 3, - "endLine": 2042, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 398, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping79' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter200' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping79", - "entityType": "Mapping" + "logicalId": "Parameter200", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping79", + "propertyPath": "Parameters/Parameter200", "category": "Best Practice", - "startLine": 2045, + "startLine": 400, "startColumn": 3, - "endLine": 2045, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 400, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W7001", + "ruleId": "W2001", "severity": "WARN", - "message": "Mapping 'Mapping80' is not referenced by any Fn::FindInMap", + "message": "Parameter 'Parameter201' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping80", - "entityType": "Mapping" + "logicalId": "Parameter201", + "entityType": "Parameter" }, - "propertyPath": "Mappings/Mapping80", + "propertyPath": "Parameters/Parameter201", "category": "Best Practice", - "startLine": 2048, + "startLine": 402, "startColumn": 3, - "endLine": 2048, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 402, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping81' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping1' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping81", + "logicalId": "Mapping1", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping81", + "propertyPath": "Mappings/Mapping1", "category": "Best Practice", - "startLine": 2051, + "startLine": 1811, "startColumn": 3, - "endLine": 2051, - "endColumn": 12, + "endLine": 1811, + "endColumn": 11, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping82' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping2' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping82", + "logicalId": "Mapping2", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping82", + "propertyPath": "Mappings/Mapping2", "category": "Best Practice", - "startLine": 2054, + "startLine": 1814, "startColumn": 3, - "endLine": 2054, - "endColumn": 12, + "endLine": 1814, + "endColumn": 11, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping83' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping3' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping83", + "logicalId": "Mapping3", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping83", + "propertyPath": "Mappings/Mapping3", "category": "Best Practice", - "startLine": 2057, + "startLine": 1817, "startColumn": 3, - "endLine": 2057, - "endColumn": 12, + "endLine": 1817, + "endColumn": 11, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping84' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping4' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping84", + "logicalId": "Mapping4", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping84", + "propertyPath": "Mappings/Mapping4", "category": "Best Practice", - "startLine": 2060, + "startLine": 1820, "startColumn": 3, - "endLine": 2060, - "endColumn": 12, + "endLine": 1820, + "endColumn": 11, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping85' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping5' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping85", + "logicalId": "Mapping5", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping85", + "propertyPath": "Mappings/Mapping5", "category": "Best Practice", - "startLine": 2063, + "startLine": 1823, "startColumn": 3, - "endLine": 2063, - "endColumn": 12, + "endLine": 1823, + "endColumn": 11, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping86' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping6' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping86", + "logicalId": "Mapping6", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping86", + "propertyPath": "Mappings/Mapping6", "category": "Best Practice", - "startLine": 2066, + "startLine": 1826, "startColumn": 3, - "endLine": 2066, - "endColumn": 12, + "endLine": 1826, + "endColumn": 11, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping87' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping7' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping87", + "logicalId": "Mapping7", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping87", + "propertyPath": "Mappings/Mapping7", "category": "Best Practice", - "startLine": 2069, + "startLine": 1829, "startColumn": 3, - "endLine": 2069, - "endColumn": 12, + "endLine": 1829, + "endColumn": 11, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping88' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping8' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping88", + "logicalId": "Mapping8", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping88", + "propertyPath": "Mappings/Mapping8", "category": "Best Practice", - "startLine": 2072, + "startLine": 1832, "startColumn": 3, - "endLine": 2072, - "endColumn": 12, + "endLine": 1832, + "endColumn": 11, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping89' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping9' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping89", + "logicalId": "Mapping9", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping89", + "propertyPath": "Mappings/Mapping9", "category": "Best Practice", - "startLine": 2075, + "startLine": 1835, "startColumn": 3, - "endLine": 2075, - "endColumn": 12, + "endLine": 1835, + "endColumn": 11, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping90' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping10' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping90", + "logicalId": "Mapping10", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping90", + "propertyPath": "Mappings/Mapping10", "category": "Best Practice", - "startLine": 2078, + "startLine": 1838, "startColumn": 3, - "endLine": 2078, + "endLine": 1838, "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" @@ -13844,17 +13792,17 @@ { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping91' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping11' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping91", + "logicalId": "Mapping11", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping91", + "propertyPath": "Mappings/Mapping11", "category": "Best Practice", - "startLine": 2081, + "startLine": 1841, "startColumn": 3, - "endLine": 2081, + "endLine": 1841, "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" @@ -13862,17 +13810,17 @@ { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping92' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping12' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping92", + "logicalId": "Mapping12", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping92", + "propertyPath": "Mappings/Mapping12", "category": "Best Practice", - "startLine": 2084, + "startLine": 1844, "startColumn": 3, - "endLine": 2084, + "endLine": 1844, "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" @@ -13880,17 +13828,17 @@ { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping93' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping13' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping93", + "logicalId": "Mapping13", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping93", + "propertyPath": "Mappings/Mapping13", "category": "Best Practice", - "startLine": 2087, + "startLine": 1847, "startColumn": 3, - "endLine": 2087, + "endLine": 1847, "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" @@ -13898,17 +13846,17 @@ { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping94' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping14' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping94", + "logicalId": "Mapping14", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping94", + "propertyPath": "Mappings/Mapping14", "category": "Best Practice", - "startLine": 2090, + "startLine": 1850, "startColumn": 3, - "endLine": 2090, + "endLine": 1850, "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" @@ -13916,17 +13864,17 @@ { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping95' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping15' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping95", + "logicalId": "Mapping15", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping95", + "propertyPath": "Mappings/Mapping15", "category": "Best Practice", - "startLine": 2093, + "startLine": 1853, "startColumn": 3, - "endLine": 2093, + "endLine": 1853, "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" @@ -13934,17 +13882,17 @@ { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping96' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping16' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping96", + "logicalId": "Mapping16", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping96", + "propertyPath": "Mappings/Mapping16", "category": "Best Practice", - "startLine": 2096, + "startLine": 1856, "startColumn": 3, - "endLine": 2096, + "endLine": 1856, "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" @@ -13952,17 +13900,17 @@ { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping97' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping17' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping97", + "logicalId": "Mapping17", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping97", + "propertyPath": "Mappings/Mapping17", "category": "Best Practice", - "startLine": 2099, + "startLine": 1859, "startColumn": 3, - "endLine": 2099, + "endLine": 1859, "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" @@ -13970,17 +13918,17 @@ { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping98' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping18' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping98", + "logicalId": "Mapping18", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping98", + "propertyPath": "Mappings/Mapping18", "category": "Best Practice", - "startLine": 2102, + "startLine": 1862, "startColumn": 3, - "endLine": 2102, + "endLine": 1862, "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" @@ -13988,17 +13936,17 @@ { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping99' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping19' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping99", + "logicalId": "Mapping19", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping99", + "propertyPath": "Mappings/Mapping19", "category": "Best Practice", - "startLine": 2105, + "startLine": 1865, "startColumn": 3, - "endLine": 2105, + "endLine": 1865, "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" @@ -14006,1457 +13954,1457 @@ { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping100' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping20' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping100", + "logicalId": "Mapping20", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping100", + "propertyPath": "Mappings/Mapping20", "category": "Best Practice", - "startLine": 2108, + "startLine": 1868, "startColumn": 3, - "endLine": 2108, - "endColumn": 13, + "endLine": 1868, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping101' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping21' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping101", + "logicalId": "Mapping21", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping101", + "propertyPath": "Mappings/Mapping21", "category": "Best Practice", - "startLine": 2111, + "startLine": 1871, "startColumn": 3, - "endLine": 2111, - "endColumn": 13, + "endLine": 1871, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping102' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping22' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping102", + "logicalId": "Mapping22", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping102", + "propertyPath": "Mappings/Mapping22", "category": "Best Practice", - "startLine": 2114, + "startLine": 1874, "startColumn": 3, - "endLine": 2114, - "endColumn": 13, + "endLine": 1874, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping103' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping23' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping103", + "logicalId": "Mapping23", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping103", + "propertyPath": "Mappings/Mapping23", "category": "Best Practice", - "startLine": 2117, + "startLine": 1877, "startColumn": 3, - "endLine": 2117, - "endColumn": 13, + "endLine": 1877, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping104' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping24' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping104", + "logicalId": "Mapping24", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping104", + "propertyPath": "Mappings/Mapping24", "category": "Best Practice", - "startLine": 2120, + "startLine": 1880, "startColumn": 3, - "endLine": 2120, - "endColumn": 13, + "endLine": 1880, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping105' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping25' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping105", + "logicalId": "Mapping25", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping105", + "propertyPath": "Mappings/Mapping25", "category": "Best Practice", - "startLine": 2123, + "startLine": 1883, "startColumn": 3, - "endLine": 2123, - "endColumn": 13, + "endLine": 1883, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping106' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping26' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping106", + "logicalId": "Mapping26", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping106", + "propertyPath": "Mappings/Mapping26", "category": "Best Practice", - "startLine": 2126, + "startLine": 1886, "startColumn": 3, - "endLine": 2126, - "endColumn": 13, + "endLine": 1886, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping107' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping27' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping107", + "logicalId": "Mapping27", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping107", + "propertyPath": "Mappings/Mapping27", "category": "Best Practice", - "startLine": 2129, + "startLine": 1889, "startColumn": 3, - "endLine": 2129, - "endColumn": 13, + "endLine": 1889, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping108' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping28' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping108", + "logicalId": "Mapping28", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping108", + "propertyPath": "Mappings/Mapping28", "category": "Best Practice", - "startLine": 2132, + "startLine": 1892, "startColumn": 3, - "endLine": 2132, - "endColumn": 13, + "endLine": 1892, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping109' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping29' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping109", + "logicalId": "Mapping29", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping109", + "propertyPath": "Mappings/Mapping29", "category": "Best Practice", - "startLine": 2135, + "startLine": 1895, "startColumn": 3, - "endLine": 2135, - "endColumn": 13, + "endLine": 1895, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping110' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping30' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping110", + "logicalId": "Mapping30", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping110", + "propertyPath": "Mappings/Mapping30", "category": "Best Practice", - "startLine": 2138, + "startLine": 1898, "startColumn": 3, - "endLine": 2138, - "endColumn": 13, + "endLine": 1898, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping111' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping31' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping111", + "logicalId": "Mapping31", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping111", + "propertyPath": "Mappings/Mapping31", "category": "Best Practice", - "startLine": 2141, + "startLine": 1901, "startColumn": 3, - "endLine": 2141, - "endColumn": 13, + "endLine": 1901, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping112' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping32' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping112", + "logicalId": "Mapping32", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping112", + "propertyPath": "Mappings/Mapping32", "category": "Best Practice", - "startLine": 2144, + "startLine": 1904, "startColumn": 3, - "endLine": 2144, - "endColumn": 13, + "endLine": 1904, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping113' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping33' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping113", + "logicalId": "Mapping33", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping113", + "propertyPath": "Mappings/Mapping33", "category": "Best Practice", - "startLine": 2147, + "startLine": 1907, "startColumn": 3, - "endLine": 2147, - "endColumn": 13, + "endLine": 1907, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping114' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping34' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping114", + "logicalId": "Mapping34", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping114", + "propertyPath": "Mappings/Mapping34", "category": "Best Practice", - "startLine": 2150, + "startLine": 1910, "startColumn": 3, - "endLine": 2150, - "endColumn": 13, + "endLine": 1910, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping115' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping35' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping115", + "logicalId": "Mapping35", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping115", + "propertyPath": "Mappings/Mapping35", "category": "Best Practice", - "startLine": 2153, + "startLine": 1913, "startColumn": 3, - "endLine": 2153, - "endColumn": 13, + "endLine": 1913, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping116' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping36' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping116", + "logicalId": "Mapping36", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping116", + "propertyPath": "Mappings/Mapping36", "category": "Best Practice", - "startLine": 2156, + "startLine": 1916, "startColumn": 3, - "endLine": 2156, - "endColumn": 13, + "endLine": 1916, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping117' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping37' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping117", + "logicalId": "Mapping37", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping117", + "propertyPath": "Mappings/Mapping37", "category": "Best Practice", - "startLine": 2159, + "startLine": 1919, "startColumn": 3, - "endLine": 2159, - "endColumn": 13, + "endLine": 1919, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping118' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping38' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping118", + "logicalId": "Mapping38", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping118", + "propertyPath": "Mappings/Mapping38", "category": "Best Practice", - "startLine": 2162, + "startLine": 1922, "startColumn": 3, - "endLine": 2162, - "endColumn": 13, + "endLine": 1922, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping119' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping39' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping119", + "logicalId": "Mapping39", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping119", + "propertyPath": "Mappings/Mapping39", "category": "Best Practice", - "startLine": 2165, + "startLine": 1925, "startColumn": 3, - "endLine": 2165, - "endColumn": 13, + "endLine": 1925, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping120' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping40' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping120", + "logicalId": "Mapping40", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping120", + "propertyPath": "Mappings/Mapping40", "category": "Best Practice", - "startLine": 2168, + "startLine": 1928, "startColumn": 3, - "endLine": 2168, - "endColumn": 13, + "endLine": 1928, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping121' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping41' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping121", + "logicalId": "Mapping41", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping121", + "propertyPath": "Mappings/Mapping41", "category": "Best Practice", - "startLine": 2171, + "startLine": 1931, "startColumn": 3, - "endLine": 2171, - "endColumn": 13, + "endLine": 1931, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping122' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping42' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping122", + "logicalId": "Mapping42", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping122", + "propertyPath": "Mappings/Mapping42", "category": "Best Practice", - "startLine": 2174, + "startLine": 1934, "startColumn": 3, - "endLine": 2174, - "endColumn": 13, + "endLine": 1934, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping123' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping43' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping123", + "logicalId": "Mapping43", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping123", + "propertyPath": "Mappings/Mapping43", "category": "Best Practice", - "startLine": 2177, + "startLine": 1937, "startColumn": 3, - "endLine": 2177, - "endColumn": 13, + "endLine": 1937, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping124' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping44' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping124", + "logicalId": "Mapping44", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping124", + "propertyPath": "Mappings/Mapping44", "category": "Best Practice", - "startLine": 2180, + "startLine": 1940, "startColumn": 3, - "endLine": 2180, - "endColumn": 13, + "endLine": 1940, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping125' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping45' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping125", + "logicalId": "Mapping45", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping125", + "propertyPath": "Mappings/Mapping45", "category": "Best Practice", - "startLine": 2183, + "startLine": 1943, "startColumn": 3, - "endLine": 2183, - "endColumn": 13, + "endLine": 1943, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping126' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping46' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping126", + "logicalId": "Mapping46", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping126", + "propertyPath": "Mappings/Mapping46", "category": "Best Practice", - "startLine": 2186, + "startLine": 1946, "startColumn": 3, - "endLine": 2186, - "endColumn": 13, + "endLine": 1946, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping127' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping47' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping127", + "logicalId": "Mapping47", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping127", + "propertyPath": "Mappings/Mapping47", "category": "Best Practice", - "startLine": 2189, + "startLine": 1949, "startColumn": 3, - "endLine": 2189, - "endColumn": 13, + "endLine": 1949, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping128' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping48' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping128", + "logicalId": "Mapping48", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping128", + "propertyPath": "Mappings/Mapping48", "category": "Best Practice", - "startLine": 2192, + "startLine": 1952, "startColumn": 3, - "endLine": 2192, - "endColumn": 13, + "endLine": 1952, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping129' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping49' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping129", + "logicalId": "Mapping49", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping129", + "propertyPath": "Mappings/Mapping49", "category": "Best Practice", - "startLine": 2195, + "startLine": 1955, "startColumn": 3, - "endLine": 2195, - "endColumn": 13, + "endLine": 1955, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping130' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping50' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping130", + "logicalId": "Mapping50", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping130", + "propertyPath": "Mappings/Mapping50", "category": "Best Practice", - "startLine": 2198, + "startLine": 1958, "startColumn": 3, - "endLine": 2198, - "endColumn": 13, + "endLine": 1958, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping131' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping51' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping131", + "logicalId": "Mapping51", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping131", + "propertyPath": "Mappings/Mapping51", "category": "Best Practice", - "startLine": 2201, + "startLine": 1961, "startColumn": 3, - "endLine": 2201, - "endColumn": 13, + "endLine": 1961, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping132' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping52' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping132", + "logicalId": "Mapping52", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping132", + "propertyPath": "Mappings/Mapping52", "category": "Best Practice", - "startLine": 2204, + "startLine": 1964, "startColumn": 3, - "endLine": 2204, - "endColumn": 13, + "endLine": 1964, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping133' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping53' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping133", + "logicalId": "Mapping53", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping133", + "propertyPath": "Mappings/Mapping53", "category": "Best Practice", - "startLine": 2207, + "startLine": 1967, "startColumn": 3, - "endLine": 2207, - "endColumn": 13, + "endLine": 1967, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping134' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping54' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping134", + "logicalId": "Mapping54", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping134", + "propertyPath": "Mappings/Mapping54", "category": "Best Practice", - "startLine": 2210, + "startLine": 1970, "startColumn": 3, - "endLine": 2210, - "endColumn": 13, + "endLine": 1970, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping135' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping55' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping135", + "logicalId": "Mapping55", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping135", + "propertyPath": "Mappings/Mapping55", "category": "Best Practice", - "startLine": 2213, + "startLine": 1973, "startColumn": 3, - "endLine": 2213, - "endColumn": 13, + "endLine": 1973, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping136' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping56' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping136", + "logicalId": "Mapping56", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping136", + "propertyPath": "Mappings/Mapping56", "category": "Best Practice", - "startLine": 2216, + "startLine": 1976, "startColumn": 3, - "endLine": 2216, - "endColumn": 13, + "endLine": 1976, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping137' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping57' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping137", + "logicalId": "Mapping57", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping137", + "propertyPath": "Mappings/Mapping57", "category": "Best Practice", - "startLine": 2219, + "startLine": 1979, "startColumn": 3, - "endLine": 2219, - "endColumn": 13, + "endLine": 1979, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping138' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping58' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping138", + "logicalId": "Mapping58", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping138", + "propertyPath": "Mappings/Mapping58", "category": "Best Practice", - "startLine": 2222, + "startLine": 1982, "startColumn": 3, - "endLine": 2222, - "endColumn": 13, + "endLine": 1982, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping139' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping59' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping139", + "logicalId": "Mapping59", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping139", + "propertyPath": "Mappings/Mapping59", "category": "Best Practice", - "startLine": 2225, + "startLine": 1985, "startColumn": 3, - "endLine": 2225, - "endColumn": 13, + "endLine": 1985, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping140' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping60' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping140", + "logicalId": "Mapping60", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping140", + "propertyPath": "Mappings/Mapping60", "category": "Best Practice", - "startLine": 2228, + "startLine": 1988, "startColumn": 3, - "endLine": 2228, - "endColumn": 13, + "endLine": 1988, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping141' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping61' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping141", + "logicalId": "Mapping61", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping141", + "propertyPath": "Mappings/Mapping61", "category": "Best Practice", - "startLine": 2231, + "startLine": 1991, "startColumn": 3, - "endLine": 2231, - "endColumn": 13, + "endLine": 1991, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping142' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping62' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping142", + "logicalId": "Mapping62", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping142", + "propertyPath": "Mappings/Mapping62", "category": "Best Practice", - "startLine": 2234, + "startLine": 1994, "startColumn": 3, - "endLine": 2234, - "endColumn": 13, + "endLine": 1994, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping143' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping63' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping143", + "logicalId": "Mapping63", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping143", + "propertyPath": "Mappings/Mapping63", "category": "Best Practice", - "startLine": 2237, + "startLine": 1997, "startColumn": 3, - "endLine": 2237, - "endColumn": 13, + "endLine": 1997, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping144' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping64' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping144", + "logicalId": "Mapping64", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping144", + "propertyPath": "Mappings/Mapping64", "category": "Best Practice", - "startLine": 2240, + "startLine": 2000, "startColumn": 3, - "endLine": 2240, - "endColumn": 13, + "endLine": 2000, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping145' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping65' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping145", + "logicalId": "Mapping65", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping145", + "propertyPath": "Mappings/Mapping65", "category": "Best Practice", - "startLine": 2243, + "startLine": 2003, "startColumn": 3, - "endLine": 2243, - "endColumn": 13, + "endLine": 2003, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping146' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping66' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping146", + "logicalId": "Mapping66", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping146", + "propertyPath": "Mappings/Mapping66", "category": "Best Practice", - "startLine": 2246, + "startLine": 2006, "startColumn": 3, - "endLine": 2246, - "endColumn": 13, + "endLine": 2006, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping147' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping67' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping147", + "logicalId": "Mapping67", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping147", + "propertyPath": "Mappings/Mapping67", "category": "Best Practice", - "startLine": 2249, + "startLine": 2009, "startColumn": 3, - "endLine": 2249, - "endColumn": 13, + "endLine": 2009, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping148' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping68' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping148", + "logicalId": "Mapping68", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping148", + "propertyPath": "Mappings/Mapping68", "category": "Best Practice", - "startLine": 2252, + "startLine": 2012, "startColumn": 3, - "endLine": 2252, - "endColumn": 13, + "endLine": 2012, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping149' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping69' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping149", + "logicalId": "Mapping69", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping149", + "propertyPath": "Mappings/Mapping69", "category": "Best Practice", - "startLine": 2255, + "startLine": 2015, "startColumn": 3, - "endLine": 2255, - "endColumn": 13, + "endLine": 2015, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping150' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping70' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping150", + "logicalId": "Mapping70", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping150", + "propertyPath": "Mappings/Mapping70", "category": "Best Practice", - "startLine": 2258, + "startLine": 2018, "startColumn": 3, - "endLine": 2258, - "endColumn": 13, + "endLine": 2018, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping151' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping71' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping151", + "logicalId": "Mapping71", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping151", + "propertyPath": "Mappings/Mapping71", "category": "Best Practice", - "startLine": 2261, + "startLine": 2021, "startColumn": 3, - "endLine": 2261, - "endColumn": 13, + "endLine": 2021, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping152' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping72' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping152", + "logicalId": "Mapping72", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping152", + "propertyPath": "Mappings/Mapping72", "category": "Best Practice", - "startLine": 2264, + "startLine": 2024, "startColumn": 3, - "endLine": 2264, - "endColumn": 13, + "endLine": 2024, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping153' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping73' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping153", + "logicalId": "Mapping73", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping153", + "propertyPath": "Mappings/Mapping73", "category": "Best Practice", - "startLine": 2267, + "startLine": 2027, "startColumn": 3, - "endLine": 2267, - "endColumn": 13, + "endLine": 2027, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping154' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping74' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping154", + "logicalId": "Mapping74", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping154", + "propertyPath": "Mappings/Mapping74", "category": "Best Practice", - "startLine": 2270, + "startLine": 2030, "startColumn": 3, - "endLine": 2270, - "endColumn": 13, + "endLine": 2030, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping155' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping75' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping155", + "logicalId": "Mapping75", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping155", + "propertyPath": "Mappings/Mapping75", "category": "Best Practice", - "startLine": 2273, + "startLine": 2033, "startColumn": 3, - "endLine": 2273, - "endColumn": 13, + "endLine": 2033, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping156' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping76' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping156", + "logicalId": "Mapping76", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping156", + "propertyPath": "Mappings/Mapping76", "category": "Best Practice", - "startLine": 2276, + "startLine": 2036, "startColumn": 3, - "endLine": 2276, - "endColumn": 13, + "endLine": 2036, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping157' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping77' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping157", + "logicalId": "Mapping77", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping157", + "propertyPath": "Mappings/Mapping77", "category": "Best Practice", - "startLine": 2279, + "startLine": 2039, "startColumn": 3, - "endLine": 2279, - "endColumn": 13, + "endLine": 2039, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping158' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping78' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping158", + "logicalId": "Mapping78", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping158", + "propertyPath": "Mappings/Mapping78", "category": "Best Practice", - "startLine": 2282, + "startLine": 2042, "startColumn": 3, - "endLine": 2282, - "endColumn": 13, + "endLine": 2042, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping159' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping79' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping159", + "logicalId": "Mapping79", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping159", + "propertyPath": "Mappings/Mapping79", "category": "Best Practice", - "startLine": 2285, + "startLine": 2045, "startColumn": 3, - "endLine": 2285, - "endColumn": 13, + "endLine": 2045, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping160' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping80' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping160", + "logicalId": "Mapping80", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping160", + "propertyPath": "Mappings/Mapping80", "category": "Best Practice", - "startLine": 2288, + "startLine": 2048, "startColumn": 3, - "endLine": 2288, - "endColumn": 13, + "endLine": 2048, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping161' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping81' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping161", + "logicalId": "Mapping81", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping161", + "propertyPath": "Mappings/Mapping81", "category": "Best Practice", - "startLine": 2291, + "startLine": 2051, "startColumn": 3, - "endLine": 2291, - "endColumn": 13, + "endLine": 2051, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping162' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping82' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping162", + "logicalId": "Mapping82", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping162", + "propertyPath": "Mappings/Mapping82", "category": "Best Practice", - "startLine": 2294, + "startLine": 2054, "startColumn": 3, - "endLine": 2294, - "endColumn": 13, + "endLine": 2054, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping163' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping83' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping163", + "logicalId": "Mapping83", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping163", + "propertyPath": "Mappings/Mapping83", "category": "Best Practice", - "startLine": 2297, + "startLine": 2057, "startColumn": 3, - "endLine": 2297, - "endColumn": 13, + "endLine": 2057, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping164' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping84' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping164", + "logicalId": "Mapping84", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping164", + "propertyPath": "Mappings/Mapping84", "category": "Best Practice", - "startLine": 2300, + "startLine": 2060, "startColumn": 3, - "endLine": 2300, - "endColumn": 13, + "endLine": 2060, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping165' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping85' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping165", + "logicalId": "Mapping85", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping165", + "propertyPath": "Mappings/Mapping85", "category": "Best Practice", - "startLine": 2303, + "startLine": 2063, "startColumn": 3, - "endLine": 2303, - "endColumn": 13, + "endLine": 2063, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping166' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping86' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping166", + "logicalId": "Mapping86", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping166", + "propertyPath": "Mappings/Mapping86", "category": "Best Practice", - "startLine": 2306, + "startLine": 2066, "startColumn": 3, - "endLine": 2306, - "endColumn": 13, + "endLine": 2066, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping167' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping87' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping167", + "logicalId": "Mapping87", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping167", + "propertyPath": "Mappings/Mapping87", "category": "Best Practice", - "startLine": 2309, + "startLine": 2069, "startColumn": 3, - "endLine": 2309, - "endColumn": 13, + "endLine": 2069, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping168' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping88' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping168", + "logicalId": "Mapping88", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping168", + "propertyPath": "Mappings/Mapping88", "category": "Best Practice", - "startLine": 2312, + "startLine": 2072, "startColumn": 3, - "endLine": 2312, - "endColumn": 13, + "endLine": 2072, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping169' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping89' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping169", + "logicalId": "Mapping89", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping169", + "propertyPath": "Mappings/Mapping89", "category": "Best Practice", - "startLine": 2315, + "startLine": 2075, "startColumn": 3, - "endLine": 2315, - "endColumn": 13, + "endLine": 2075, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping170' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping90' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping170", + "logicalId": "Mapping90", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping170", + "propertyPath": "Mappings/Mapping90", "category": "Best Practice", - "startLine": 2318, + "startLine": 2078, "startColumn": 3, - "endLine": 2318, - "endColumn": 13, + "endLine": 2078, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping171' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping91' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping171", + "logicalId": "Mapping91", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping171", + "propertyPath": "Mappings/Mapping91", "category": "Best Practice", - "startLine": 2321, + "startLine": 2081, "startColumn": 3, - "endLine": 2321, - "endColumn": 13, + "endLine": 2081, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping172' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping92' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping172", + "logicalId": "Mapping92", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping172", + "propertyPath": "Mappings/Mapping92", "category": "Best Practice", - "startLine": 2324, + "startLine": 2084, "startColumn": 3, - "endLine": 2324, - "endColumn": 13, + "endLine": 2084, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping173' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping93' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping173", + "logicalId": "Mapping93", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping173", + "propertyPath": "Mappings/Mapping93", "category": "Best Practice", - "startLine": 2327, + "startLine": 2087, "startColumn": 3, - "endLine": 2327, - "endColumn": 13, + "endLine": 2087, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping174' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping94' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping174", + "logicalId": "Mapping94", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping174", + "propertyPath": "Mappings/Mapping94", "category": "Best Practice", - "startLine": 2330, + "startLine": 2090, "startColumn": 3, - "endLine": 2330, - "endColumn": 13, + "endLine": 2090, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping175' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping95' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping175", + "logicalId": "Mapping95", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping175", + "propertyPath": "Mappings/Mapping95", "category": "Best Practice", - "startLine": 2333, + "startLine": 2093, "startColumn": 3, - "endLine": 2333, - "endColumn": 13, + "endLine": 2093, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping176' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping96' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping176", + "logicalId": "Mapping96", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping176", + "propertyPath": "Mappings/Mapping96", "category": "Best Practice", - "startLine": 2336, + "startLine": 2096, "startColumn": 3, - "endLine": 2336, - "endColumn": 13, + "endLine": 2096, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping177' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping97' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping177", + "logicalId": "Mapping97", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping177", + "propertyPath": "Mappings/Mapping97", "category": "Best Practice", - "startLine": 2339, + "startLine": 2099, "startColumn": 3, - "endLine": 2339, - "endColumn": 13, + "endLine": 2099, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping178' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping98' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping178", + "logicalId": "Mapping98", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping178", + "propertyPath": "Mappings/Mapping98", "category": "Best Practice", - "startLine": 2342, + "startLine": 2102, "startColumn": 3, - "endLine": 2342, - "endColumn": 13, + "endLine": 2102, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping179' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping99' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping179", + "logicalId": "Mapping99", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping179", + "propertyPath": "Mappings/Mapping99", "category": "Best Practice", - "startLine": 2345, + "startLine": 2105, "startColumn": 3, - "endLine": 2345, - "endColumn": 13, + "endLine": 2105, + "endColumn": 12, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping180' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping100' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping180", + "logicalId": "Mapping100", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping180", + "propertyPath": "Mappings/Mapping100", "category": "Best Practice", - "startLine": 2348, + "startLine": 2108, "startColumn": 3, - "endLine": 2348, + "endLine": 2108, "endColumn": 13, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" @@ -15464,17 +15412,17 @@ { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping181' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping101' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping181", + "logicalId": "Mapping101", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping181", + "propertyPath": "Mappings/Mapping101", "category": "Best Practice", - "startLine": 2351, + "startLine": 2111, "startColumn": 3, - "endLine": 2351, + "endLine": 2111, "endColumn": 13, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" @@ -15482,17 +15430,17 @@ { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping182' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping102' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping182", + "logicalId": "Mapping102", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping182", + "propertyPath": "Mappings/Mapping102", "category": "Best Practice", - "startLine": 2354, + "startLine": 2114, "startColumn": 3, - "endLine": 2354, + "endLine": 2114, "endColumn": 13, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" @@ -15500,17 +15448,17 @@ { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping183' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping103' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping183", + "logicalId": "Mapping103", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping183", + "propertyPath": "Mappings/Mapping103", "category": "Best Practice", - "startLine": 2357, + "startLine": 2117, "startColumn": 3, - "endLine": 2357, + "endLine": 2117, "endColumn": 13, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" @@ -15518,17 +15466,17 @@ { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping184' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping104' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping184", + "logicalId": "Mapping104", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping184", + "propertyPath": "Mappings/Mapping104", "category": "Best Practice", - "startLine": 2360, + "startLine": 2120, "startColumn": 3, - "endLine": 2360, + "endLine": 2120, "endColumn": 13, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" @@ -15536,17 +15484,17 @@ { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping185' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping105' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping185", + "logicalId": "Mapping105", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping185", + "propertyPath": "Mappings/Mapping105", "category": "Best Practice", - "startLine": 2363, + "startLine": 2123, "startColumn": 3, - "endLine": 2363, + "endLine": 2123, "endColumn": 13, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" @@ -15554,17 +15502,17 @@ { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping186' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping106' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping186", + "logicalId": "Mapping106", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping186", + "propertyPath": "Mappings/Mapping106", "category": "Best Practice", - "startLine": 2366, + "startLine": 2126, "startColumn": 3, - "endLine": 2366, + "endLine": 2126, "endColumn": 13, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" @@ -15572,17 +15520,17 @@ { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping187' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping107' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping187", + "logicalId": "Mapping107", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping187", + "propertyPath": "Mappings/Mapping107", "category": "Best Practice", - "startLine": 2369, + "startLine": 2129, "startColumn": 3, - "endLine": 2369, + "endLine": 2129, "endColumn": 13, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" @@ -15590,17 +15538,17 @@ { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping188' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping108' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping188", + "logicalId": "Mapping108", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping188", + "propertyPath": "Mappings/Mapping108", "category": "Best Practice", - "startLine": 2372, + "startLine": 2132, "startColumn": 3, - "endLine": 2372, + "endLine": 2132, "endColumn": 13, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" @@ -15608,17 +15556,17 @@ { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping189' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping109' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping189", + "logicalId": "Mapping109", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping189", + "propertyPath": "Mappings/Mapping109", "category": "Best Practice", - "startLine": 2375, + "startLine": 2135, "startColumn": 3, - "endLine": 2375, + "endLine": 2135, "endColumn": 13, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" @@ -15626,17 +15574,17 @@ { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping190' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping110' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping190", + "logicalId": "Mapping110", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping190", + "propertyPath": "Mappings/Mapping110", "category": "Best Practice", - "startLine": 2378, + "startLine": 2138, "startColumn": 3, - "endLine": 2378, + "endLine": 2138, "endColumn": 13, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" @@ -15644,17 +15592,17 @@ { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping191' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping111' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping191", + "logicalId": "Mapping111", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping191", + "propertyPath": "Mappings/Mapping111", "category": "Best Practice", - "startLine": 2381, + "startLine": 2141, "startColumn": 3, - "endLine": 2381, + "endLine": 2141, "endColumn": 13, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" @@ -15662,17 +15610,17 @@ { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping192' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping112' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping192", + "logicalId": "Mapping112", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping192", + "propertyPath": "Mappings/Mapping112", "category": "Best Practice", - "startLine": 2384, + "startLine": 2144, "startColumn": 3, - "endLine": 2384, + "endLine": 2144, "endColumn": 13, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" @@ -15680,17 +15628,17 @@ { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping193' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping113' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping193", + "logicalId": "Mapping113", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping193", + "propertyPath": "Mappings/Mapping113", "category": "Best Practice", - "startLine": 2387, + "startLine": 2147, "startColumn": 3, - "endLine": 2387, + "endLine": 2147, "endColumn": 13, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" @@ -15698,17 +15646,17 @@ { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping194' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping114' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping194", + "logicalId": "Mapping114", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping194", + "propertyPath": "Mappings/Mapping114", "category": "Best Practice", - "startLine": 2390, + "startLine": 2150, "startColumn": 3, - "endLine": 2390, + "endLine": 2150, "endColumn": 13, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" @@ -15716,17 +15664,17 @@ { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping195' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping115' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping195", + "logicalId": "Mapping115", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping195", + "propertyPath": "Mappings/Mapping115", "category": "Best Practice", - "startLine": 2393, + "startLine": 2153, "startColumn": 3, - "endLine": 2393, + "endLine": 2153, "endColumn": 13, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" @@ -15734,17 +15682,17 @@ { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping196' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping116' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping196", + "logicalId": "Mapping116", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping196", + "propertyPath": "Mappings/Mapping116", "category": "Best Practice", - "startLine": 2396, + "startLine": 2156, "startColumn": 3, - "endLine": 2396, + "endLine": 2156, "endColumn": 13, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" @@ -15752,17 +15700,17 @@ { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping197' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping117' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping197", + "logicalId": "Mapping117", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping197", + "propertyPath": "Mappings/Mapping117", "category": "Best Practice", - "startLine": 2399, + "startLine": 2159, "startColumn": 3, - "endLine": 2399, + "endLine": 2159, "endColumn": 13, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" @@ -15770,17 +15718,17 @@ { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping198' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping118' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping198", + "logicalId": "Mapping118", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping198", + "propertyPath": "Mappings/Mapping118", "category": "Best Practice", - "startLine": 2402, + "startLine": 2162, "startColumn": 3, - "endLine": 2402, + "endLine": 2162, "endColumn": 13, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" @@ -15788,17 +15736,17 @@ { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping199' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping119' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping199", + "logicalId": "Mapping119", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping199", + "propertyPath": "Mappings/Mapping119", "category": "Best Practice", - "startLine": 2405, + "startLine": 2165, "startColumn": 3, - "endLine": 2405, + "endLine": 2165, "endColumn": 13, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" @@ -15806,17 +15754,17 @@ { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping200' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping120' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping200", + "logicalId": "Mapping120", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping200", + "propertyPath": "Mappings/Mapping120", "category": "Best Practice", - "startLine": 2408, + "startLine": 2168, "startColumn": 3, - "endLine": 2408, + "endLine": 2168, "endColumn": 13, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" @@ -15824,1837 +15772,1657 @@ { "ruleId": "W7001", "severity": "WARN", - "message": "Mapping 'Mapping201' is not referenced by any Fn::FindInMap", + "message": "Mapping 'Mapping121' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "Mapping201", + "logicalId": "Mapping121", "entityType": "Mapping" }, - "propertyPath": "Mappings/Mapping201", + "propertyPath": "Mappings/Mapping121", "category": "Best Practice", - "startLine": 2411, + "startLine": 2171, "startColumn": 3, - "endLine": 2411, + "endLine": 2171, "endColumn": 13, "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource1' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "Resource1", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 405, - "startColumn": 3, - "endLine": 405, - "endColumn": 12, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource2' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping122' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource2", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping122", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping122", "category": "Best Practice", - "startLine": 407, + "startLine": 2174, "startColumn": 3, - "endLine": 407, - "endColumn": 12, - "ruleDescription": "Resource should have Tags", + "endLine": 2174, + "endColumn": 13, + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource3' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping123' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource3", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping123", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping123", "category": "Best Practice", - "startLine": 409, + "startLine": 2177, "startColumn": 3, - "endLine": 409, - "endColumn": 12, - "ruleDescription": "Resource should have Tags", + "endLine": 2177, + "endColumn": 13, + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource4' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping124' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource4", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping124", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping124", "category": "Best Practice", - "startLine": 411, + "startLine": 2180, "startColumn": 3, - "endLine": 411, - "endColumn": 12, - "ruleDescription": "Resource should have Tags", + "endLine": 2180, + "endColumn": 13, + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource5' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping125' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource5", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping125", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping125", "category": "Best Practice", - "startLine": 413, + "startLine": 2183, "startColumn": 3, - "endLine": 413, - "endColumn": 12, - "ruleDescription": "Resource should have Tags", + "endLine": 2183, + "endColumn": 13, + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource6' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping126' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource6", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping126", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping126", "category": "Best Practice", - "startLine": 415, + "startLine": 2186, "startColumn": 3, - "endLine": 415, - "endColumn": 12, - "ruleDescription": "Resource should have Tags", + "endLine": 2186, + "endColumn": 13, + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource7' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping127' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource7", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping127", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping127", "category": "Best Practice", - "startLine": 417, + "startLine": 2189, "startColumn": 3, - "endLine": 417, - "endColumn": 12, - "ruleDescription": "Resource should have Tags", + "endLine": 2189, + "endColumn": 13, + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource8' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping128' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource8", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping128", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping128", "category": "Best Practice", - "startLine": 419, + "startLine": 2192, "startColumn": 3, - "endLine": 419, - "endColumn": 12, - "ruleDescription": "Resource should have Tags", + "endLine": 2192, + "endColumn": 13, + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource9' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping129' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource9", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping129", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping129", "category": "Best Practice", - "startLine": 421, + "startLine": 2195, "startColumn": 3, - "endLine": 421, - "endColumn": 12, - "ruleDescription": "Resource should have Tags", + "endLine": 2195, + "endColumn": 13, + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource10' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping130' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource10", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping130", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping130", "category": "Best Practice", - "startLine": 423, + "startLine": 2198, "startColumn": 3, - "endLine": 423, + "endLine": 2198, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource11' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping131' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource11", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping131", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping131", "category": "Best Practice", - "startLine": 425, + "startLine": 2201, "startColumn": 3, - "endLine": 425, + "endLine": 2201, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource12' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping132' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource12", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping132", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping132", "category": "Best Practice", - "startLine": 427, + "startLine": 2204, "startColumn": 3, - "endLine": 427, + "endLine": 2204, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource13' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping133' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource13", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping133", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping133", "category": "Best Practice", - "startLine": 429, + "startLine": 2207, "startColumn": 3, - "endLine": 429, + "endLine": 2207, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource14' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping134' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource14", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping134", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping134", "category": "Best Practice", - "startLine": 431, + "startLine": 2210, "startColumn": 3, - "endLine": 431, + "endLine": 2210, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource15' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping135' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource15", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping135", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping135", "category": "Best Practice", - "startLine": 433, + "startLine": 2213, "startColumn": 3, - "endLine": 433, + "endLine": 2213, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource16' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping136' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource16", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping136", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping136", "category": "Best Practice", - "startLine": 435, + "startLine": 2216, "startColumn": 3, - "endLine": 435, + "endLine": 2216, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource17' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping137' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource17", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping137", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping137", "category": "Best Practice", - "startLine": 437, + "startLine": 2219, "startColumn": 3, - "endLine": 437, + "endLine": 2219, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource18' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping138' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource18", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping138", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping138", "category": "Best Practice", - "startLine": 439, + "startLine": 2222, "startColumn": 3, - "endLine": 439, + "endLine": 2222, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource19' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping139' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource19", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping139", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping139", "category": "Best Practice", - "startLine": 441, + "startLine": 2225, "startColumn": 3, - "endLine": 441, + "endLine": 2225, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource20' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping140' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource20", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping140", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping140", "category": "Best Practice", - "startLine": 443, + "startLine": 2228, "startColumn": 3, - "endLine": 443, + "endLine": 2228, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource21' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping141' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource21", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping141", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping141", "category": "Best Practice", - "startLine": 445, + "startLine": 2231, "startColumn": 3, - "endLine": 445, + "endLine": 2231, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource22' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping142' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource22", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping142", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping142", "category": "Best Practice", - "startLine": 447, + "startLine": 2234, "startColumn": 3, - "endLine": 447, + "endLine": 2234, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource23' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping143' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource23", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping143", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping143", "category": "Best Practice", - "startLine": 449, + "startLine": 2237, "startColumn": 3, - "endLine": 449, + "endLine": 2237, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource24' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping144' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource24", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping144", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping144", "category": "Best Practice", - "startLine": 451, + "startLine": 2240, "startColumn": 3, - "endLine": 451, + "endLine": 2240, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource25' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping145' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource25", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping145", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping145", "category": "Best Practice", - "startLine": 453, + "startLine": 2243, "startColumn": 3, - "endLine": 453, + "endLine": 2243, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource26' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping146' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource26", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping146", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping146", "category": "Best Practice", - "startLine": 455, + "startLine": 2246, "startColumn": 3, - "endLine": 455, + "endLine": 2246, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource27' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping147' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource27", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping147", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping147", "category": "Best Practice", - "startLine": 457, + "startLine": 2249, "startColumn": 3, - "endLine": 457, + "endLine": 2249, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource28' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping148' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource28", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping148", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping148", "category": "Best Practice", - "startLine": 459, + "startLine": 2252, "startColumn": 3, - "endLine": 459, + "endLine": 2252, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource29' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping149' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource29", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping149", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping149", "category": "Best Practice", - "startLine": 461, + "startLine": 2255, "startColumn": 3, - "endLine": 461, + "endLine": 2255, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource30' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping150' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource30", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping150", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping150", "category": "Best Practice", - "startLine": 463, + "startLine": 2258, "startColumn": 3, - "endLine": 463, + "endLine": 2258, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource31' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping151' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource31", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping151", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping151", "category": "Best Practice", - "startLine": 465, + "startLine": 2261, "startColumn": 3, - "endLine": 465, + "endLine": 2261, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource32' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping152' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource32", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping152", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping152", "category": "Best Practice", - "startLine": 467, + "startLine": 2264, "startColumn": 3, - "endLine": 467, + "endLine": 2264, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource33' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping153' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource33", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping153", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping153", "category": "Best Practice", - "startLine": 469, + "startLine": 2267, "startColumn": 3, - "endLine": 469, + "endLine": 2267, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource34' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping154' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource34", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping154", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping154", "category": "Best Practice", - "startLine": 471, + "startLine": 2270, "startColumn": 3, - "endLine": 471, + "endLine": 2270, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource35' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping155' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource35", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping155", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping155", "category": "Best Practice", - "startLine": 473, + "startLine": 2273, "startColumn": 3, - "endLine": 473, + "endLine": 2273, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource36' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping156' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource36", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping156", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping156", "category": "Best Practice", - "startLine": 475, + "startLine": 2276, "startColumn": 3, - "endLine": 475, + "endLine": 2276, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource37' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping157' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource37", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping157", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping157", "category": "Best Practice", - "startLine": 477, + "startLine": 2279, "startColumn": 3, - "endLine": 477, + "endLine": 2279, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource38' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping158' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource38", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping158", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping158", "category": "Best Practice", - "startLine": 479, + "startLine": 2282, "startColumn": 3, - "endLine": 479, + "endLine": 2282, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource39' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping159' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource39", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping159", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping159", "category": "Best Practice", - "startLine": 481, + "startLine": 2285, "startColumn": 3, - "endLine": 481, + "endLine": 2285, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource40' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping160' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource40", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping160", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping160", "category": "Best Practice", - "startLine": 483, + "startLine": 2288, "startColumn": 3, - "endLine": 483, + "endLine": 2288, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource41' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping161' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource41", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping161", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping161", "category": "Best Practice", - "startLine": 485, + "startLine": 2291, "startColumn": 3, - "endLine": 485, + "endLine": 2291, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource42' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping162' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource42", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping162", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping162", "category": "Best Practice", - "startLine": 487, + "startLine": 2294, "startColumn": 3, - "endLine": 487, + "endLine": 2294, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource43' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping163' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource43", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping163", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping163", "category": "Best Practice", - "startLine": 489, + "startLine": 2297, "startColumn": 3, - "endLine": 489, + "endLine": 2297, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource44' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping164' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource44", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping164", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping164", "category": "Best Practice", - "startLine": 491, + "startLine": 2300, "startColumn": 3, - "endLine": 491, + "endLine": 2300, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource45' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping165' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource45", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping165", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping165", "category": "Best Practice", - "startLine": 493, + "startLine": 2303, "startColumn": 3, - "endLine": 493, + "endLine": 2303, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource46' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping166' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource46", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping166", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping166", "category": "Best Practice", - "startLine": 495, + "startLine": 2306, "startColumn": 3, - "endLine": 495, + "endLine": 2306, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource47' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping167' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource47", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping167", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping167", "category": "Best Practice", - "startLine": 497, + "startLine": 2309, "startColumn": 3, - "endLine": 497, + "endLine": 2309, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource48' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping168' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource48", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping168", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping168", "category": "Best Practice", - "startLine": 499, + "startLine": 2312, "startColumn": 3, - "endLine": 499, + "endLine": 2312, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource49' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping169' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource49", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping169", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping169", "category": "Best Practice", - "startLine": 501, + "startLine": 2315, "startColumn": 3, - "endLine": 501, + "endLine": 2315, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource50' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping170' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource50", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping170", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping170", "category": "Best Practice", - "startLine": 503, + "startLine": 2318, "startColumn": 3, - "endLine": 503, + "endLine": 2318, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource51' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping171' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource51", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping171", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping171", "category": "Best Practice", - "startLine": 505, + "startLine": 2321, "startColumn": 3, - "endLine": 505, + "endLine": 2321, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource52' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping172' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource52", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping172", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping172", "category": "Best Practice", - "startLine": 507, + "startLine": 2324, "startColumn": 3, - "endLine": 507, + "endLine": 2324, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource53' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping173' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource53", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping173", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping173", "category": "Best Practice", - "startLine": 509, + "startLine": 2327, "startColumn": 3, - "endLine": 509, + "endLine": 2327, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource54' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping174' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource54", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping174", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping174", "category": "Best Practice", - "startLine": 511, + "startLine": 2330, "startColumn": 3, - "endLine": 511, + "endLine": 2330, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource55' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping175' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource55", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping175", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping175", "category": "Best Practice", - "startLine": 513, + "startLine": 2333, "startColumn": 3, - "endLine": 513, + "endLine": 2333, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource56' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping176' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource56", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping176", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping176", "category": "Best Practice", - "startLine": 515, + "startLine": 2336, "startColumn": 3, - "endLine": 515, + "endLine": 2336, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource57' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping177' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource57", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping177", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping177", "category": "Best Practice", - "startLine": 517, + "startLine": 2339, "startColumn": 3, - "endLine": 517, + "endLine": 2339, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource58' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping178' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource58", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping178", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping178", "category": "Best Practice", - "startLine": 519, + "startLine": 2342, "startColumn": 3, - "endLine": 519, + "endLine": 2342, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource59' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping179' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource59", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping179", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping179", "category": "Best Practice", - "startLine": 521, + "startLine": 2345, "startColumn": 3, - "endLine": 521, + "endLine": 2345, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource60' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping180' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource60", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping180", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping180", "category": "Best Practice", - "startLine": 523, + "startLine": 2348, "startColumn": 3, - "endLine": 523, + "endLine": 2348, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource61' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping181' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource61", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping181", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping181", "category": "Best Practice", - "startLine": 525, + "startLine": 2351, "startColumn": 3, - "endLine": 525, + "endLine": 2351, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource62' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping182' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource62", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping182", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping182", "category": "Best Practice", - "startLine": 527, + "startLine": 2354, "startColumn": 3, - "endLine": 527, + "endLine": 2354, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource63' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping183' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource63", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping183", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping183", "category": "Best Practice", - "startLine": 529, + "startLine": 2357, "startColumn": 3, - "endLine": 529, + "endLine": 2357, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource64' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping184' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource64", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping184", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping184", "category": "Best Practice", - "startLine": 531, + "startLine": 2360, "startColumn": 3, - "endLine": 531, + "endLine": 2360, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource65' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping185' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource65", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping185", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping185", "category": "Best Practice", - "startLine": 533, + "startLine": 2363, "startColumn": 3, - "endLine": 533, + "endLine": 2363, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource66' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping186' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource66", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping186", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping186", "category": "Best Practice", - "startLine": 535, + "startLine": 2366, "startColumn": 3, - "endLine": 535, + "endLine": 2366, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource67' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping187' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource67", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping187", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping187", "category": "Best Practice", - "startLine": 537, + "startLine": 2369, "startColumn": 3, - "endLine": 537, + "endLine": 2369, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource68' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping188' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource68", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping188", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping188", "category": "Best Practice", - "startLine": 539, + "startLine": 2372, "startColumn": 3, - "endLine": 539, + "endLine": 2372, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource69' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping189' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource69", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping189", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping189", "category": "Best Practice", - "startLine": 541, + "startLine": 2375, "startColumn": 3, - "endLine": 541, + "endLine": 2375, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource70' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping190' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource70", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping190", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping190", "category": "Best Practice", - "startLine": 543, + "startLine": 2378, "startColumn": 3, - "endLine": 543, + "endLine": 2378, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource71' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping191' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource71", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping191", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping191", "category": "Best Practice", - "startLine": 545, + "startLine": 2381, "startColumn": 3, - "endLine": 545, + "endLine": 2381, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource72' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping192' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource72", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping192", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping192", "category": "Best Practice", - "startLine": 547, + "startLine": 2384, "startColumn": 3, - "endLine": 547, + "endLine": 2384, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource73' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping193' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource73", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping193", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping193", "category": "Best Practice", - "startLine": 549, + "startLine": 2387, "startColumn": 3, - "endLine": 549, + "endLine": 2387, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource74' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping194' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource74", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping194", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping194", "category": "Best Practice", - "startLine": 551, + "startLine": 2390, "startColumn": 3, - "endLine": 551, + "endLine": 2390, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource75' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping195' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource75", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping195", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping195", "category": "Best Practice", - "startLine": 553, + "startLine": 2393, "startColumn": 3, - "endLine": 553, + "endLine": 2393, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource76' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping196' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource76", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping196", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping196", "category": "Best Practice", - "startLine": 555, + "startLine": 2396, "startColumn": 3, - "endLine": 555, + "endLine": 2396, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource77' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping197' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource77", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping197", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping197", "category": "Best Practice", - "startLine": 557, + "startLine": 2399, "startColumn": 3, - "endLine": 557, + "endLine": 2399, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource78' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping198' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource78", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping198", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping198", "category": "Best Practice", - "startLine": 559, + "startLine": 2402, "startColumn": 3, - "endLine": 559, + "endLine": 2402, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource79' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping199' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource79", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping199", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping199", "category": "Best Practice", - "startLine": 561, + "startLine": 2405, "startColumn": 3, - "endLine": 561, + "endLine": 2405, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource80' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping200' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource80", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping200", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping200", "category": "Best Practice", - "startLine": 563, + "startLine": 2408, "startColumn": 3, - "endLine": 563, + "endLine": 2408, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Resource81' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Mapping201' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource81", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "logicalId": "Mapping201", + "entityType": "Mapping" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Mappings/Mapping201", "category": "Best Practice", - "startLine": 565, + "startLine": 2411, "startColumn": 3, - "endLine": 565, + "endLine": 2411, "endColumn": 13, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource82' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource1' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource82", + "logicalId": "Resource1", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 567, + "startLine": 405, "startColumn": 3, - "endLine": 567, - "endColumn": 13, + "endLine": 405, + "endColumn": 12, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource83' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource2' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource83", + "logicalId": "Resource2", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 569, + "startLine": 407, "startColumn": 3, - "endLine": 569, - "endColumn": 13, + "endLine": 407, + "endColumn": 12, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource84' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource3' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource84", + "logicalId": "Resource3", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 571, + "startLine": 409, "startColumn": 3, - "endLine": 571, - "endColumn": 13, + "endLine": 409, + "endColumn": 12, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource85' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource4' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource85", + "logicalId": "Resource4", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 573, + "startLine": 411, "startColumn": 3, - "endLine": 573, - "endColumn": 13, + "endLine": 411, + "endColumn": 12, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource86' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource5' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource86", + "logicalId": "Resource5", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 575, + "startLine": 413, "startColumn": 3, - "endLine": 575, - "endColumn": 13, + "endLine": 413, + "endColumn": 12, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource87' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource6' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource87", + "logicalId": "Resource6", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 577, + "startLine": 415, "startColumn": 3, - "endLine": 577, - "endColumn": 13, + "endLine": 415, + "endColumn": 12, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource88' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource7' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource88", + "logicalId": "Resource7", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 579, + "startLine": 417, "startColumn": 3, - "endLine": 579, - "endColumn": 13, + "endLine": 417, + "endColumn": 12, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource89' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource8' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource89", + "logicalId": "Resource8", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 581, + "startLine": 419, "startColumn": 3, - "endLine": 581, - "endColumn": 13, + "endLine": 419, + "endColumn": 12, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource90' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource9' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource90", + "logicalId": "Resource9", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 583, + "startLine": 421, "startColumn": 3, - "endLine": 583, - "endColumn": 13, + "endLine": 421, + "endColumn": 12, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource91' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource10' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource91", + "logicalId": "Resource10", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 585, + "startLine": 423, "startColumn": 3, - "endLine": 585, + "endLine": 423, "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -17662,19 +17430,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource92' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource11' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource92", + "logicalId": "Resource11", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 587, + "startLine": 425, "startColumn": 3, - "endLine": 587, + "endLine": 425, "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -17682,19 +17450,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource93' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource12' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource93", + "logicalId": "Resource12", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 589, + "startLine": 427, "startColumn": 3, - "endLine": 589, + "endLine": 427, "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -17702,19 +17470,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource94' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource13' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource94", + "logicalId": "Resource13", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 591, + "startLine": 429, "startColumn": 3, - "endLine": 591, + "endLine": 429, "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -17722,19 +17490,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource95' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource14' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource95", + "logicalId": "Resource14", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 593, + "startLine": 431, "startColumn": 3, - "endLine": 593, + "endLine": 431, "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -17742,19 +17510,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource96' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource15' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource96", + "logicalId": "Resource15", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 595, + "startLine": 433, "startColumn": 3, - "endLine": 595, + "endLine": 433, "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -17762,19 +17530,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource97' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource16' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource97", + "logicalId": "Resource16", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 597, + "startLine": 435, "startColumn": 3, - "endLine": 597, + "endLine": 435, "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -17782,19 +17550,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource98' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource17' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource98", + "logicalId": "Resource17", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 599, + "startLine": 437, "startColumn": 3, - "endLine": 599, + "endLine": 437, "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -17802,19 +17570,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource99' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource18' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource99", + "logicalId": "Resource18", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 601, + "startLine": 439, "startColumn": 3, - "endLine": 601, + "endLine": 439, "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -17822,1639 +17590,1639 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource100' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource19' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource100", + "logicalId": "Resource19", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 603, + "startLine": 441, "startColumn": 3, - "endLine": 603, - "endColumn": 14, + "endLine": 441, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource101' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource20' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource101", + "logicalId": "Resource20", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 605, + "startLine": 443, "startColumn": 3, - "endLine": 605, - "endColumn": 14, + "endLine": 443, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource102' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource21' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource102", + "logicalId": "Resource21", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 607, + "startLine": 445, "startColumn": 3, - "endLine": 607, - "endColumn": 14, + "endLine": 445, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource103' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource22' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource103", + "logicalId": "Resource22", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 609, + "startLine": 447, "startColumn": 3, - "endLine": 609, - "endColumn": 14, + "endLine": 447, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource104' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource23' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource104", + "logicalId": "Resource23", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 611, + "startLine": 449, "startColumn": 3, - "endLine": 611, - "endColumn": 14, + "endLine": 449, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource105' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource24' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource105", + "logicalId": "Resource24", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 613, + "startLine": 451, "startColumn": 3, - "endLine": 613, - "endColumn": 14, + "endLine": 451, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource106' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource25' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource106", + "logicalId": "Resource25", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 615, + "startLine": 453, "startColumn": 3, - "endLine": 615, - "endColumn": 14, + "endLine": 453, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource107' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource26' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource107", + "logicalId": "Resource26", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 617, + "startLine": 455, "startColumn": 3, - "endLine": 617, - "endColumn": 14, + "endLine": 455, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource108' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource27' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource108", + "logicalId": "Resource27", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 619, + "startLine": 457, "startColumn": 3, - "endLine": 619, - "endColumn": 14, + "endLine": 457, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource109' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource28' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource109", + "logicalId": "Resource28", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 621, + "startLine": 459, "startColumn": 3, - "endLine": 621, - "endColumn": 14, + "endLine": 459, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource110' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource29' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource110", + "logicalId": "Resource29", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 623, + "startLine": 461, "startColumn": 3, - "endLine": 623, - "endColumn": 14, + "endLine": 461, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource111' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource30' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource111", + "logicalId": "Resource30", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 625, + "startLine": 463, "startColumn": 3, - "endLine": 625, - "endColumn": 14, + "endLine": 463, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource112' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource31' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource112", + "logicalId": "Resource31", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 627, + "startLine": 465, "startColumn": 3, - "endLine": 627, - "endColumn": 14, + "endLine": 465, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource113' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource32' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource113", + "logicalId": "Resource32", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 629, + "startLine": 467, "startColumn": 3, - "endLine": 629, - "endColumn": 14, + "endLine": 467, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource114' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource33' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource114", + "logicalId": "Resource33", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 631, + "startLine": 469, "startColumn": 3, - "endLine": 631, - "endColumn": 14, + "endLine": 469, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource115' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource34' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource115", + "logicalId": "Resource34", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 633, + "startLine": 471, "startColumn": 3, - "endLine": 633, - "endColumn": 14, + "endLine": 471, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource116' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource35' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource116", + "logicalId": "Resource35", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 635, + "startLine": 473, "startColumn": 3, - "endLine": 635, - "endColumn": 14, + "endLine": 473, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource117' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource36' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource117", + "logicalId": "Resource36", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 637, + "startLine": 475, "startColumn": 3, - "endLine": 637, - "endColumn": 14, + "endLine": 475, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource118' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource37' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource118", + "logicalId": "Resource37", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 639, + "startLine": 477, "startColumn": 3, - "endLine": 639, - "endColumn": 14, + "endLine": 477, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource119' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource38' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource119", + "logicalId": "Resource38", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 641, + "startLine": 479, "startColumn": 3, - "endLine": 641, - "endColumn": 14, + "endLine": 479, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource120' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource39' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource120", + "logicalId": "Resource39", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 643, + "startLine": 481, "startColumn": 3, - "endLine": 643, - "endColumn": 14, + "endLine": 481, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource121' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource40' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource121", + "logicalId": "Resource40", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 645, + "startLine": 483, "startColumn": 3, - "endLine": 645, - "endColumn": 14, + "endLine": 483, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource122' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource41' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource122", + "logicalId": "Resource41", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 647, + "startLine": 485, "startColumn": 3, - "endLine": 647, - "endColumn": 14, + "endLine": 485, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource123' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource42' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource123", + "logicalId": "Resource42", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 649, + "startLine": 487, "startColumn": 3, - "endLine": 649, - "endColumn": 14, + "endLine": 487, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource124' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource43' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource124", + "logicalId": "Resource43", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 651, + "startLine": 489, "startColumn": 3, - "endLine": 651, - "endColumn": 14, + "endLine": 489, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource125' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource44' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource125", + "logicalId": "Resource44", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 653, + "startLine": 491, "startColumn": 3, - "endLine": 653, - "endColumn": 14, + "endLine": 491, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource126' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource45' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource126", + "logicalId": "Resource45", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 655, + "startLine": 493, "startColumn": 3, - "endLine": 655, - "endColumn": 14, + "endLine": 493, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource127' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource46' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource127", + "logicalId": "Resource46", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 657, + "startLine": 495, "startColumn": 3, - "endLine": 657, - "endColumn": 14, + "endLine": 495, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource128' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource47' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource128", + "logicalId": "Resource47", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 659, + "startLine": 497, "startColumn": 3, - "endLine": 659, - "endColumn": 14, + "endLine": 497, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource129' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource48' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource129", + "logicalId": "Resource48", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 661, + "startLine": 499, "startColumn": 3, - "endLine": 661, - "endColumn": 14, + "endLine": 499, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource130' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource49' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource130", + "logicalId": "Resource49", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 663, + "startLine": 501, "startColumn": 3, - "endLine": 663, - "endColumn": 14, + "endLine": 501, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource131' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource50' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource131", + "logicalId": "Resource50", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 665, + "startLine": 503, "startColumn": 3, - "endLine": 665, - "endColumn": 14, + "endLine": 503, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource132' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource51' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource132", + "logicalId": "Resource51", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 667, + "startLine": 505, "startColumn": 3, - "endLine": 667, - "endColumn": 14, + "endLine": 505, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource133' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource52' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource133", + "logicalId": "Resource52", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 669, + "startLine": 507, "startColumn": 3, - "endLine": 669, - "endColumn": 14, + "endLine": 507, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource134' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource53' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource134", + "logicalId": "Resource53", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 671, + "startLine": 509, "startColumn": 3, - "endLine": 671, - "endColumn": 14, + "endLine": 509, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource135' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource54' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource135", + "logicalId": "Resource54", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 673, + "startLine": 511, "startColumn": 3, - "endLine": 673, - "endColumn": 14, + "endLine": 511, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource136' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource55' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource136", + "logicalId": "Resource55", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 675, + "startLine": 513, "startColumn": 3, - "endLine": 675, - "endColumn": 14, + "endLine": 513, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource137' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource56' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource137", + "logicalId": "Resource56", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 677, + "startLine": 515, "startColumn": 3, - "endLine": 677, - "endColumn": 14, + "endLine": 515, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource138' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource57' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource138", + "logicalId": "Resource57", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 679, + "startLine": 517, "startColumn": 3, - "endLine": 679, - "endColumn": 14, + "endLine": 517, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource139' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource58' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource139", + "logicalId": "Resource58", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 681, + "startLine": 519, "startColumn": 3, - "endLine": 681, - "endColumn": 14, + "endLine": 519, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource140' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource59' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource140", + "logicalId": "Resource59", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 683, + "startLine": 521, "startColumn": 3, - "endLine": 683, - "endColumn": 14, + "endLine": 521, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource141' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource60' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource141", + "logicalId": "Resource60", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 685, + "startLine": 523, "startColumn": 3, - "endLine": 685, - "endColumn": 14, + "endLine": 523, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource142' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource61' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource142", + "logicalId": "Resource61", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 687, + "startLine": 525, "startColumn": 3, - "endLine": 687, - "endColumn": 14, + "endLine": 525, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource143' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource62' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource143", + "logicalId": "Resource62", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 689, + "startLine": 527, "startColumn": 3, - "endLine": 689, - "endColumn": 14, + "endLine": 527, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource144' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource63' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource144", + "logicalId": "Resource63", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 691, + "startLine": 529, "startColumn": 3, - "endLine": 691, - "endColumn": 14, + "endLine": 529, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource145' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource64' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource145", + "logicalId": "Resource64", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 693, + "startLine": 531, "startColumn": 3, - "endLine": 693, - "endColumn": 14, + "endLine": 531, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource146' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource65' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource146", + "logicalId": "Resource65", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 695, + "startLine": 533, "startColumn": 3, - "endLine": 695, - "endColumn": 14, + "endLine": 533, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource147' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource66' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource147", + "logicalId": "Resource66", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 697, + "startLine": 535, "startColumn": 3, - "endLine": 697, - "endColumn": 14, + "endLine": 535, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource148' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource67' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource148", + "logicalId": "Resource67", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 699, + "startLine": 537, "startColumn": 3, - "endLine": 699, - "endColumn": 14, + "endLine": 537, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource149' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource68' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource149", + "logicalId": "Resource68", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 701, + "startLine": 539, "startColumn": 3, - "endLine": 701, - "endColumn": 14, + "endLine": 539, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource150' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource69' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource150", + "logicalId": "Resource69", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 703, + "startLine": 541, "startColumn": 3, - "endLine": 703, - "endColumn": 14, + "endLine": 541, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource151' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource70' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource151", + "logicalId": "Resource70", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 705, + "startLine": 543, "startColumn": 3, - "endLine": 705, - "endColumn": 14, + "endLine": 543, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource152' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource71' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource152", + "logicalId": "Resource71", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 707, + "startLine": 545, "startColumn": 3, - "endLine": 707, - "endColumn": 14, + "endLine": 545, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource153' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource72' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource153", + "logicalId": "Resource72", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 709, + "startLine": 547, "startColumn": 3, - "endLine": 709, - "endColumn": 14, + "endLine": 547, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource154' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource73' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource154", + "logicalId": "Resource73", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 711, + "startLine": 549, "startColumn": 3, - "endLine": 711, - "endColumn": 14, + "endLine": 549, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource155' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource74' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource155", + "logicalId": "Resource74", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 713, + "startLine": 551, "startColumn": 3, - "endLine": 713, - "endColumn": 14, + "endLine": 551, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource156' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource75' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource156", + "logicalId": "Resource75", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 715, + "startLine": 553, "startColumn": 3, - "endLine": 715, - "endColumn": 14, + "endLine": 553, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource157' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource76' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource157", + "logicalId": "Resource76", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 717, + "startLine": 555, "startColumn": 3, - "endLine": 717, - "endColumn": 14, + "endLine": 555, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource158' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource77' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource158", + "logicalId": "Resource77", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 719, + "startLine": 557, "startColumn": 3, - "endLine": 719, - "endColumn": 14, + "endLine": 557, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource159' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource78' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource159", + "logicalId": "Resource78", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 721, + "startLine": 559, "startColumn": 3, - "endLine": 721, - "endColumn": 14, + "endLine": 559, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource160' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource79' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource160", + "logicalId": "Resource79", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 723, + "startLine": 561, "startColumn": 3, - "endLine": 723, - "endColumn": 14, + "endLine": 561, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource161' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource80' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource161", + "logicalId": "Resource80", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 725, + "startLine": 563, "startColumn": 3, - "endLine": 725, - "endColumn": 14, + "endLine": 563, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource162' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource81' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource162", + "logicalId": "Resource81", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 727, + "startLine": 565, "startColumn": 3, - "endLine": 727, - "endColumn": 14, + "endLine": 565, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource163' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource82' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource163", + "logicalId": "Resource82", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 729, + "startLine": 567, "startColumn": 3, - "endLine": 729, - "endColumn": 14, + "endLine": 567, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource164' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource83' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource164", + "logicalId": "Resource83", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 731, + "startLine": 569, "startColumn": 3, - "endLine": 731, - "endColumn": 14, + "endLine": 569, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource165' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource84' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource165", + "logicalId": "Resource84", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 733, + "startLine": 571, "startColumn": 3, - "endLine": 733, - "endColumn": 14, + "endLine": 571, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource166' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource85' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource166", + "logicalId": "Resource85", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 735, + "startLine": 573, "startColumn": 3, - "endLine": 735, - "endColumn": 14, + "endLine": 573, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource167' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource86' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource167", + "logicalId": "Resource86", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 737, + "startLine": 575, "startColumn": 3, - "endLine": 737, - "endColumn": 14, + "endLine": 575, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource168' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource87' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource168", + "logicalId": "Resource87", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 739, + "startLine": 577, "startColumn": 3, - "endLine": 739, - "endColumn": 14, + "endLine": 577, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource169' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource88' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource169", + "logicalId": "Resource88", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 741, + "startLine": 579, "startColumn": 3, - "endLine": 741, - "endColumn": 14, + "endLine": 579, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource170' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource89' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource170", + "logicalId": "Resource89", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 743, + "startLine": 581, "startColumn": 3, - "endLine": 743, - "endColumn": 14, + "endLine": 581, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource171' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource90' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource171", + "logicalId": "Resource90", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 745, + "startLine": 583, "startColumn": 3, - "endLine": 745, - "endColumn": 14, + "endLine": 583, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource172' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource91' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource172", + "logicalId": "Resource91", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 747, + "startLine": 585, "startColumn": 3, - "endLine": 747, - "endColumn": 14, + "endLine": 585, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource173' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource92' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource173", + "logicalId": "Resource92", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 749, + "startLine": 587, "startColumn": 3, - "endLine": 749, - "endColumn": 14, + "endLine": 587, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource174' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource93' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource174", + "logicalId": "Resource93", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 751, + "startLine": 589, "startColumn": 3, - "endLine": 751, - "endColumn": 14, + "endLine": 589, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource175' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource94' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource175", + "logicalId": "Resource94", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 753, + "startLine": 591, "startColumn": 3, - "endLine": 753, - "endColumn": 14, + "endLine": 591, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource176' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource95' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource176", + "logicalId": "Resource95", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 755, + "startLine": 593, "startColumn": 3, - "endLine": 755, - "endColumn": 14, + "endLine": 593, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource177' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource96' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource177", + "logicalId": "Resource96", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 757, + "startLine": 595, "startColumn": 3, - "endLine": 757, - "endColumn": 14, + "endLine": 595, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource178' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource97' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource178", + "logicalId": "Resource97", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 759, + "startLine": 597, "startColumn": 3, - "endLine": 759, - "endColumn": 14, + "endLine": 597, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource179' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource98' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource179", + "logicalId": "Resource98", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 761, + "startLine": 599, "startColumn": 3, - "endLine": 761, - "endColumn": 14, + "endLine": 599, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource180' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource99' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource180", + "logicalId": "Resource99", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 763, + "startLine": 601, "startColumn": 3, - "endLine": 763, - "endColumn": 14, + "endLine": 601, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource181' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource100' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource181", + "logicalId": "Resource100", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 765, + "startLine": 603, "startColumn": 3, - "endLine": 765, + "endLine": 603, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -19462,19 +19230,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource182' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource101' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource182", + "logicalId": "Resource101", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 767, + "startLine": 605, "startColumn": 3, - "endLine": 767, + "endLine": 605, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -19482,19 +19250,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource183' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource102' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource183", + "logicalId": "Resource102", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 769, + "startLine": 607, "startColumn": 3, - "endLine": 769, + "endLine": 607, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -19502,19 +19270,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource184' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource103' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource184", + "logicalId": "Resource103", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 771, + "startLine": 609, "startColumn": 3, - "endLine": 771, + "endLine": 609, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -19522,19 +19290,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource185' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource104' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource185", + "logicalId": "Resource104", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 773, + "startLine": 611, "startColumn": 3, - "endLine": 773, + "endLine": 611, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -19542,19 +19310,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource186' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource105' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource186", + "logicalId": "Resource105", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 775, + "startLine": 613, "startColumn": 3, - "endLine": 775, + "endLine": 613, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -19562,19 +19330,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource187' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource106' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource187", + "logicalId": "Resource106", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 777, + "startLine": 615, "startColumn": 3, - "endLine": 777, + "endLine": 615, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -19582,19 +19350,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource188' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource107' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource188", + "logicalId": "Resource107", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 779, + "startLine": 617, "startColumn": 3, - "endLine": 779, + "endLine": 617, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -19602,19 +19370,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource189' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource108' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource189", + "logicalId": "Resource108", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 781, + "startLine": 619, "startColumn": 3, - "endLine": 781, + "endLine": 619, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -19622,19 +19390,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource190' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource109' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource190", + "logicalId": "Resource109", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 783, + "startLine": 621, "startColumn": 3, - "endLine": 783, + "endLine": 621, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -19642,19 +19410,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource191' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource110' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource191", + "logicalId": "Resource110", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 785, + "startLine": 623, "startColumn": 3, - "endLine": 785, + "endLine": 623, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -19662,19 +19430,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource192' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource111' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource192", + "logicalId": "Resource111", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 787, + "startLine": 625, "startColumn": 3, - "endLine": 787, + "endLine": 625, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -19682,19 +19450,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource193' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource112' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource193", + "logicalId": "Resource112", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 789, + "startLine": 627, "startColumn": 3, - "endLine": 789, + "endLine": 627, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -19702,19 +19470,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource194' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource113' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource194", + "logicalId": "Resource113", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 791, + "startLine": 629, "startColumn": 3, - "endLine": 791, + "endLine": 629, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -19722,19 +19490,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource195' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource114' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource195", + "logicalId": "Resource114", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 793, + "startLine": 631, "startColumn": 3, - "endLine": 793, + "endLine": 631, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -19742,19 +19510,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource196' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource115' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource196", + "logicalId": "Resource115", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 795, + "startLine": 633, "startColumn": 3, - "endLine": 795, + "endLine": 633, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -19762,19 +19530,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource197' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource116' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource197", + "logicalId": "Resource116", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 797, + "startLine": 635, "startColumn": 3, - "endLine": 797, + "endLine": 635, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -19782,19 +19550,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource198' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource117' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource198", + "logicalId": "Resource117", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 799, + "startLine": 637, "startColumn": 3, - "endLine": 799, + "endLine": 637, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -19802,19 +19570,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource199' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource118' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource199", + "logicalId": "Resource118", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 801, + "startLine": 639, "startColumn": 3, - "endLine": 801, + "endLine": 639, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -19822,19 +19590,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource200' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource119' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource200", + "logicalId": "Resource119", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 803, + "startLine": 641, "startColumn": 3, - "endLine": 803, + "endLine": 641, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -19842,19 +19610,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource201' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource120' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource201", + "logicalId": "Resource120", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 805, + "startLine": 643, "startColumn": 3, - "endLine": 805, + "endLine": 643, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -19862,19 +19630,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource202' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource121' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource202", + "logicalId": "Resource121", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 807, + "startLine": 645, "startColumn": 3, - "endLine": 807, + "endLine": 645, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -19882,19 +19650,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource203' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource122' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource203", + "logicalId": "Resource122", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 809, + "startLine": 647, "startColumn": 3, - "endLine": 809, + "endLine": 647, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -19902,19 +19670,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource204' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource123' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource204", + "logicalId": "Resource123", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 811, + "startLine": 649, "startColumn": 3, - "endLine": 811, + "endLine": 649, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -19922,19 +19690,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource205' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource124' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource205", + "logicalId": "Resource124", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 813, + "startLine": 651, "startColumn": 3, - "endLine": 813, + "endLine": 651, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -19942,19 +19710,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource206' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource125' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource206", + "logicalId": "Resource125", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 815, + "startLine": 653, "startColumn": 3, - "endLine": 815, + "endLine": 653, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -19962,19 +19730,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource207' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource126' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource207", + "logicalId": "Resource126", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 817, + "startLine": 655, "startColumn": 3, - "endLine": 817, + "endLine": 655, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -19982,19 +19750,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource208' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource127' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource208", + "logicalId": "Resource127", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 819, + "startLine": 657, "startColumn": 3, - "endLine": 819, + "endLine": 657, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -20002,19 +19770,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource209' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource128' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource209", + "logicalId": "Resource128", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 821, + "startLine": 659, "startColumn": 3, - "endLine": 821, + "endLine": 659, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -20022,19 +19790,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource210' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource129' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource210", + "logicalId": "Resource129", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 823, + "startLine": 661, "startColumn": 3, - "endLine": 823, + "endLine": 661, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -20042,19 +19810,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource211' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource130' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource211", + "logicalId": "Resource130", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 825, + "startLine": 663, "startColumn": 3, - "endLine": 825, + "endLine": 663, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -20062,19 +19830,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource212' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource131' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource212", + "logicalId": "Resource131", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 827, + "startLine": 665, "startColumn": 3, - "endLine": 827, + "endLine": 665, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -20082,19 +19850,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource213' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource132' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource213", + "logicalId": "Resource132", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 829, + "startLine": 667, "startColumn": 3, - "endLine": 829, + "endLine": 667, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -20102,19 +19870,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource214' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource133' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource214", + "logicalId": "Resource133", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 831, + "startLine": 669, "startColumn": 3, - "endLine": 831, + "endLine": 669, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -20122,19 +19890,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource215' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource134' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource215", + "logicalId": "Resource134", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 833, + "startLine": 671, "startColumn": 3, - "endLine": 833, + "endLine": 671, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -20142,19 +19910,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource216' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource135' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource216", + "logicalId": "Resource135", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 835, + "startLine": 673, "startColumn": 3, - "endLine": 835, + "endLine": 673, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -20162,19 +19930,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource217' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource136' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource217", + "logicalId": "Resource136", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 837, + "startLine": 675, "startColumn": 3, - "endLine": 837, + "endLine": 675, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -20182,19 +19950,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource218' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource137' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource218", + "logicalId": "Resource137", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 839, + "startLine": 677, "startColumn": 3, - "endLine": 839, + "endLine": 677, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -20202,19 +19970,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource219' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource138' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource219", + "logicalId": "Resource138", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 841, + "startLine": 679, "startColumn": 3, - "endLine": 841, + "endLine": 679, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -20222,19 +19990,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource220' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource139' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource220", + "logicalId": "Resource139", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 843, + "startLine": 681, "startColumn": 3, - "endLine": 843, + "endLine": 681, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -20242,19 +20010,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource221' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource140' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource221", + "logicalId": "Resource140", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 845, + "startLine": 683, "startColumn": 3, - "endLine": 845, + "endLine": 683, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -20262,19 +20030,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource222' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource141' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource222", + "logicalId": "Resource141", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 847, + "startLine": 685, "startColumn": 3, - "endLine": 847, + "endLine": 685, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -20282,19 +20050,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource223' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource142' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource223", + "logicalId": "Resource142", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 849, + "startLine": 687, "startColumn": 3, - "endLine": 849, + "endLine": 687, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -20302,19 +20070,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource224' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource143' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource224", + "logicalId": "Resource143", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 851, + "startLine": 689, "startColumn": 3, - "endLine": 851, + "endLine": 689, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -20322,19 +20090,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource225' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource144' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource225", + "logicalId": "Resource144", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 853, + "startLine": 691, "startColumn": 3, - "endLine": 853, + "endLine": 691, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -20342,19 +20110,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource226' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource145' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource226", + "logicalId": "Resource145", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 855, + "startLine": 693, "startColumn": 3, - "endLine": 855, + "endLine": 693, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -20362,19 +20130,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource227' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource146' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource227", + "logicalId": "Resource146", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 857, + "startLine": 695, "startColumn": 3, - "endLine": 857, + "endLine": 695, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -20382,19 +20150,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource228' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource147' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource228", + "logicalId": "Resource147", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 859, + "startLine": 697, "startColumn": 3, - "endLine": 859, + "endLine": 697, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -20402,19 +20170,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource229' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource148' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource229", + "logicalId": "Resource148", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 861, + "startLine": 699, "startColumn": 3, - "endLine": 861, + "endLine": 699, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -20422,19 +20190,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource230' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource149' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource230", + "logicalId": "Resource149", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 863, + "startLine": 701, "startColumn": 3, - "endLine": 863, + "endLine": 701, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -20442,19 +20210,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource231' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource150' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource231", + "logicalId": "Resource150", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 865, + "startLine": 703, "startColumn": 3, - "endLine": 865, + "endLine": 703, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -20462,19 +20230,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource232' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource151' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource232", + "logicalId": "Resource151", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 867, + "startLine": 705, "startColumn": 3, - "endLine": 867, + "endLine": 705, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -20482,19 +20250,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource233' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource152' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource233", + "logicalId": "Resource152", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 869, + "startLine": 707, "startColumn": 3, - "endLine": 869, + "endLine": 707, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -20502,19 +20270,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource234' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource153' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource234", + "logicalId": "Resource153", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 871, + "startLine": 709, "startColumn": 3, - "endLine": 871, + "endLine": 709, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -20522,19 +20290,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource235' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource154' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource235", + "logicalId": "Resource154", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 873, + "startLine": 711, "startColumn": 3, - "endLine": 873, + "endLine": 711, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -20542,19 +20310,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource236' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource155' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource236", + "logicalId": "Resource155", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 875, + "startLine": 713, "startColumn": 3, - "endLine": 875, + "endLine": 713, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -20562,19 +20330,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource237' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource156' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource237", + "logicalId": "Resource156", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 877, + "startLine": 715, "startColumn": 3, - "endLine": 877, + "endLine": 715, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -20582,19 +20350,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource238' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource157' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource238", + "logicalId": "Resource157", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 879, + "startLine": 717, "startColumn": 3, - "endLine": 879, + "endLine": 717, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -20602,19 +20370,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource239' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource158' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource239", + "logicalId": "Resource158", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 881, + "startLine": 719, "startColumn": 3, - "endLine": 881, + "endLine": 719, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -20622,19 +20390,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource240' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource159' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource240", + "logicalId": "Resource159", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 883, + "startLine": 721, "startColumn": 3, - "endLine": 883, + "endLine": 721, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -20642,19 +20410,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource241' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource160' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource241", + "logicalId": "Resource160", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 885, + "startLine": 723, "startColumn": 3, - "endLine": 885, + "endLine": 723, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -20662,19 +20430,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource242' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource161' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource242", + "logicalId": "Resource161", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 887, + "startLine": 725, "startColumn": 3, - "endLine": 887, + "endLine": 725, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -20682,19 +20450,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource243' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource162' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource243", + "logicalId": "Resource162", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 889, + "startLine": 727, "startColumn": 3, - "endLine": 889, + "endLine": 727, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -20702,19 +20470,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource244' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource163' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource244", + "logicalId": "Resource163", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 891, + "startLine": 729, "startColumn": 3, - "endLine": 891, + "endLine": 729, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -20722,19 +20490,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource245' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource164' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource245", + "logicalId": "Resource164", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 893, + "startLine": 731, "startColumn": 3, - "endLine": 893, + "endLine": 731, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -20742,19 +20510,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource246' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource165' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource246", + "logicalId": "Resource165", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 895, + "startLine": 733, "startColumn": 3, - "endLine": 895, + "endLine": 733, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -20762,19 +20530,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource247' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource166' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource247", + "logicalId": "Resource166", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 897, + "startLine": 735, "startColumn": 3, - "endLine": 897, + "endLine": 735, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -20782,19 +20550,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource248' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource167' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource248", + "logicalId": "Resource167", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 899, + "startLine": 737, "startColumn": 3, - "endLine": 899, + "endLine": 737, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -20802,19 +20570,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource249' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource168' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource249", + "logicalId": "Resource168", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 901, + "startLine": 739, "startColumn": 3, - "endLine": 901, + "endLine": 739, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -20822,19 +20590,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource250' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource169' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource250", + "logicalId": "Resource169", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 903, + "startLine": 741, "startColumn": 3, - "endLine": 903, + "endLine": 741, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -20842,19 +20610,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource251' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource170' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource251", + "logicalId": "Resource170", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 905, + "startLine": 743, "startColumn": 3, - "endLine": 905, + "endLine": 743, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -20862,19 +20630,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource252' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource171' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource252", + "logicalId": "Resource171", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 907, + "startLine": 745, "startColumn": 3, - "endLine": 907, + "endLine": 745, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -20882,19 +20650,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource253' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource172' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource253", + "logicalId": "Resource172", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 909, + "startLine": 747, "startColumn": 3, - "endLine": 909, + "endLine": 747, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -20902,19 +20670,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource254' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource173' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource254", + "logicalId": "Resource173", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 911, + "startLine": 749, "startColumn": 3, - "endLine": 911, + "endLine": 749, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -20922,19 +20690,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource255' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource174' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource255", + "logicalId": "Resource174", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 913, + "startLine": 751, "startColumn": 3, - "endLine": 913, + "endLine": 751, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -20942,19 +20710,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource256' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource175' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource256", + "logicalId": "Resource175", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 915, + "startLine": 753, "startColumn": 3, - "endLine": 915, + "endLine": 753, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -20962,19 +20730,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource257' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource176' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource257", + "logicalId": "Resource176", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 917, + "startLine": 755, "startColumn": 3, - "endLine": 917, + "endLine": 755, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -20982,19 +20750,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource258' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource177' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource258", + "logicalId": "Resource177", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 919, + "startLine": 757, "startColumn": 3, - "endLine": 919, + "endLine": 757, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -21002,19 +20770,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource259' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource178' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource259", + "logicalId": "Resource178", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 921, + "startLine": 759, "startColumn": 3, - "endLine": 921, + "endLine": 759, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -21022,19 +20790,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource260' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource179' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource260", + "logicalId": "Resource179", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 923, + "startLine": 761, "startColumn": 3, - "endLine": 923, + "endLine": 761, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -21042,19 +20810,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource261' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource180' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource261", + "logicalId": "Resource180", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 925, + "startLine": 763, "startColumn": 3, - "endLine": 925, + "endLine": 763, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -21062,19 +20830,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource262' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource181' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource262", + "logicalId": "Resource181", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 927, + "startLine": 765, "startColumn": 3, - "endLine": 927, + "endLine": 765, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -21082,19 +20850,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource263' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource182' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource263", + "logicalId": "Resource182", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 929, + "startLine": 767, "startColumn": 3, - "endLine": 929, + "endLine": 767, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -21102,19 +20870,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource264' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource183' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource264", + "logicalId": "Resource183", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 931, + "startLine": 769, "startColumn": 3, - "endLine": 931, + "endLine": 769, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -21122,19 +20890,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource265' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource184' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource265", + "logicalId": "Resource184", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 933, + "startLine": 771, "startColumn": 3, - "endLine": 933, + "endLine": 771, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -21142,19 +20910,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource266' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource185' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource266", + "logicalId": "Resource185", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 935, + "startLine": 773, "startColumn": 3, - "endLine": 935, + "endLine": 773, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -21162,19 +20930,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource267' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource186' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource267", + "logicalId": "Resource186", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 937, + "startLine": 775, "startColumn": 3, - "endLine": 937, + "endLine": 775, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -21182,19 +20950,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource268' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource187' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource268", + "logicalId": "Resource187", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 939, + "startLine": 777, "startColumn": 3, - "endLine": 939, + "endLine": 777, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -21202,19 +20970,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource269' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource188' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource269", + "logicalId": "Resource188", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 941, + "startLine": 779, "startColumn": 3, - "endLine": 941, + "endLine": 779, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -21222,19 +20990,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource270' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource189' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource270", + "logicalId": "Resource189", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 943, + "startLine": 781, "startColumn": 3, - "endLine": 943, + "endLine": 781, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -21242,19 +21010,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource271' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource190' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource271", + "logicalId": "Resource190", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 945, + "startLine": 783, "startColumn": 3, - "endLine": 945, + "endLine": 783, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -21262,19 +21030,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource272' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource191' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource272", + "logicalId": "Resource191", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 947, + "startLine": 785, "startColumn": 3, - "endLine": 947, + "endLine": 785, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -21282,19 +21050,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource273' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource192' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource273", + "logicalId": "Resource192", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 949, + "startLine": 787, "startColumn": 3, - "endLine": 949, + "endLine": 787, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -21302,19 +21070,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource274' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource193' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource274", + "logicalId": "Resource193", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 951, + "startLine": 789, "startColumn": 3, - "endLine": 951, + "endLine": 789, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -21322,19 +21090,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource275' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource194' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource275", + "logicalId": "Resource194", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 953, + "startLine": 791, "startColumn": 3, - "endLine": 953, + "endLine": 791, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -21342,19 +21110,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource276' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource195' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource276", + "logicalId": "Resource195", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 955, + "startLine": 793, "startColumn": 3, - "endLine": 955, + "endLine": 793, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -21362,19 +21130,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource277' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource196' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource277", + "logicalId": "Resource196", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 957, + "startLine": 795, "startColumn": 3, - "endLine": 957, + "endLine": 795, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -21382,19 +21150,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource278' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource197' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource278", + "logicalId": "Resource197", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 959, + "startLine": 797, "startColumn": 3, - "endLine": 959, + "endLine": 797, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -21402,19 +21170,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource279' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource198' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource279", + "logicalId": "Resource198", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 961, + "startLine": 799, "startColumn": 3, - "endLine": 961, + "endLine": 799, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -21422,19 +21190,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource280' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource199' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource280", + "logicalId": "Resource199", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 963, + "startLine": 801, "startColumn": 3, - "endLine": 963, + "endLine": 801, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -21442,19 +21210,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource281' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource200' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource281", + "logicalId": "Resource200", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 965, + "startLine": 803, "startColumn": 3, - "endLine": 965, + "endLine": 803, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -21462,19 +21230,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource282' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource201' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource282", + "logicalId": "Resource201", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 967, + "startLine": 805, "startColumn": 3, - "endLine": 967, + "endLine": 805, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -21482,19 +21250,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource283' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource202' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource283", + "logicalId": "Resource202", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 969, + "startLine": 807, "startColumn": 3, - "endLine": 969, + "endLine": 807, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -21502,19 +21270,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource284' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource203' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource284", + "logicalId": "Resource203", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 971, + "startLine": 809, "startColumn": 3, - "endLine": 971, + "endLine": 809, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -21522,19 +21290,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource285' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource204' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource285", + "logicalId": "Resource204", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 973, + "startLine": 811, "startColumn": 3, - "endLine": 973, + "endLine": 811, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -21542,19 +21310,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource286' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource205' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource286", + "logicalId": "Resource205", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 975, + "startLine": 813, "startColumn": 3, - "endLine": 975, + "endLine": 813, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -21562,19 +21330,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource287' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource206' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource287", + "logicalId": "Resource206", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 977, + "startLine": 815, "startColumn": 3, - "endLine": 977, + "endLine": 815, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -21582,19 +21350,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource288' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource207' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource288", + "logicalId": "Resource207", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 979, + "startLine": 817, "startColumn": 3, - "endLine": 979, + "endLine": 817, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -21602,19 +21370,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource289' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource208' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource289", + "logicalId": "Resource208", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 981, + "startLine": 819, "startColumn": 3, - "endLine": 981, + "endLine": 819, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -21622,19 +21390,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource290' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource209' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource290", + "logicalId": "Resource209", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 983, + "startLine": 821, "startColumn": 3, - "endLine": 983, + "endLine": 821, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -21642,19 +21410,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource291' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource210' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource291", + "logicalId": "Resource210", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 985, + "startLine": 823, "startColumn": 3, - "endLine": 985, + "endLine": 823, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -21662,19 +21430,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource292' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource211' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource292", + "logicalId": "Resource211", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 987, + "startLine": 825, "startColumn": 3, - "endLine": 987, + "endLine": 825, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -21682,19 +21450,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource293' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource212' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource293", + "logicalId": "Resource212", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 989, + "startLine": 827, "startColumn": 3, - "endLine": 989, + "endLine": 827, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -21702,19 +21470,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource294' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource213' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource294", + "logicalId": "Resource213", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 991, + "startLine": 829, "startColumn": 3, - "endLine": 991, + "endLine": 829, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -21722,19 +21490,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource295' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource214' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource295", + "logicalId": "Resource214", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 993, + "startLine": 831, "startColumn": 3, - "endLine": 993, + "endLine": 831, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -21742,19 +21510,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource296' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource215' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource296", + "logicalId": "Resource215", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 995, + "startLine": 833, "startColumn": 3, - "endLine": 995, + "endLine": 833, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -21762,19 +21530,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource297' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource216' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource297", + "logicalId": "Resource216", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 997, + "startLine": 835, "startColumn": 3, - "endLine": 997, + "endLine": 835, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -21782,19 +21550,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource298' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource217' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource298", + "logicalId": "Resource217", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 999, + "startLine": 837, "startColumn": 3, - "endLine": 999, + "endLine": 837, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -21802,19 +21570,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource299' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource218' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource299", + "logicalId": "Resource218", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1001, + "startLine": 839, "startColumn": 3, - "endLine": 1001, + "endLine": 839, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -21822,19 +21590,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource300' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource219' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource300", + "logicalId": "Resource219", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1003, + "startLine": 841, "startColumn": 3, - "endLine": 1003, + "endLine": 841, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -21842,19 +21610,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource301' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource220' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource301", + "logicalId": "Resource220", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1005, + "startLine": 843, "startColumn": 3, - "endLine": 1005, + "endLine": 843, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -21862,19 +21630,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource302' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource221' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource302", + "logicalId": "Resource221", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1007, + "startLine": 845, "startColumn": 3, - "endLine": 1007, + "endLine": 845, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -21882,19 +21650,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource303' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource222' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource303", + "logicalId": "Resource222", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1009, + "startLine": 847, "startColumn": 3, - "endLine": 1009, + "endLine": 847, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -21902,19 +21670,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource304' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource223' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource304", + "logicalId": "Resource223", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1011, + "startLine": 849, "startColumn": 3, - "endLine": 1011, + "endLine": 849, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -21922,19 +21690,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource305' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource224' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource305", + "logicalId": "Resource224", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1013, + "startLine": 851, "startColumn": 3, - "endLine": 1013, + "endLine": 851, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -21942,19 +21710,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource306' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource225' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource306", + "logicalId": "Resource225", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1015, + "startLine": 853, "startColumn": 3, - "endLine": 1015, + "endLine": 853, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -21962,19 +21730,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource307' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource226' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource307", + "logicalId": "Resource226", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1017, + "startLine": 855, "startColumn": 3, - "endLine": 1017, + "endLine": 855, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -21982,19 +21750,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource308' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource227' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource308", + "logicalId": "Resource227", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1019, + "startLine": 857, "startColumn": 3, - "endLine": 1019, + "endLine": 857, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -22002,19 +21770,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource309' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource228' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource309", + "logicalId": "Resource228", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1021, + "startLine": 859, "startColumn": 3, - "endLine": 1021, + "endLine": 859, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -22022,19 +21790,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource310' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource229' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource310", + "logicalId": "Resource229", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1023, + "startLine": 861, "startColumn": 3, - "endLine": 1023, + "endLine": 861, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -22042,19 +21810,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource311' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource230' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource311", + "logicalId": "Resource230", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1025, + "startLine": 863, "startColumn": 3, - "endLine": 1025, + "endLine": 863, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -22062,19 +21830,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource312' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource231' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource312", + "logicalId": "Resource231", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1027, + "startLine": 865, "startColumn": 3, - "endLine": 1027, + "endLine": 865, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -22082,19 +21850,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource313' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource232' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource313", + "logicalId": "Resource232", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1029, + "startLine": 867, "startColumn": 3, - "endLine": 1029, + "endLine": 867, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -22102,19 +21870,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource314' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource233' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource314", + "logicalId": "Resource233", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1031, + "startLine": 869, "startColumn": 3, - "endLine": 1031, + "endLine": 869, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -22122,19 +21890,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource315' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource234' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource315", + "logicalId": "Resource234", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1033, + "startLine": 871, "startColumn": 3, - "endLine": 1033, + "endLine": 871, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -22142,19 +21910,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource316' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource235' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource316", + "logicalId": "Resource235", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1035, + "startLine": 873, "startColumn": 3, - "endLine": 1035, + "endLine": 873, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -22162,19 +21930,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource317' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource236' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource317", + "logicalId": "Resource236", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1037, + "startLine": 875, "startColumn": 3, - "endLine": 1037, + "endLine": 875, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -22182,19 +21950,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource318' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource237' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource318", + "logicalId": "Resource237", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1039, + "startLine": 877, "startColumn": 3, - "endLine": 1039, + "endLine": 877, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -22202,19 +21970,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource319' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource238' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource319", + "logicalId": "Resource238", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1041, + "startLine": 879, "startColumn": 3, - "endLine": 1041, + "endLine": 879, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -22222,19 +21990,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource320' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource239' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource320", + "logicalId": "Resource239", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1043, + "startLine": 881, "startColumn": 3, - "endLine": 1043, + "endLine": 881, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -22242,19 +22010,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource321' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource240' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource321", + "logicalId": "Resource240", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1045, + "startLine": 883, "startColumn": 3, - "endLine": 1045, + "endLine": 883, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -22262,19 +22030,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource322' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource241' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource322", + "logicalId": "Resource241", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1047, + "startLine": 885, "startColumn": 3, - "endLine": 1047, + "endLine": 885, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -22282,19 +22050,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource323' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource242' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource323", + "logicalId": "Resource242", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1049, + "startLine": 887, "startColumn": 3, - "endLine": 1049, + "endLine": 887, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -22302,19 +22070,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource324' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource243' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource324", + "logicalId": "Resource243", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1051, + "startLine": 889, "startColumn": 3, - "endLine": 1051, + "endLine": 889, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -22322,19 +22090,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource325' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource244' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource325", + "logicalId": "Resource244", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1053, + "startLine": 891, "startColumn": 3, - "endLine": 1053, + "endLine": 891, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -22342,19 +22110,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource326' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource245' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource326", + "logicalId": "Resource245", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1055, + "startLine": 893, "startColumn": 3, - "endLine": 1055, + "endLine": 893, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -22362,19 +22130,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource327' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource246' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource327", + "logicalId": "Resource246", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1057, + "startLine": 895, "startColumn": 3, - "endLine": 1057, + "endLine": 895, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -22382,19 +22150,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource328' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource247' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource328", + "logicalId": "Resource247", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1059, + "startLine": 897, "startColumn": 3, - "endLine": 1059, + "endLine": 897, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -22402,19 +22170,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource329' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource248' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource329", + "logicalId": "Resource248", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1061, + "startLine": 899, "startColumn": 3, - "endLine": 1061, + "endLine": 899, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -22422,19 +22190,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource330' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource249' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource330", + "logicalId": "Resource249", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1063, + "startLine": 901, "startColumn": 3, - "endLine": 1063, + "endLine": 901, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -22442,19 +22210,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource331' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource250' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource331", + "logicalId": "Resource250", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1065, + "startLine": 903, "startColumn": 3, - "endLine": 1065, + "endLine": 903, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -22462,19 +22230,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource332' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource251' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource332", + "logicalId": "Resource251", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1067, + "startLine": 905, "startColumn": 3, - "endLine": 1067, + "endLine": 905, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -22482,19 +22250,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource333' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource252' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource333", + "logicalId": "Resource252", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1069, + "startLine": 907, "startColumn": 3, - "endLine": 1069, + "endLine": 907, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -22502,19 +22270,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource334' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource253' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource334", + "logicalId": "Resource253", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1071, + "startLine": 909, "startColumn": 3, - "endLine": 1071, + "endLine": 909, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -22522,19 +22290,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource335' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource254' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource335", + "logicalId": "Resource254", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1073, + "startLine": 911, "startColumn": 3, - "endLine": 1073, + "endLine": 911, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -22542,19 +22310,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource336' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource255' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource336", + "logicalId": "Resource255", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1075, + "startLine": 913, "startColumn": 3, - "endLine": 1075, + "endLine": 913, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -22562,19 +22330,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource337' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource256' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource337", + "logicalId": "Resource256", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1077, + "startLine": 915, "startColumn": 3, - "endLine": 1077, + "endLine": 915, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -22582,19 +22350,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource338' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource257' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource338", + "logicalId": "Resource257", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1079, + "startLine": 917, "startColumn": 3, - "endLine": 1079, + "endLine": 917, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -22602,19 +22370,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource339' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource258' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource339", + "logicalId": "Resource258", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1081, + "startLine": 919, "startColumn": 3, - "endLine": 1081, + "endLine": 919, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -22622,19 +22390,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource340' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource259' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource340", + "logicalId": "Resource259", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1083, + "startLine": 921, "startColumn": 3, - "endLine": 1083, + "endLine": 921, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -22642,19 +22410,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource341' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource260' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource341", + "logicalId": "Resource260", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1085, + "startLine": 923, "startColumn": 3, - "endLine": 1085, + "endLine": 923, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -22662,19 +22430,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource342' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource261' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource342", + "logicalId": "Resource261", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1087, + "startLine": 925, "startColumn": 3, - "endLine": 1087, + "endLine": 925, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -22682,19 +22450,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource343' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource262' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource343", + "logicalId": "Resource262", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1089, + "startLine": 927, "startColumn": 3, - "endLine": 1089, + "endLine": 927, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -22702,19 +22470,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource344' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource263' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource344", + "logicalId": "Resource263", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1091, + "startLine": 929, "startColumn": 3, - "endLine": 1091, + "endLine": 929, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -22722,19 +22490,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource345' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource264' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource345", + "logicalId": "Resource264", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1093, + "startLine": 931, "startColumn": 3, - "endLine": 1093, + "endLine": 931, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -22742,19 +22510,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource346' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource265' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource346", + "logicalId": "Resource265", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1095, + "startLine": 933, "startColumn": 3, - "endLine": 1095, + "endLine": 933, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -22762,19 +22530,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource347' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource266' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource347", + "logicalId": "Resource266", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1097, + "startLine": 935, "startColumn": 3, - "endLine": 1097, + "endLine": 935, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -22782,19 +22550,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource348' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource267' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource348", + "logicalId": "Resource267", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1099, + "startLine": 937, "startColumn": 3, - "endLine": 1099, + "endLine": 937, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -22802,19 +22570,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource349' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource268' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource349", + "logicalId": "Resource268", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1101, + "startLine": 939, "startColumn": 3, - "endLine": 1101, + "endLine": 939, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -22822,19 +22590,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource350' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource269' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource350", + "logicalId": "Resource269", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1103, + "startLine": 941, "startColumn": 3, - "endLine": 1103, + "endLine": 941, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -22842,19 +22610,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource351' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource270' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource351", + "logicalId": "Resource270", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1105, + "startLine": 943, "startColumn": 3, - "endLine": 1105, + "endLine": 943, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -22862,19 +22630,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource352' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource271' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource352", + "logicalId": "Resource271", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1107, + "startLine": 945, "startColumn": 3, - "endLine": 1107, + "endLine": 945, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -22882,19 +22650,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource353' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource272' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource353", + "logicalId": "Resource272", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1109, + "startLine": 947, "startColumn": 3, - "endLine": 1109, + "endLine": 947, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -22902,19 +22670,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource354' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource273' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource354", + "logicalId": "Resource273", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1111, + "startLine": 949, "startColumn": 3, - "endLine": 1111, + "endLine": 949, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -22922,19 +22690,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource355' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource274' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource355", + "logicalId": "Resource274", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1113, + "startLine": 951, "startColumn": 3, - "endLine": 1113, + "endLine": 951, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -22942,19 +22710,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource356' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource275' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource356", + "logicalId": "Resource275", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1115, + "startLine": 953, "startColumn": 3, - "endLine": 1115, + "endLine": 953, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -22962,19 +22730,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource357' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource276' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource357", + "logicalId": "Resource276", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1117, + "startLine": 955, "startColumn": 3, - "endLine": 1117, + "endLine": 955, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -22982,19 +22750,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource358' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource277' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource358", + "logicalId": "Resource277", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1119, + "startLine": 957, "startColumn": 3, - "endLine": 1119, + "endLine": 957, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -23002,19 +22770,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource359' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource278' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource359", + "logicalId": "Resource278", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1121, + "startLine": 959, "startColumn": 3, - "endLine": 1121, + "endLine": 959, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -23022,19 +22790,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource360' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource279' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource360", + "logicalId": "Resource279", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1123, + "startLine": 961, "startColumn": 3, - "endLine": 1123, + "endLine": 961, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -23042,19 +22810,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource361' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource280' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource361", + "logicalId": "Resource280", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1125, + "startLine": 963, "startColumn": 3, - "endLine": 1125, + "endLine": 963, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -23062,19 +22830,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource362' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource281' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource362", + "logicalId": "Resource281", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1127, + "startLine": 965, "startColumn": 3, - "endLine": 1127, + "endLine": 965, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -23082,19 +22850,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource363' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource282' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource363", + "logicalId": "Resource282", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1129, + "startLine": 967, "startColumn": 3, - "endLine": 1129, + "endLine": 967, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -23102,19 +22870,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource364' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource283' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource364", + "logicalId": "Resource283", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1131, + "startLine": 969, "startColumn": 3, - "endLine": 1131, + "endLine": 969, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -23122,19 +22890,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource365' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource284' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource365", + "logicalId": "Resource284", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1133, + "startLine": 971, "startColumn": 3, - "endLine": 1133, + "endLine": 971, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -23142,19 +22910,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource366' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource285' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource366", + "logicalId": "Resource285", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1135, + "startLine": 973, "startColumn": 3, - "endLine": 1135, + "endLine": 973, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -23162,19 +22930,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource367' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource286' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource367", + "logicalId": "Resource286", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1137, + "startLine": 975, "startColumn": 3, - "endLine": 1137, + "endLine": 975, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -23182,19 +22950,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource368' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource287' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource368", + "logicalId": "Resource287", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1139, + "startLine": 977, "startColumn": 3, - "endLine": 1139, + "endLine": 977, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -23202,19 +22970,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource369' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource288' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource369", + "logicalId": "Resource288", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1141, + "startLine": 979, "startColumn": 3, - "endLine": 1141, + "endLine": 979, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -23222,19 +22990,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource370' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource289' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource370", + "logicalId": "Resource289", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1143, + "startLine": 981, "startColumn": 3, - "endLine": 1143, + "endLine": 981, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -23242,19 +23010,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource371' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource290' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource371", + "logicalId": "Resource290", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1145, + "startLine": 983, "startColumn": 3, - "endLine": 1145, + "endLine": 983, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -23262,19 +23030,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource372' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource291' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource372", + "logicalId": "Resource291", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1147, + "startLine": 985, "startColumn": 3, - "endLine": 1147, + "endLine": 985, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -23282,19 +23050,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource373' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource292' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource373", + "logicalId": "Resource292", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1149, + "startLine": 987, "startColumn": 3, - "endLine": 1149, + "endLine": 987, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -23302,19 +23070,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource374' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource293' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource374", + "logicalId": "Resource293", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1151, + "startLine": 989, "startColumn": 3, - "endLine": 1151, + "endLine": 989, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -23322,19 +23090,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource375' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource294' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource375", + "logicalId": "Resource294", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1153, + "startLine": 991, "startColumn": 3, - "endLine": 1153, + "endLine": 991, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -23342,19 +23110,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource376' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource295' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource376", + "logicalId": "Resource295", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1155, + "startLine": 993, "startColumn": 3, - "endLine": 1155, + "endLine": 993, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -23362,19 +23130,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource377' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource296' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource377", + "logicalId": "Resource296", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1157, + "startLine": 995, "startColumn": 3, - "endLine": 1157, + "endLine": 995, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -23382,19 +23150,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource378' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource297' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource378", + "logicalId": "Resource297", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1159, + "startLine": 997, "startColumn": 3, - "endLine": 1159, + "endLine": 997, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -23402,19 +23170,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource379' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource298' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource379", + "logicalId": "Resource298", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1161, + "startLine": 999, "startColumn": 3, - "endLine": 1161, + "endLine": 999, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -23422,19 +23190,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource380' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource299' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource380", + "logicalId": "Resource299", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1163, + "startLine": 1001, "startColumn": 3, - "endLine": 1163, + "endLine": 1001, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -23442,19 +23210,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource381' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource300' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource381", + "logicalId": "Resource300", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1165, + "startLine": 1003, "startColumn": 3, - "endLine": 1165, + "endLine": 1003, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -23462,19 +23230,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource382' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource301' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource382", + "logicalId": "Resource301", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1167, + "startLine": 1005, "startColumn": 3, - "endLine": 1167, + "endLine": 1005, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -23482,19 +23250,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource383' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource302' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource383", + "logicalId": "Resource302", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1169, + "startLine": 1007, "startColumn": 3, - "endLine": 1169, + "endLine": 1007, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -23502,19 +23270,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource384' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource303' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource384", + "logicalId": "Resource303", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1171, + "startLine": 1009, "startColumn": 3, - "endLine": 1171, + "endLine": 1009, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -23522,19 +23290,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource385' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource304' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource385", + "logicalId": "Resource304", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1173, + "startLine": 1011, "startColumn": 3, - "endLine": 1173, + "endLine": 1011, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -23542,19 +23310,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource386' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource305' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource386", + "logicalId": "Resource305", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1175, + "startLine": 1013, "startColumn": 3, - "endLine": 1175, + "endLine": 1013, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -23562,19 +23330,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource387' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource306' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource387", + "logicalId": "Resource306", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1177, + "startLine": 1015, "startColumn": 3, - "endLine": 1177, + "endLine": 1015, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -23582,19 +23350,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource388' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource307' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource388", + "logicalId": "Resource307", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1179, + "startLine": 1017, "startColumn": 3, - "endLine": 1179, + "endLine": 1017, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -23602,19 +23370,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource389' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource308' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource389", + "logicalId": "Resource308", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1181, + "startLine": 1019, "startColumn": 3, - "endLine": 1181, + "endLine": 1019, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -23622,19 +23390,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource390' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource309' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource390", + "logicalId": "Resource309", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1183, + "startLine": 1021, "startColumn": 3, - "endLine": 1183, + "endLine": 1021, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -23642,19 +23410,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource391' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource310' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource391", + "logicalId": "Resource310", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1185, + "startLine": 1023, "startColumn": 3, - "endLine": 1185, + "endLine": 1023, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -23662,19 +23430,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource392' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource311' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource392", + "logicalId": "Resource311", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1187, + "startLine": 1025, "startColumn": 3, - "endLine": 1187, + "endLine": 1025, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -23682,19 +23450,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource393' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource312' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource393", + "logicalId": "Resource312", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1189, + "startLine": 1027, "startColumn": 3, - "endLine": 1189, + "endLine": 1027, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -23702,19 +23470,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource394' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource313' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource394", + "logicalId": "Resource313", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1191, + "startLine": 1029, "startColumn": 3, - "endLine": 1191, + "endLine": 1029, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -23722,19 +23490,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource395' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource314' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource395", + "logicalId": "Resource314", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1193, + "startLine": 1031, "startColumn": 3, - "endLine": 1193, + "endLine": 1031, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -23742,19 +23510,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource396' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource315' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource396", + "logicalId": "Resource315", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1195, + "startLine": 1033, "startColumn": 3, - "endLine": 1195, + "endLine": 1033, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -23762,19 +23530,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource397' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource316' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource397", + "logicalId": "Resource316", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1197, + "startLine": 1035, "startColumn": 3, - "endLine": 1197, + "endLine": 1035, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -23782,19 +23550,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource398' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource317' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource398", + "logicalId": "Resource317", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1199, + "startLine": 1037, "startColumn": 3, - "endLine": 1199, + "endLine": 1037, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -23802,19 +23570,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource399' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource318' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource399", + "logicalId": "Resource318", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1201, + "startLine": 1039, "startColumn": 3, - "endLine": 1201, + "endLine": 1039, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -23822,19 +23590,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource400' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource319' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource400", + "logicalId": "Resource319", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1203, + "startLine": 1041, "startColumn": 3, - "endLine": 1203, + "endLine": 1041, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -23842,19 +23610,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource401' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource320' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource401", + "logicalId": "Resource320", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1205, + "startLine": 1043, "startColumn": 3, - "endLine": 1205, + "endLine": 1043, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -23862,19 +23630,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource402' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource321' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource402", + "logicalId": "Resource321", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1207, + "startLine": 1045, "startColumn": 3, - "endLine": 1207, + "endLine": 1045, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -23882,19 +23650,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource403' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource322' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource403", + "logicalId": "Resource322", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1209, + "startLine": 1047, "startColumn": 3, - "endLine": 1209, + "endLine": 1047, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -23902,19 +23670,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource404' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource323' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource404", + "logicalId": "Resource323", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1211, + "startLine": 1049, "startColumn": 3, - "endLine": 1211, + "endLine": 1049, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -23922,19 +23690,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource405' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource324' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource405", + "logicalId": "Resource324", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1213, + "startLine": 1051, "startColumn": 3, - "endLine": 1213, + "endLine": 1051, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -23942,19 +23710,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource406' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource325' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource406", + "logicalId": "Resource325", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1215, + "startLine": 1053, "startColumn": 3, - "endLine": 1215, + "endLine": 1053, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -23962,19 +23730,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource407' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource326' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource407", + "logicalId": "Resource326", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1217, + "startLine": 1055, "startColumn": 3, - "endLine": 1217, + "endLine": 1055, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -23982,19 +23750,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource408' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource327' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource408", + "logicalId": "Resource327", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1219, + "startLine": 1057, "startColumn": 3, - "endLine": 1219, + "endLine": 1057, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -24002,19 +23770,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource409' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource328' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource409", + "logicalId": "Resource328", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1221, + "startLine": 1059, "startColumn": 3, - "endLine": 1221, + "endLine": 1059, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -24022,19 +23790,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource410' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource329' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource410", + "logicalId": "Resource329", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1223, + "startLine": 1061, "startColumn": 3, - "endLine": 1223, + "endLine": 1061, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -24042,19 +23810,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource411' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource330' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource411", + "logicalId": "Resource330", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1225, + "startLine": 1063, "startColumn": 3, - "endLine": 1225, + "endLine": 1063, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -24062,19 +23830,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource412' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource331' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource412", + "logicalId": "Resource331", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1227, + "startLine": 1065, "startColumn": 3, - "endLine": 1227, + "endLine": 1065, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -24082,19 +23850,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource413' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource332' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource413", + "logicalId": "Resource332", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1229, + "startLine": 1067, "startColumn": 3, - "endLine": 1229, + "endLine": 1067, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -24102,19 +23870,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource414' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource333' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource414", + "logicalId": "Resource333", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1231, + "startLine": 1069, "startColumn": 3, - "endLine": 1231, + "endLine": 1069, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -24122,19 +23890,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource415' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource334' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource415", + "logicalId": "Resource334", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1233, + "startLine": 1071, "startColumn": 3, - "endLine": 1233, + "endLine": 1071, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -24142,19 +23910,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource416' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource335' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource416", + "logicalId": "Resource335", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1235, + "startLine": 1073, "startColumn": 3, - "endLine": 1235, + "endLine": 1073, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -24162,19 +23930,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource417' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource336' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource417", + "logicalId": "Resource336", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1237, + "startLine": 1075, "startColumn": 3, - "endLine": 1237, + "endLine": 1075, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -24182,19 +23950,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource418' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource337' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource418", + "logicalId": "Resource337", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1239, + "startLine": 1077, "startColumn": 3, - "endLine": 1239, + "endLine": 1077, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -24202,19 +23970,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource419' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource338' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource419", + "logicalId": "Resource338", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1241, + "startLine": 1079, "startColumn": 3, - "endLine": 1241, + "endLine": 1079, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -24222,19 +23990,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource420' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource339' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource420", + "logicalId": "Resource339", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1243, + "startLine": 1081, "startColumn": 3, - "endLine": 1243, + "endLine": 1081, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -24242,19 +24010,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource421' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource340' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource421", + "logicalId": "Resource340", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1245, + "startLine": 1083, "startColumn": 3, - "endLine": 1245, + "endLine": 1083, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -24262,19 +24030,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource422' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource341' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource422", + "logicalId": "Resource341", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1247, + "startLine": 1085, "startColumn": 3, - "endLine": 1247, + "endLine": 1085, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -24282,19 +24050,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource423' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource342' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource423", + "logicalId": "Resource342", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1249, + "startLine": 1087, "startColumn": 3, - "endLine": 1249, + "endLine": 1087, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -24302,19 +24070,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource424' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource343' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource424", + "logicalId": "Resource343", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1251, + "startLine": 1089, "startColumn": 3, - "endLine": 1251, + "endLine": 1089, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -24322,19 +24090,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource425' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource344' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource425", + "logicalId": "Resource344", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1253, + "startLine": 1091, "startColumn": 3, - "endLine": 1253, + "endLine": 1091, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -24342,19 +24110,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource426' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource345' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource426", + "logicalId": "Resource345", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1255, + "startLine": 1093, "startColumn": 3, - "endLine": 1255, + "endLine": 1093, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -24362,19 +24130,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource427' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource346' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource427", + "logicalId": "Resource346", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1257, + "startLine": 1095, "startColumn": 3, - "endLine": 1257, + "endLine": 1095, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -24382,19 +24150,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource428' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource347' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource428", + "logicalId": "Resource347", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1259, + "startLine": 1097, "startColumn": 3, - "endLine": 1259, + "endLine": 1097, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -24402,19 +24170,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource429' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource348' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource429", + "logicalId": "Resource348", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1261, + "startLine": 1099, "startColumn": 3, - "endLine": 1261, + "endLine": 1099, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -24422,19 +24190,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource430' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource349' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource430", + "logicalId": "Resource349", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1263, + "startLine": 1101, "startColumn": 3, - "endLine": 1263, + "endLine": 1101, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -24442,19 +24210,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource431' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource350' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource431", + "logicalId": "Resource350", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1265, + "startLine": 1103, "startColumn": 3, - "endLine": 1265, + "endLine": 1103, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -24462,19 +24230,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource432' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource351' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource432", + "logicalId": "Resource351", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1267, + "startLine": 1105, "startColumn": 3, - "endLine": 1267, + "endLine": 1105, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -24482,19 +24250,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource433' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource352' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource433", + "logicalId": "Resource352", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1269, + "startLine": 1107, "startColumn": 3, - "endLine": 1269, + "endLine": 1107, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -24502,19 +24270,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource434' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource353' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource434", + "logicalId": "Resource353", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1271, + "startLine": 1109, "startColumn": 3, - "endLine": 1271, + "endLine": 1109, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -24522,19 +24290,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource435' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource354' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource435", + "logicalId": "Resource354", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1273, + "startLine": 1111, "startColumn": 3, - "endLine": 1273, + "endLine": 1111, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -24542,19 +24310,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource436' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource355' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource436", + "logicalId": "Resource355", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1275, + "startLine": 1113, "startColumn": 3, - "endLine": 1275, + "endLine": 1113, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -24562,19 +24330,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource437' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource356' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource437", + "logicalId": "Resource356", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1277, + "startLine": 1115, "startColumn": 3, - "endLine": 1277, + "endLine": 1115, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -24582,19 +24350,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource438' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource357' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource438", + "logicalId": "Resource357", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1279, + "startLine": 1117, "startColumn": 3, - "endLine": 1279, + "endLine": 1117, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -24602,19 +24370,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource439' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource358' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource439", + "logicalId": "Resource358", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1281, + "startLine": 1119, "startColumn": 3, - "endLine": 1281, + "endLine": 1119, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -24622,19 +24390,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource440' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource359' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource440", + "logicalId": "Resource359", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1283, + "startLine": 1121, "startColumn": 3, - "endLine": 1283, + "endLine": 1121, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -24642,19 +24410,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource441' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource360' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource441", + "logicalId": "Resource360", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1285, + "startLine": 1123, "startColumn": 3, - "endLine": 1285, + "endLine": 1123, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -24662,19 +24430,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource442' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource361' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource442", + "logicalId": "Resource361", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1287, + "startLine": 1125, "startColumn": 3, - "endLine": 1287, + "endLine": 1125, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -24682,19 +24450,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource443' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource362' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource443", + "logicalId": "Resource362", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1289, + "startLine": 1127, "startColumn": 3, - "endLine": 1289, + "endLine": 1127, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -24702,19 +24470,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource444' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource363' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource444", + "logicalId": "Resource363", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1291, + "startLine": 1129, "startColumn": 3, - "endLine": 1291, + "endLine": 1129, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -24722,19 +24490,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource445' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource364' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource445", + "logicalId": "Resource364", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1293, + "startLine": 1131, "startColumn": 3, - "endLine": 1293, + "endLine": 1131, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -24742,19 +24510,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource446' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource365' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource446", + "logicalId": "Resource365", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1295, + "startLine": 1133, "startColumn": 3, - "endLine": 1295, + "endLine": 1133, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -24762,19 +24530,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource447' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource366' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource447", + "logicalId": "Resource366", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1297, + "startLine": 1135, "startColumn": 3, - "endLine": 1297, + "endLine": 1135, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -24782,19 +24550,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource448' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource367' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource448", + "logicalId": "Resource367", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1299, + "startLine": 1137, "startColumn": 3, - "endLine": 1299, + "endLine": 1137, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -24802,19 +24570,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource449' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource368' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource449", + "logicalId": "Resource368", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1301, + "startLine": 1139, "startColumn": 3, - "endLine": 1301, + "endLine": 1139, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -24822,19 +24590,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource450' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource369' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource450", + "logicalId": "Resource369", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1303, + "startLine": 1141, "startColumn": 3, - "endLine": 1303, + "endLine": 1141, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -24842,19 +24610,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource451' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource370' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource451", + "logicalId": "Resource370", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1305, + "startLine": 1143, "startColumn": 3, - "endLine": 1305, + "endLine": 1143, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -24862,19 +24630,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource452' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource371' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource452", + "logicalId": "Resource371", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1307, + "startLine": 1145, "startColumn": 3, - "endLine": 1307, + "endLine": 1145, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -24882,19 +24650,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource453' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource372' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource453", + "logicalId": "Resource372", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1309, + "startLine": 1147, "startColumn": 3, - "endLine": 1309, + "endLine": 1147, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -24902,19 +24670,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource454' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource373' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource454", + "logicalId": "Resource373", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1311, + "startLine": 1149, "startColumn": 3, - "endLine": 1311, + "endLine": 1149, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -24922,19 +24690,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource455' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource374' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource455", + "logicalId": "Resource374", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1313, + "startLine": 1151, "startColumn": 3, - "endLine": 1313, + "endLine": 1151, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -24942,19 +24710,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource456' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource375' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource456", + "logicalId": "Resource375", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1315, + "startLine": 1153, "startColumn": 3, - "endLine": 1315, + "endLine": 1153, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -24962,19 +24730,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource457' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource376' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource457", + "logicalId": "Resource376", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1317, + "startLine": 1155, "startColumn": 3, - "endLine": 1317, + "endLine": 1155, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -24982,19 +24750,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource458' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource377' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource458", + "logicalId": "Resource377", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1319, + "startLine": 1157, "startColumn": 3, - "endLine": 1319, + "endLine": 1157, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -25002,19 +24770,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource459' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource378' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource459", + "logicalId": "Resource378", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1321, + "startLine": 1159, "startColumn": 3, - "endLine": 1321, + "endLine": 1159, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -25022,19 +24790,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource460' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource379' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource460", + "logicalId": "Resource379", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1323, + "startLine": 1161, "startColumn": 3, - "endLine": 1323, + "endLine": 1161, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -25042,19 +24810,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource461' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource380' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource461", + "logicalId": "Resource380", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1325, + "startLine": 1163, "startColumn": 3, - "endLine": 1325, + "endLine": 1163, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -25062,19 +24830,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource462' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource381' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource462", + "logicalId": "Resource381", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1327, + "startLine": 1165, "startColumn": 3, - "endLine": 1327, + "endLine": 1165, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -25082,19 +24850,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource463' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource382' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource463", + "logicalId": "Resource382", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1329, + "startLine": 1167, "startColumn": 3, - "endLine": 1329, + "endLine": 1167, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -25102,19 +24870,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource464' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource383' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource464", + "logicalId": "Resource383", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1331, + "startLine": 1169, "startColumn": 3, - "endLine": 1331, + "endLine": 1169, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -25122,19 +24890,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource465' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource384' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource465", + "logicalId": "Resource384", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1333, + "startLine": 1171, "startColumn": 3, - "endLine": 1333, + "endLine": 1171, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -25142,19 +24910,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource466' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource385' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource466", + "logicalId": "Resource385", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1335, + "startLine": 1173, "startColumn": 3, - "endLine": 1335, + "endLine": 1173, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -25162,19 +24930,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource467' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource386' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource467", + "logicalId": "Resource386", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1337, + "startLine": 1175, "startColumn": 3, - "endLine": 1337, + "endLine": 1175, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -25182,19 +24950,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource468' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource387' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource468", + "logicalId": "Resource387", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1339, + "startLine": 1177, "startColumn": 3, - "endLine": 1339, + "endLine": 1177, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -25202,19 +24970,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource469' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource388' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource469", + "logicalId": "Resource388", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1341, + "startLine": 1179, "startColumn": 3, - "endLine": 1341, + "endLine": 1179, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -25222,19 +24990,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource470' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource389' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource470", + "logicalId": "Resource389", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1343, + "startLine": 1181, "startColumn": 3, - "endLine": 1343, + "endLine": 1181, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -25242,19 +25010,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource471' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource390' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource471", + "logicalId": "Resource390", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1345, + "startLine": 1183, "startColumn": 3, - "endLine": 1345, + "endLine": 1183, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -25262,19 +25030,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource472' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource391' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource472", + "logicalId": "Resource391", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1347, + "startLine": 1185, "startColumn": 3, - "endLine": 1347, + "endLine": 1185, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -25282,19 +25050,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource473' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource392' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource473", + "logicalId": "Resource392", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1349, + "startLine": 1187, "startColumn": 3, - "endLine": 1349, + "endLine": 1187, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -25302,19 +25070,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource474' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource393' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource474", + "logicalId": "Resource393", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1351, + "startLine": 1189, "startColumn": 3, - "endLine": 1351, + "endLine": 1189, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -25322,19 +25090,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource475' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource394' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource475", + "logicalId": "Resource394", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1353, + "startLine": 1191, "startColumn": 3, - "endLine": 1353, + "endLine": 1191, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -25342,19 +25110,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource476' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource395' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource476", + "logicalId": "Resource395", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1355, + "startLine": 1193, "startColumn": 3, - "endLine": 1355, + "endLine": 1193, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -25362,19 +25130,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource477' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource396' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource477", + "logicalId": "Resource396", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1357, + "startLine": 1195, "startColumn": 3, - "endLine": 1357, + "endLine": 1195, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -25382,19 +25150,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource478' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource397' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource478", + "logicalId": "Resource397", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1359, + "startLine": 1197, "startColumn": 3, - "endLine": 1359, + "endLine": 1197, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -25402,19 +25170,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource479' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource398' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource479", + "logicalId": "Resource398", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1361, + "startLine": 1199, "startColumn": 3, - "endLine": 1361, + "endLine": 1199, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -25422,19 +25190,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource480' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource399' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource480", + "logicalId": "Resource399", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1363, + "startLine": 1201, "startColumn": 3, - "endLine": 1363, + "endLine": 1201, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -25442,19 +25210,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource481' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource400' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource481", + "logicalId": "Resource400", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1365, + "startLine": 1203, "startColumn": 3, - "endLine": 1365, + "endLine": 1203, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -25462,19 +25230,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource482' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource401' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource482", + "logicalId": "Resource401", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1367, + "startLine": 1205, "startColumn": 3, - "endLine": 1367, + "endLine": 1205, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -25482,19 +25250,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource483' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource402' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource483", + "logicalId": "Resource402", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1369, + "startLine": 1207, "startColumn": 3, - "endLine": 1369, + "endLine": 1207, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -25502,19 +25270,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource484' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource403' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource484", + "logicalId": "Resource403", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1371, + "startLine": 1209, "startColumn": 3, - "endLine": 1371, + "endLine": 1209, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -25522,19 +25290,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource485' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource404' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource485", + "logicalId": "Resource404", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1373, + "startLine": 1211, "startColumn": 3, - "endLine": 1373, + "endLine": 1211, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -25542,19 +25310,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource486' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource405' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource486", + "logicalId": "Resource405", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1375, + "startLine": 1213, "startColumn": 3, - "endLine": 1375, + "endLine": 1213, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -25562,19 +25330,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource487' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource406' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource487", + "logicalId": "Resource406", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1377, + "startLine": 1215, "startColumn": 3, - "endLine": 1377, + "endLine": 1215, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -25582,19 +25350,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource488' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource407' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource488", + "logicalId": "Resource407", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1379, + "startLine": 1217, "startColumn": 3, - "endLine": 1379, + "endLine": 1217, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -25602,19 +25370,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource489' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource408' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource489", + "logicalId": "Resource408", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1381, + "startLine": 1219, "startColumn": 3, - "endLine": 1381, + "endLine": 1219, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -25622,19 +25390,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource490' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource409' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource490", + "logicalId": "Resource409", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1383, + "startLine": 1221, "startColumn": 3, - "endLine": 1383, + "endLine": 1221, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -25642,19 +25410,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource491' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource410' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource491", + "logicalId": "Resource410", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1385, + "startLine": 1223, "startColumn": 3, - "endLine": 1385, + "endLine": 1223, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -25662,19 +25430,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource492' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource411' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource492", + "logicalId": "Resource411", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1387, + "startLine": 1225, "startColumn": 3, - "endLine": 1387, + "endLine": 1225, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -25682,19 +25450,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource493' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource412' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource493", + "logicalId": "Resource412", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1389, + "startLine": 1227, "startColumn": 3, - "endLine": 1389, + "endLine": 1227, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -25702,19 +25470,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource494' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource413' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource494", + "logicalId": "Resource413", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1391, + "startLine": 1229, "startColumn": 3, - "endLine": 1391, + "endLine": 1229, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -25722,19 +25490,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource495' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource414' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource495", + "logicalId": "Resource414", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1393, + "startLine": 1231, "startColumn": 3, - "endLine": 1393, + "endLine": 1231, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -25742,19 +25510,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource496' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource415' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource496", + "logicalId": "Resource415", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1395, + "startLine": 1233, "startColumn": 3, - "endLine": 1395, + "endLine": 1233, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -25762,19 +25530,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource497' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource416' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource497", + "logicalId": "Resource416", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1397, + "startLine": 1235, "startColumn": 3, - "endLine": 1397, + "endLine": 1235, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -25782,19 +25550,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource498' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource417' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource498", + "logicalId": "Resource417", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1399, + "startLine": 1237, "startColumn": 3, - "endLine": 1399, + "endLine": 1237, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -25802,19 +25570,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource499' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource418' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource499", + "logicalId": "Resource418", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1401, + "startLine": 1239, "startColumn": 3, - "endLine": 1401, + "endLine": 1239, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -25822,19 +25590,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource500' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource419' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource500", + "logicalId": "Resource419", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1403, + "startLine": 1241, "startColumn": 3, - "endLine": 1403, + "endLine": 1241, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -25842,2262 +25610,1674 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource501' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Resource420' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource501", + "logicalId": "Resource420", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1405, + "startLine": 1243, "startColumn": 3, - "endLine": 1405, + "endLine": 1243, "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" - } - ] - }, - "bad/limit_size.yaml": { - "filePath": "bad/limit_size.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 299, - "counts": { - "fatal": 1, - "errors": 299, - "warnings": 897, - "informational": 898, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "F0011", - "severity": "FATAL", - "message": "Description length 1026 exceeds maximum 1024", - "source": "SCHEMA", - "category": "Structure", - "startLine": 3, - "startColumn": 1, - "endLine": 3, - "endColumn": 10, - "ruleDescription": "Description exceeds maximum 1024 characters", - "phase": "SCHEMA" - }, - { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", - "entity": { - "logicalId": "Resource1", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 89, - "startColumn": 7, - "endLine": 89, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } - }, - { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", - "entity": { - "logicalId": "Resource2", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 188, - "startColumn": 7, - "endLine": 188, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } - }, - { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", - "entity": { - "logicalId": "Resource3", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 287, - "startColumn": 7, - "endLine": 287, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } - }, - { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", - "entity": { - "logicalId": "Resource4", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 386, - "startColumn": 7, - "endLine": 386, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } - }, - { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", - "entity": { - "logicalId": "Resource5", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 485, - "startColumn": 7, - "endLine": 485, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } - }, - { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", - "entity": { - "logicalId": "Resource6", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 584, - "startColumn": 7, - "endLine": 584, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } - }, - { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", - "entity": { - "logicalId": "Resource7", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 683, - "startColumn": 7, - "endLine": 683, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } - }, - { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", - "entity": { - "logicalId": "Resource8", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 782, - "startColumn": 7, - "endLine": 782, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } - }, - { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", - "entity": { - "logicalId": "Resource9", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 881, - "startColumn": 7, - "endLine": 881, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } - }, - { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", - "entity": { - "logicalId": "Resource10", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 980, - "startColumn": 7, - "endLine": 980, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } - }, - { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", - "entity": { - "logicalId": "Resource11", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 1079, - "startColumn": 7, - "endLine": 1079, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } - }, - { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", - "entity": { - "logicalId": "Resource12", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 1178, - "startColumn": 7, - "endLine": 1178, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } - }, - { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", - "entity": { - "logicalId": "Resource13", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 1277, - "startColumn": 7, - "endLine": 1277, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } - }, - { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", - "entity": { - "logicalId": "Resource14", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 1376, - "startColumn": 7, - "endLine": 1376, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } - }, - { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", - "entity": { - "logicalId": "Resource15", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 1475, - "startColumn": 7, - "endLine": 1475, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } - }, - { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", - "entity": { - "logicalId": "Resource16", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 1574, - "startColumn": 7, - "endLine": 1574, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource421' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource17", + "logicalId": "Resource421", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 1673, - "startColumn": 7, - "endLine": 1673, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1245, + "startColumn": 3, + "endLine": 1245, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource422' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource18", + "logicalId": "Resource422", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 1772, - "startColumn": 7, - "endLine": 1772, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1247, + "startColumn": 3, + "endLine": 1247, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource423' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource19", + "logicalId": "Resource423", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 1871, - "startColumn": 7, - "endLine": 1871, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1249, + "startColumn": 3, + "endLine": 1249, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource424' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource20", + "logicalId": "Resource424", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 1970, - "startColumn": 7, - "endLine": 1970, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1251, + "startColumn": 3, + "endLine": 1251, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource425' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource21", + "logicalId": "Resource425", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 2069, - "startColumn": 7, - "endLine": 2069, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1253, + "startColumn": 3, + "endLine": 1253, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource426' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource22", + "logicalId": "Resource426", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 2168, - "startColumn": 7, - "endLine": 2168, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1255, + "startColumn": 3, + "endLine": 1255, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource427' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource23", + "logicalId": "Resource427", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 2267, - "startColumn": 7, - "endLine": 2267, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1257, + "startColumn": 3, + "endLine": 1257, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource428' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource24", + "logicalId": "Resource428", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 2366, - "startColumn": 7, - "endLine": 2366, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1259, + "startColumn": 3, + "endLine": 1259, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource429' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource25", + "logicalId": "Resource429", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 2465, - "startColumn": 7, - "endLine": 2465, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1261, + "startColumn": 3, + "endLine": 1261, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource430' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource26", + "logicalId": "Resource430", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 2564, - "startColumn": 7, - "endLine": 2564, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1263, + "startColumn": 3, + "endLine": 1263, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource431' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource27", + "logicalId": "Resource431", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 2663, - "startColumn": 7, - "endLine": 2663, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1265, + "startColumn": 3, + "endLine": 1265, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource432' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource28", + "logicalId": "Resource432", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 2762, - "startColumn": 7, - "endLine": 2762, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1267, + "startColumn": 3, + "endLine": 1267, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource433' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource29", + "logicalId": "Resource433", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 2861, - "startColumn": 7, - "endLine": 2861, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1269, + "startColumn": 3, + "endLine": 1269, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource434' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource30", + "logicalId": "Resource434", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 2960, - "startColumn": 7, - "endLine": 2960, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1271, + "startColumn": 3, + "endLine": 1271, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource435' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource31", + "logicalId": "Resource435", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 3059, - "startColumn": 7, - "endLine": 3059, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1273, + "startColumn": 3, + "endLine": 1273, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource436' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource32", + "logicalId": "Resource436", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 3158, - "startColumn": 7, - "endLine": 3158, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1275, + "startColumn": 3, + "endLine": 1275, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource437' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource33", + "logicalId": "Resource437", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 3257, - "startColumn": 7, - "endLine": 3257, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1277, + "startColumn": 3, + "endLine": 1277, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } - }, - { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource438' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource34", + "logicalId": "Resource438", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 3356, - "startColumn": 7, - "endLine": 3356, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1279, + "startColumn": 3, + "endLine": 1279, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource439' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource35", + "logicalId": "Resource439", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 3455, - "startColumn": 7, - "endLine": 3455, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1281, + "startColumn": 3, + "endLine": 1281, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource440' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource36", + "logicalId": "Resource440", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 3554, - "startColumn": 7, - "endLine": 3554, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1283, + "startColumn": 3, + "endLine": 1283, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource441' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource37", + "logicalId": "Resource441", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 3653, - "startColumn": 7, - "endLine": 3653, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1285, + "startColumn": 3, + "endLine": 1285, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource442' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource38", + "logicalId": "Resource442", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 3752, - "startColumn": 7, - "endLine": 3752, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1287, + "startColumn": 3, + "endLine": 1287, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource443' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource39", + "logicalId": "Resource443", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 3851, - "startColumn": 7, - "endLine": 3851, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1289, + "startColumn": 3, + "endLine": 1289, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource444' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource40", + "logicalId": "Resource444", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 3950, - "startColumn": 7, - "endLine": 3950, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1291, + "startColumn": 3, + "endLine": 1291, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource445' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource41", + "logicalId": "Resource445", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 4049, - "startColumn": 7, - "endLine": 4049, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1293, + "startColumn": 3, + "endLine": 1293, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource446' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource42", + "logicalId": "Resource446", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 4148, - "startColumn": 7, - "endLine": 4148, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1295, + "startColumn": 3, + "endLine": 1295, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource447' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource43", + "logicalId": "Resource447", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 4247, - "startColumn": 7, - "endLine": 4247, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1297, + "startColumn": 3, + "endLine": 1297, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource448' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource44", + "logicalId": "Resource448", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 4346, - "startColumn": 7, - "endLine": 4346, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1299, + "startColumn": 3, + "endLine": 1299, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource449' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource45", + "logicalId": "Resource449", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 4445, - "startColumn": 7, - "endLine": 4445, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1301, + "startColumn": 3, + "endLine": 1301, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource450' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource46", + "logicalId": "Resource450", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 4544, - "startColumn": 7, - "endLine": 4544, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1303, + "startColumn": 3, + "endLine": 1303, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource451' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource47", + "logicalId": "Resource451", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 4643, - "startColumn": 7, - "endLine": 4643, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1305, + "startColumn": 3, + "endLine": 1305, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource452' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource48", + "logicalId": "Resource452", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 4742, - "startColumn": 7, - "endLine": 4742, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1307, + "startColumn": 3, + "endLine": 1307, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource453' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource49", + "logicalId": "Resource453", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 4841, - "startColumn": 7, - "endLine": 4841, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1309, + "startColumn": 3, + "endLine": 1309, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource454' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource50", + "logicalId": "Resource454", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 4940, - "startColumn": 7, - "endLine": 4940, + "resourceType": "AWS::SNS::Topic" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1311, + "startColumn": 3, + "endLine": 1311, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource455' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource51", + "logicalId": "Resource455", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 5039, - "startColumn": 7, - "endLine": 5039, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1313, + "startColumn": 3, + "endLine": 1313, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource456' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource52", + "logicalId": "Resource456", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 5138, - "startColumn": 7, - "endLine": 5138, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1315, + "startColumn": 3, + "endLine": 1315, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource457' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource53", + "logicalId": "Resource457", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 5237, - "startColumn": 7, - "endLine": 5237, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1317, + "startColumn": 3, + "endLine": 1317, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource458' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource54", + "logicalId": "Resource458", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 5336, - "startColumn": 7, - "endLine": 5336, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1319, + "startColumn": 3, + "endLine": 1319, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource459' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource55", + "logicalId": "Resource459", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 5435, - "startColumn": 7, - "endLine": 5435, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1321, + "startColumn": 3, + "endLine": 1321, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource460' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource56", + "logicalId": "Resource460", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 5534, - "startColumn": 7, - "endLine": 5534, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1323, + "startColumn": 3, + "endLine": 1323, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource461' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource57", + "logicalId": "Resource461", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 5633, - "startColumn": 7, - "endLine": 5633, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1325, + "startColumn": 3, + "endLine": 1325, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource462' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource58", + "logicalId": "Resource462", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 5732, - "startColumn": 7, - "endLine": 5732, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1327, + "startColumn": 3, + "endLine": 1327, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource463' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource59", + "logicalId": "Resource463", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 5831, - "startColumn": 7, - "endLine": 5831, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1329, + "startColumn": 3, + "endLine": 1329, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource464' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource60", + "logicalId": "Resource464", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 5930, - "startColumn": 7, - "endLine": 5930, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1331, + "startColumn": 3, + "endLine": 1331, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource465' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource61", + "logicalId": "Resource465", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 6029, - "startColumn": 7, - "endLine": 6029, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1333, + "startColumn": 3, + "endLine": 1333, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource466' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource62", + "logicalId": "Resource466", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 6128, - "startColumn": 7, - "endLine": 6128, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1335, + "startColumn": 3, + "endLine": 1335, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource467' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource63", + "logicalId": "Resource467", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 6227, - "startColumn": 7, - "endLine": 6227, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1337, + "startColumn": 3, + "endLine": 1337, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource468' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource64", + "logicalId": "Resource468", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 6326, - "startColumn": 7, - "endLine": 6326, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1339, + "startColumn": 3, + "endLine": 1339, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource469' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource65", + "logicalId": "Resource469", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 6425, - "startColumn": 7, - "endLine": 6425, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1341, + "startColumn": 3, + "endLine": 1341, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource470' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource66", + "logicalId": "Resource470", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 6524, - "startColumn": 7, - "endLine": 6524, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1343, + "startColumn": 3, + "endLine": 1343, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource471' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource67", + "logicalId": "Resource471", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 6623, - "startColumn": 7, - "endLine": 6623, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1345, + "startColumn": 3, + "endLine": 1345, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource472' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource68", + "logicalId": "Resource472", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 6722, - "startColumn": 7, - "endLine": 6722, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1347, + "startColumn": 3, + "endLine": 1347, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource473' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource69", + "logicalId": "Resource473", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 6821, - "startColumn": 7, - "endLine": 6821, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1349, + "startColumn": 3, + "endLine": 1349, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource474' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource70", + "logicalId": "Resource474", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 6920, - "startColumn": 7, - "endLine": 6920, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1351, + "startColumn": 3, + "endLine": 1351, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource475' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource71", + "logicalId": "Resource475", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 7019, - "startColumn": 7, - "endLine": 7019, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1353, + "startColumn": 3, + "endLine": 1353, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource476' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource72", + "logicalId": "Resource476", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 7118, - "startColumn": 7, - "endLine": 7118, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1355, + "startColumn": 3, + "endLine": 1355, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource477' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource73", + "logicalId": "Resource477", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 7217, - "startColumn": 7, - "endLine": 7217, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1357, + "startColumn": 3, + "endLine": 1357, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource478' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource74", + "logicalId": "Resource478", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 7316, - "startColumn": 7, - "endLine": 7316, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1359, + "startColumn": 3, + "endLine": 1359, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource479' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource75", + "logicalId": "Resource479", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 7415, - "startColumn": 7, - "endLine": 7415, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1361, + "startColumn": 3, + "endLine": 1361, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource480' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource76", + "logicalId": "Resource480", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 7514, - "startColumn": 7, - "endLine": 7514, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1363, + "startColumn": 3, + "endLine": 1363, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource481' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource77", + "logicalId": "Resource481", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 7613, - "startColumn": 7, - "endLine": 7613, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1365, + "startColumn": 3, + "endLine": 1365, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource482' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource78", + "logicalId": "Resource482", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 7712, - "startColumn": 7, - "endLine": 7712, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1367, + "startColumn": 3, + "endLine": 1367, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource483' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource79", + "logicalId": "Resource483", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 7811, - "startColumn": 7, - "endLine": 7811, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1369, + "startColumn": 3, + "endLine": 1369, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource484' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource80", + "logicalId": "Resource484", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 7910, - "startColumn": 7, - "endLine": 7910, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1371, + "startColumn": 3, + "endLine": 1371, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource485' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource81", + "logicalId": "Resource485", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 8009, - "startColumn": 7, - "endLine": 8009, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1373, + "startColumn": 3, + "endLine": 1373, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource486' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource82", + "logicalId": "Resource486", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 8108, - "startColumn": 7, - "endLine": 8108, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1375, + "startColumn": 3, + "endLine": 1375, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource487' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "Resource487", + "entityType": "Resource", + "resourceType": "AWS::SNS::Topic" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1377, + "startColumn": 3, + "endLine": 1377, + "endColumn": 14, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource488' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource83", + "logicalId": "Resource488", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 8207, - "startColumn": 7, - "endLine": 8207, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1379, + "startColumn": 3, + "endLine": 1379, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource489' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource84", + "logicalId": "Resource489", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 8306, - "startColumn": 7, - "endLine": 8306, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1381, + "startColumn": 3, + "endLine": 1381, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource490' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource85", + "logicalId": "Resource490", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 8405, - "startColumn": 7, - "endLine": 8405, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1383, + "startColumn": 3, + "endLine": 1383, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource491' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource86", + "logicalId": "Resource491", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 8504, - "startColumn": 7, - "endLine": 8504, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1385, + "startColumn": 3, + "endLine": 1385, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource492' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource87", + "logicalId": "Resource492", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 8603, - "startColumn": 7, - "endLine": 8603, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1387, + "startColumn": 3, + "endLine": 1387, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource493' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource88", + "logicalId": "Resource493", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 8702, - "startColumn": 7, - "endLine": 8702, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1389, + "startColumn": 3, + "endLine": 1389, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource494' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource89", + "logicalId": "Resource494", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 8801, - "startColumn": 7, - "endLine": 8801, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1391, + "startColumn": 3, + "endLine": 1391, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource495' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource90", + "logicalId": "Resource495", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 8900, - "startColumn": 7, - "endLine": 8900, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1393, + "startColumn": 3, + "endLine": 1393, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource496' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource91", + "logicalId": "Resource496", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 8999, - "startColumn": 7, - "endLine": 8999, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1395, + "startColumn": 3, + "endLine": 1395, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource497' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource92", + "logicalId": "Resource497", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 9098, - "startColumn": 7, - "endLine": 9098, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1397, + "startColumn": 3, + "endLine": 1397, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource498' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource93", + "logicalId": "Resource498", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 9197, - "startColumn": 7, - "endLine": 9197, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1399, + "startColumn": 3, + "endLine": 1399, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource499' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource94", + "logicalId": "Resource499", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 9296, - "startColumn": 7, - "endLine": 9296, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1401, + "startColumn": 3, + "endLine": 1401, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource500' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource95", + "logicalId": "Resource500", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 9395, - "startColumn": 7, - "endLine": 9395, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1403, + "startColumn": 3, + "endLine": 1403, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource501' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource96", + "logicalId": "Resource501", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 9494, - "startColumn": 7, - "endLine": 9494, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1405, + "startColumn": 3, + "endLine": 1405, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-ami" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "bad/limit_size.yaml": { + "filePath": "bad/limit_size.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 299, + "counts": { + "fatal": 1, + "errors": 299, + "warnings": 897, + "informational": 898, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "F0011", + "severity": "FATAL", + "message": "Description length 1026 exceeds maximum 1024", + "source": "SCHEMA", + "category": "Structure", + "startLine": 3, + "startColumn": 1, + "endLine": 3, + "endColumn": 10, + "ruleDescription": "Description exceeds maximum 1024 characters", + "phase": "SCHEMA" }, { "ruleId": "E1152", @@ -28105,15 +27285,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource97", + "logicalId": "Resource1", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 9593, + "startLine": 89, "startColumn": 7, - "endLine": 9593, + "endLine": 89, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -28128,15 +27308,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource98", + "logicalId": "Resource2", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 9692, + "startLine": 188, "startColumn": 7, - "endLine": 9692, + "endLine": 188, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -28151,15 +27331,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource99", + "logicalId": "Resource3", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 9791, + "startLine": 287, "startColumn": 7, - "endLine": 9791, + "endLine": 287, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -28174,15 +27354,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource100", + "logicalId": "Resource4", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 9890, + "startLine": 386, "startColumn": 7, - "endLine": 9890, + "endLine": 386, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -28197,15 +27377,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource101", + "logicalId": "Resource5", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 9989, + "startLine": 485, "startColumn": 7, - "endLine": 9989, + "endLine": 485, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -28220,15 +27400,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource102", + "logicalId": "Resource6", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 10088, + "startLine": 584, "startColumn": 7, - "endLine": 10088, + "endLine": 584, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -28243,15 +27423,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource103", + "logicalId": "Resource7", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 10187, + "startLine": 683, "startColumn": 7, - "endLine": 10187, + "endLine": 683, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -28266,15 +27446,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource104", + "logicalId": "Resource8", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 10286, + "startLine": 782, "startColumn": 7, - "endLine": 10286, + "endLine": 782, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -28289,15 +27469,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource105", + "logicalId": "Resource9", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 10385, + "startLine": 881, "startColumn": 7, - "endLine": 10385, + "endLine": 881, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -28312,15 +27492,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource106", + "logicalId": "Resource10", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 10484, + "startLine": 980, "startColumn": 7, - "endLine": 10484, + "endLine": 980, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -28335,15 +27515,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource107", + "logicalId": "Resource11", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 10583, + "startLine": 1079, "startColumn": 7, - "endLine": 10583, + "endLine": 1079, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -28358,15 +27538,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource108", + "logicalId": "Resource12", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 10682, + "startLine": 1178, "startColumn": 7, - "endLine": 10682, + "endLine": 1178, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -28381,15 +27561,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource109", + "logicalId": "Resource13", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 10781, + "startLine": 1277, "startColumn": 7, - "endLine": 10781, + "endLine": 1277, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -28404,15 +27584,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource110", + "logicalId": "Resource14", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 10880, + "startLine": 1376, "startColumn": 7, - "endLine": 10880, + "endLine": 1376, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -28427,15 +27607,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource111", + "logicalId": "Resource15", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 10979, + "startLine": 1475, "startColumn": 7, - "endLine": 10979, + "endLine": 1475, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -28450,15 +27630,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource112", + "logicalId": "Resource16", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 11078, + "startLine": 1574, "startColumn": 7, - "endLine": 11078, + "endLine": 1574, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -28473,15 +27653,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource113", + "logicalId": "Resource17", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 11177, + "startLine": 1673, "startColumn": 7, - "endLine": 11177, + "endLine": 1673, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -28496,15 +27676,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource114", + "logicalId": "Resource18", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 11276, + "startLine": 1772, "startColumn": 7, - "endLine": 11276, + "endLine": 1772, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -28519,15 +27699,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource115", + "logicalId": "Resource19", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 11375, + "startLine": 1871, "startColumn": 7, - "endLine": 11375, + "endLine": 1871, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -28542,15 +27722,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource116", + "logicalId": "Resource20", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 11474, + "startLine": 1970, "startColumn": 7, - "endLine": 11474, + "endLine": 1970, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -28565,15 +27745,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource117", + "logicalId": "Resource21", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 11573, + "startLine": 2069, "startColumn": 7, - "endLine": 11573, + "endLine": 2069, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -28588,15 +27768,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource118", + "logicalId": "Resource22", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 11672, + "startLine": 2168, "startColumn": 7, - "endLine": 11672, + "endLine": 2168, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -28611,15 +27791,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource119", + "logicalId": "Resource23", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 11771, + "startLine": 2267, "startColumn": 7, - "endLine": 11771, + "endLine": 2267, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -28634,15 +27814,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource120", + "logicalId": "Resource24", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 11870, + "startLine": 2366, "startColumn": 7, - "endLine": 11870, + "endLine": 2366, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -28657,15 +27837,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource121", + "logicalId": "Resource25", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 11969, + "startLine": 2465, "startColumn": 7, - "endLine": 11969, + "endLine": 2465, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -28680,15 +27860,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource122", + "logicalId": "Resource26", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 12068, + "startLine": 2564, "startColumn": 7, - "endLine": 12068, + "endLine": 2564, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -28703,15 +27883,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource123", + "logicalId": "Resource27", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 12167, + "startLine": 2663, "startColumn": 7, - "endLine": 12167, + "endLine": 2663, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -28726,15 +27906,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource124", + "logicalId": "Resource28", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 12266, + "startLine": 2762, "startColumn": 7, - "endLine": 12266, + "endLine": 2762, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -28749,15 +27929,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource125", + "logicalId": "Resource29", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 12365, + "startLine": 2861, "startColumn": 7, - "endLine": 12365, + "endLine": 2861, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -28772,15 +27952,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource126", + "logicalId": "Resource30", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 12464, + "startLine": 2960, "startColumn": 7, - "endLine": 12464, + "endLine": 2960, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -28795,15 +27975,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource127", + "logicalId": "Resource31", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 12563, + "startLine": 3059, "startColumn": 7, - "endLine": 12563, + "endLine": 3059, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -28818,15 +27998,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource128", + "logicalId": "Resource32", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 12662, + "startLine": 3158, "startColumn": 7, - "endLine": 12662, + "endLine": 3158, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -28841,15 +28021,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource129", + "logicalId": "Resource33", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 12761, + "startLine": 3257, "startColumn": 7, - "endLine": 12761, + "endLine": 3257, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -28864,15 +28044,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource130", + "logicalId": "Resource34", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 12860, + "startLine": 3356, "startColumn": 7, - "endLine": 12860, + "endLine": 3356, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -28887,15 +28067,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource131", + "logicalId": "Resource35", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 12959, + "startLine": 3455, "startColumn": 7, - "endLine": 12959, + "endLine": 3455, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -28910,15 +28090,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource132", + "logicalId": "Resource36", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 13058, + "startLine": 3554, "startColumn": 7, - "endLine": 13058, + "endLine": 3554, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -28933,15 +28113,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource133", + "logicalId": "Resource37", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 13157, + "startLine": 3653, "startColumn": 7, - "endLine": 13157, + "endLine": 3653, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -28956,15 +28136,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource134", + "logicalId": "Resource38", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 13256, + "startLine": 3752, "startColumn": 7, - "endLine": 13256, + "endLine": 3752, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -28979,15 +28159,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource135", + "logicalId": "Resource39", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 13355, + "startLine": 3851, "startColumn": 7, - "endLine": 13355, + "endLine": 3851, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -29002,15 +28182,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource136", + "logicalId": "Resource40", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 13454, + "startLine": 3950, "startColumn": 7, - "endLine": 13454, + "endLine": 3950, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -29025,15 +28205,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource137", + "logicalId": "Resource41", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 13553, + "startLine": 4049, "startColumn": 7, - "endLine": 13553, + "endLine": 4049, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -29048,15 +28228,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource138", + "logicalId": "Resource42", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 13652, + "startLine": 4148, "startColumn": 7, - "endLine": 13652, + "endLine": 4148, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -29071,15 +28251,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource139", + "logicalId": "Resource43", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 13751, + "startLine": 4247, "startColumn": 7, - "endLine": 13751, + "endLine": 4247, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -29094,15 +28274,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource140", + "logicalId": "Resource44", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 13850, + "startLine": 4346, "startColumn": 7, - "endLine": 13850, + "endLine": 4346, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -29117,15 +28297,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource141", + "logicalId": "Resource45", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 13949, + "startLine": 4445, "startColumn": 7, - "endLine": 13949, + "endLine": 4445, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -29140,15 +28320,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource142", + "logicalId": "Resource46", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 14048, + "startLine": 4544, "startColumn": 7, - "endLine": 14048, + "endLine": 4544, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -29163,15 +28343,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource143", + "logicalId": "Resource47", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 14147, + "startLine": 4643, "startColumn": 7, - "endLine": 14147, + "endLine": 4643, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -29186,15 +28366,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource144", + "logicalId": "Resource48", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 14246, + "startLine": 4742, "startColumn": 7, - "endLine": 14246, + "endLine": 4742, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -29209,15 +28389,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource145", + "logicalId": "Resource49", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 14345, + "startLine": 4841, "startColumn": 7, - "endLine": 14345, + "endLine": 4841, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -29232,15 +28412,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource146", + "logicalId": "Resource50", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 14444, + "startLine": 4940, "startColumn": 7, - "endLine": 14444, + "endLine": 4940, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -29255,15 +28435,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource147", + "logicalId": "Resource51", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 14543, + "startLine": 5039, "startColumn": 7, - "endLine": 14543, + "endLine": 5039, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -29278,15 +28458,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource148", + "logicalId": "Resource52", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 14642, + "startLine": 5138, "startColumn": 7, - "endLine": 14642, + "endLine": 5138, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -29301,15 +28481,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource149", + "logicalId": "Resource53", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 14741, + "startLine": 5237, "startColumn": 7, - "endLine": 14741, + "endLine": 5237, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -29324,15 +28504,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource150", + "logicalId": "Resource54", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 14840, + "startLine": 5336, "startColumn": 7, - "endLine": 14840, + "endLine": 5336, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -29347,15 +28527,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource151", + "logicalId": "Resource55", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 14939, + "startLine": 5435, "startColumn": 7, - "endLine": 14939, + "endLine": 5435, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -29370,15 +28550,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource152", + "logicalId": "Resource56", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 15038, + "startLine": 5534, "startColumn": 7, - "endLine": 15038, + "endLine": 5534, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -29393,15 +28573,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource153", + "logicalId": "Resource57", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 15137, + "startLine": 5633, "startColumn": 7, - "endLine": 15137, + "endLine": 5633, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -29416,15 +28596,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource154", + "logicalId": "Resource58", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 15236, + "startLine": 5732, "startColumn": 7, - "endLine": 15236, + "endLine": 5732, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -29439,15 +28619,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource155", + "logicalId": "Resource59", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 15335, + "startLine": 5831, "startColumn": 7, - "endLine": 15335, + "endLine": 5831, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -29462,15 +28642,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource156", + "logicalId": "Resource60", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 15434, + "startLine": 5930, "startColumn": 7, - "endLine": 15434, + "endLine": 5930, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -29485,15 +28665,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource157", + "logicalId": "Resource61", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 15533, + "startLine": 6029, "startColumn": 7, - "endLine": 15533, + "endLine": 6029, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -29508,15 +28688,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource158", + "logicalId": "Resource62", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 15632, + "startLine": 6128, "startColumn": 7, - "endLine": 15632, + "endLine": 6128, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -29531,15 +28711,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource159", + "logicalId": "Resource63", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 15731, + "startLine": 6227, "startColumn": 7, - "endLine": 15731, + "endLine": 6227, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -29554,15 +28734,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource160", + "logicalId": "Resource64", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 15830, + "startLine": 6326, "startColumn": 7, - "endLine": 15830, + "endLine": 6326, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -29577,15 +28757,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource161", + "logicalId": "Resource65", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 15929, + "startLine": 6425, "startColumn": 7, - "endLine": 15929, + "endLine": 6425, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -29600,15 +28780,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource162", + "logicalId": "Resource66", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 16028, + "startLine": 6524, "startColumn": 7, - "endLine": 16028, + "endLine": 6524, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -29623,15 +28803,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource163", + "logicalId": "Resource67", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 16127, + "startLine": 6623, "startColumn": 7, - "endLine": 16127, + "endLine": 6623, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -29646,15 +28826,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource164", + "logicalId": "Resource68", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 16226, + "startLine": 6722, "startColumn": 7, - "endLine": 16226, + "endLine": 6722, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -29669,15 +28849,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource165", + "logicalId": "Resource69", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 16325, + "startLine": 6821, "startColumn": 7, - "endLine": 16325, + "endLine": 6821, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -29692,15 +28872,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource166", + "logicalId": "Resource70", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 16424, + "startLine": 6920, "startColumn": 7, - "endLine": 16424, + "endLine": 6920, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -29715,15 +28895,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource167", + "logicalId": "Resource71", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 16523, + "startLine": 7019, "startColumn": 7, - "endLine": 16523, + "endLine": 7019, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -29738,15 +28918,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource168", + "logicalId": "Resource72", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 16622, + "startLine": 7118, "startColumn": 7, - "endLine": 16622, + "endLine": 7118, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -29761,15 +28941,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource169", + "logicalId": "Resource73", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 16721, + "startLine": 7217, "startColumn": 7, - "endLine": 16721, + "endLine": 7217, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -29784,15 +28964,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource170", + "logicalId": "Resource74", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 16820, + "startLine": 7316, "startColumn": 7, - "endLine": 16820, + "endLine": 7316, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -29807,15 +28987,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource171", + "logicalId": "Resource75", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 16919, + "startLine": 7415, "startColumn": 7, - "endLine": 16919, + "endLine": 7415, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -29830,15 +29010,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource172", + "logicalId": "Resource76", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 17018, + "startLine": 7514, "startColumn": 7, - "endLine": 17018, + "endLine": 7514, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -29853,15 +29033,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource173", + "logicalId": "Resource77", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 17117, + "startLine": 7613, "startColumn": 7, - "endLine": 17117, + "endLine": 7613, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -29876,15 +29056,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource174", + "logicalId": "Resource78", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 17216, + "startLine": 7712, "startColumn": 7, - "endLine": 17216, + "endLine": 7712, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -29899,15 +29079,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource175", + "logicalId": "Resource79", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 17315, + "startLine": 7811, "startColumn": 7, - "endLine": 17315, + "endLine": 7811, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -29922,15 +29102,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource176", + "logicalId": "Resource80", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 17414, + "startLine": 7910, "startColumn": 7, - "endLine": 17414, + "endLine": 7910, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -29945,15 +29125,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource177", + "logicalId": "Resource81", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 17513, + "startLine": 8009, "startColumn": 7, - "endLine": 17513, + "endLine": 8009, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -29968,15 +29148,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource178", + "logicalId": "Resource82", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 17612, + "startLine": 8108, "startColumn": 7, - "endLine": 17612, + "endLine": 8108, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -29991,15 +29171,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource179", + "logicalId": "Resource83", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 17711, + "startLine": 8207, "startColumn": 7, - "endLine": 17711, + "endLine": 8207, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -30014,15 +29194,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource180", + "logicalId": "Resource84", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 17810, + "startLine": 8306, "startColumn": 7, - "endLine": 17810, + "endLine": 8306, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -30037,15 +29217,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource181", + "logicalId": "Resource85", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 17909, + "startLine": 8405, "startColumn": 7, - "endLine": 17909, + "endLine": 8405, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -30060,15 +29240,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource182", + "logicalId": "Resource86", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 18008, + "startLine": 8504, "startColumn": 7, - "endLine": 18008, + "endLine": 8504, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -30083,15 +29263,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource183", + "logicalId": "Resource87", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 18107, + "startLine": 8603, "startColumn": 7, - "endLine": 18107, + "endLine": 8603, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -30106,15 +29286,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource184", + "logicalId": "Resource88", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 18206, + "startLine": 8702, "startColumn": 7, - "endLine": 18206, + "endLine": 8702, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -30129,15 +29309,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource185", + "logicalId": "Resource89", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 18305, + "startLine": 8801, "startColumn": 7, - "endLine": 18305, + "endLine": 8801, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -30152,15 +29332,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource186", + "logicalId": "Resource90", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 18404, + "startLine": 8900, "startColumn": 7, - "endLine": 18404, + "endLine": 8900, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -30175,15 +29355,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource187", + "logicalId": "Resource91", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 18503, + "startLine": 8999, "startColumn": 7, - "endLine": 18503, + "endLine": 8999, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -30198,15 +29378,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource188", + "logicalId": "Resource92", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 18602, + "startLine": 9098, "startColumn": 7, - "endLine": 18602, + "endLine": 9098, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -30221,15 +29401,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource189", + "logicalId": "Resource93", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 18701, + "startLine": 9197, "startColumn": 7, - "endLine": 18701, + "endLine": 9197, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -30244,15 +29424,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource190", + "logicalId": "Resource94", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 18800, + "startLine": 9296, "startColumn": 7, - "endLine": 18800, + "endLine": 9296, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -30267,15 +29447,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource191", + "logicalId": "Resource95", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 18899, + "startLine": 9395, "startColumn": 7, - "endLine": 18899, + "endLine": 9395, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -30290,15 +29470,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource192", + "logicalId": "Resource96", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 18998, + "startLine": 9494, "startColumn": 7, - "endLine": 18998, + "endLine": 9494, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -30313,15 +29493,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource193", + "logicalId": "Resource97", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 19097, + "startLine": 9593, "startColumn": 7, - "endLine": 19097, + "endLine": 9593, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -30336,15 +29516,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource194", + "logicalId": "Resource98", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 19196, + "startLine": 9692, "startColumn": 7, - "endLine": 19196, + "endLine": 9692, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -30359,15 +29539,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource195", + "logicalId": "Resource99", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 19295, + "startLine": 9791, "startColumn": 7, - "endLine": 19295, + "endLine": 9791, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -30382,15 +29562,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource196", + "logicalId": "Resource100", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 19394, + "startLine": 9890, "startColumn": 7, - "endLine": 19394, + "endLine": 9890, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -30405,15 +29585,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource197", + "logicalId": "Resource101", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 19493, + "startLine": 9989, "startColumn": 7, - "endLine": 19493, + "endLine": 9989, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -30428,15 +29608,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource198", + "logicalId": "Resource102", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 19592, + "startLine": 10088, "startColumn": 7, - "endLine": 19592, + "endLine": 10088, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -30451,15 +29631,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource199", + "logicalId": "Resource103", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 19691, + "startLine": 10187, "startColumn": 7, - "endLine": 19691, + "endLine": 10187, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -30474,15 +29654,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource200", + "logicalId": "Resource104", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 19790, + "startLine": 10286, "startColumn": 7, - "endLine": 19790, + "endLine": 10286, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -30497,15 +29677,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource201", + "logicalId": "Resource105", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 19889, + "startLine": 10385, "startColumn": 7, - "endLine": 19889, + "endLine": 10385, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -30520,15 +29700,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource202", + "logicalId": "Resource106", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 19988, + "startLine": 10484, "startColumn": 7, - "endLine": 19988, + "endLine": 10484, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -30543,15 +29723,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource203", + "logicalId": "Resource107", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 20087, + "startLine": 10583, "startColumn": 7, - "endLine": 20087, + "endLine": 10583, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -30566,15 +29746,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource204", + "logicalId": "Resource108", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 20186, + "startLine": 10682, "startColumn": 7, - "endLine": 20186, + "endLine": 10682, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -30589,15 +29769,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource205", + "logicalId": "Resource109", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 20285, + "startLine": 10781, "startColumn": 7, - "endLine": 20285, + "endLine": 10781, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -30612,15 +29792,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource206", + "logicalId": "Resource110", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 20384, + "startLine": 10880, "startColumn": 7, - "endLine": 20384, + "endLine": 10880, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -30635,15 +29815,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource207", + "logicalId": "Resource111", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 20483, + "startLine": 10979, "startColumn": 7, - "endLine": 20483, + "endLine": 10979, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -30658,15 +29838,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource208", + "logicalId": "Resource112", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 20582, + "startLine": 11078, "startColumn": 7, - "endLine": 20582, + "endLine": 11078, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -30681,15 +29861,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource209", + "logicalId": "Resource113", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 20681, + "startLine": 11177, "startColumn": 7, - "endLine": 20681, + "endLine": 11177, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -30704,15 +29884,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource210", + "logicalId": "Resource114", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 20780, + "startLine": 11276, "startColumn": 7, - "endLine": 20780, + "endLine": 11276, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -30727,15 +29907,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource211", + "logicalId": "Resource115", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 20879, + "startLine": 11375, "startColumn": 7, - "endLine": 20879, + "endLine": 11375, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -30750,15 +29930,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource212", + "logicalId": "Resource116", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 20978, + "startLine": 11474, "startColumn": 7, - "endLine": 20978, + "endLine": 11474, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -30773,15 +29953,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource213", + "logicalId": "Resource117", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 21077, + "startLine": 11573, "startColumn": 7, - "endLine": 21077, + "endLine": 11573, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -30796,15 +29976,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource214", + "logicalId": "Resource118", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 21176, + "startLine": 11672, "startColumn": 7, - "endLine": 21176, + "endLine": 11672, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -30819,15 +29999,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource215", + "logicalId": "Resource119", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 21275, + "startLine": 11771, "startColumn": 7, - "endLine": 21275, + "endLine": 11771, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -30842,15 +30022,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource216", + "logicalId": "Resource120", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 21374, + "startLine": 11870, "startColumn": 7, - "endLine": 21374, + "endLine": 11870, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -30865,15 +30045,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource217", + "logicalId": "Resource121", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 21473, + "startLine": 11969, "startColumn": 7, - "endLine": 21473, + "endLine": 11969, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -30888,15 +30068,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource218", + "logicalId": "Resource122", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 21572, + "startLine": 12068, "startColumn": 7, - "endLine": 21572, + "endLine": 12068, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -30911,15 +30091,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource219", + "logicalId": "Resource123", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 21671, + "startLine": 12167, "startColumn": 7, - "endLine": 21671, + "endLine": 12167, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -30934,15 +30114,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource220", + "logicalId": "Resource124", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 21770, + "startLine": 12266, "startColumn": 7, - "endLine": 21770, + "endLine": 12266, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -30957,15 +30137,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource221", + "logicalId": "Resource125", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 21869, + "startLine": 12365, "startColumn": 7, - "endLine": 21869, + "endLine": 12365, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -30980,15 +30160,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource222", + "logicalId": "Resource126", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 21968, + "startLine": 12464, "startColumn": 7, - "endLine": 21968, + "endLine": 12464, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -31003,15 +30183,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource223", + "logicalId": "Resource127", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 22067, + "startLine": 12563, "startColumn": 7, - "endLine": 22067, + "endLine": 12563, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -31026,15 +30206,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource224", + "logicalId": "Resource128", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 22166, + "startLine": 12662, "startColumn": 7, - "endLine": 22166, + "endLine": 12662, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -31049,15 +30229,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource225", + "logicalId": "Resource129", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 22265, + "startLine": 12761, "startColumn": 7, - "endLine": 22265, + "endLine": 12761, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -31072,15 +30252,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource226", + "logicalId": "Resource130", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 22364, + "startLine": 12860, "startColumn": 7, - "endLine": 22364, + "endLine": 12860, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -31095,15 +30275,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource227", + "logicalId": "Resource131", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 22463, + "startLine": 12959, "startColumn": 7, - "endLine": 22463, + "endLine": 12959, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -31118,15 +30298,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource228", + "logicalId": "Resource132", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 22562, + "startLine": 13058, "startColumn": 7, - "endLine": 22562, + "endLine": 13058, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -31141,15 +30321,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource229", + "logicalId": "Resource133", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 22661, + "startLine": 13157, "startColumn": 7, - "endLine": 22661, + "endLine": 13157, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -31164,15 +30344,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource230", + "logicalId": "Resource134", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 22760, + "startLine": 13256, "startColumn": 7, - "endLine": 22760, + "endLine": 13256, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -31187,15 +30367,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource231", + "logicalId": "Resource135", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 22859, + "startLine": 13355, "startColumn": 7, - "endLine": 22859, + "endLine": 13355, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -31210,15 +30390,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource232", + "logicalId": "Resource136", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 22958, + "startLine": 13454, "startColumn": 7, - "endLine": 22958, + "endLine": 13454, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -31233,15 +30413,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource233", + "logicalId": "Resource137", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 23057, + "startLine": 13553, "startColumn": 7, - "endLine": 23057, + "endLine": 13553, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -31256,15 +30436,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource234", + "logicalId": "Resource138", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 23156, + "startLine": 13652, "startColumn": 7, - "endLine": 23156, + "endLine": 13652, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -31279,15 +30459,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource235", + "logicalId": "Resource139", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 23255, + "startLine": 13751, "startColumn": 7, - "endLine": 23255, + "endLine": 13751, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -31302,15 +30482,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource236", + "logicalId": "Resource140", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 23354, + "startLine": 13850, "startColumn": 7, - "endLine": 23354, + "endLine": 13850, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -31325,15 +30505,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource237", + "logicalId": "Resource141", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 23453, + "startLine": 13949, "startColumn": 7, - "endLine": 23453, + "endLine": 13949, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -31348,15 +30528,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource238", + "logicalId": "Resource142", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 23552, + "startLine": 14048, "startColumn": 7, - "endLine": 23552, + "endLine": 14048, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -31371,15 +30551,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource239", + "logicalId": "Resource143", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 23651, + "startLine": 14147, "startColumn": 7, - "endLine": 23651, + "endLine": 14147, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -31394,15 +30574,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource240", + "logicalId": "Resource144", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 23750, + "startLine": 14246, "startColumn": 7, - "endLine": 23750, + "endLine": 14246, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -31417,15 +30597,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource241", + "logicalId": "Resource145", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 23849, + "startLine": 14345, "startColumn": 7, - "endLine": 23849, + "endLine": 14345, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -31440,15 +30620,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource242", + "logicalId": "Resource146", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 23948, + "startLine": 14444, "startColumn": 7, - "endLine": 23948, + "endLine": 14444, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -31463,15 +30643,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource243", + "logicalId": "Resource147", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 24047, + "startLine": 14543, "startColumn": 7, - "endLine": 24047, + "endLine": 14543, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -31486,15 +30666,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource244", + "logicalId": "Resource148", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 24146, + "startLine": 14642, "startColumn": 7, - "endLine": 24146, + "endLine": 14642, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -31509,15 +30689,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource245", + "logicalId": "Resource149", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 24245, + "startLine": 14741, "startColumn": 7, - "endLine": 24245, + "endLine": 14741, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -31532,15 +30712,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource246", + "logicalId": "Resource150", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 24344, + "startLine": 14840, "startColumn": 7, - "endLine": 24344, + "endLine": 14840, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -31555,15 +30735,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource247", + "logicalId": "Resource151", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 24443, + "startLine": 14939, "startColumn": 7, - "endLine": 24443, + "endLine": 14939, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -31578,15 +30758,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource248", + "logicalId": "Resource152", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 24542, + "startLine": 15038, "startColumn": 7, - "endLine": 24542, + "endLine": 15038, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -31601,15 +30781,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource249", + "logicalId": "Resource153", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 24641, + "startLine": 15137, "startColumn": 7, - "endLine": 24641, + "endLine": 15137, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -31624,15 +30804,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource250", + "logicalId": "Resource154", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 24740, + "startLine": 15236, "startColumn": 7, - "endLine": 24740, + "endLine": 15236, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -31647,15 +30827,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource251", + "logicalId": "Resource155", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 24839, + "startLine": 15335, "startColumn": 7, - "endLine": 24839, + "endLine": 15335, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -31670,15 +30850,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource252", + "logicalId": "Resource156", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 24938, + "startLine": 15434, "startColumn": 7, - "endLine": 24938, + "endLine": 15434, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -31693,15 +30873,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource253", + "logicalId": "Resource157", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 25037, + "startLine": 15533, "startColumn": 7, - "endLine": 25037, + "endLine": 15533, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -31716,15 +30896,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource254", + "logicalId": "Resource158", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 25136, + "startLine": 15632, "startColumn": 7, - "endLine": 25136, + "endLine": 15632, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -31739,15 +30919,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource255", + "logicalId": "Resource159", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 25235, + "startLine": 15731, "startColumn": 7, - "endLine": 25235, + "endLine": 15731, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -31762,15 +30942,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource256", + "logicalId": "Resource160", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 25334, + "startLine": 15830, "startColumn": 7, - "endLine": 25334, + "endLine": 15830, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -31785,15 +30965,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource257", + "logicalId": "Resource161", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 25433, + "startLine": 15929, "startColumn": 7, - "endLine": 25433, + "endLine": 15929, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -31808,15 +30988,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource258", + "logicalId": "Resource162", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 25532, + "startLine": 16028, "startColumn": 7, - "endLine": 25532, + "endLine": 16028, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -31831,15 +31011,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource259", + "logicalId": "Resource163", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 25631, + "startLine": 16127, "startColumn": 7, - "endLine": 25631, + "endLine": 16127, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -31854,15 +31034,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource260", + "logicalId": "Resource164", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 25730, + "startLine": 16226, "startColumn": 7, - "endLine": 25730, + "endLine": 16226, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -31877,15 +31057,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource261", + "logicalId": "Resource165", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 25829, + "startLine": 16325, "startColumn": 7, - "endLine": 25829, + "endLine": 16325, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -31900,15 +31080,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource262", + "logicalId": "Resource166", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 25928, + "startLine": 16424, "startColumn": 7, - "endLine": 25928, + "endLine": 16424, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -31923,15 +31103,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource263", + "logicalId": "Resource167", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 26027, + "startLine": 16523, "startColumn": 7, - "endLine": 26027, + "endLine": 16523, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -31946,15 +31126,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource264", + "logicalId": "Resource168", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 26126, + "startLine": 16622, "startColumn": 7, - "endLine": 26126, + "endLine": 16622, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -31969,15 +31149,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource265", + "logicalId": "Resource169", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 26225, + "startLine": 16721, "startColumn": 7, - "endLine": 26225, + "endLine": 16721, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -31992,15 +31172,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource266", + "logicalId": "Resource170", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 26324, + "startLine": 16820, "startColumn": 7, - "endLine": 26324, + "endLine": 16820, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -32015,15 +31195,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource267", + "logicalId": "Resource171", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 26423, + "startLine": 16919, "startColumn": 7, - "endLine": 26423, + "endLine": 16919, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -32038,15 +31218,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource268", + "logicalId": "Resource172", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 26522, + "startLine": 17018, "startColumn": 7, - "endLine": 26522, + "endLine": 17018, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -32061,15 +31241,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource269", + "logicalId": "Resource173", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 26621, + "startLine": 17117, "startColumn": 7, - "endLine": 26621, + "endLine": 17117, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -32084,15 +31264,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource270", + "logicalId": "Resource174", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 26720, + "startLine": 17216, "startColumn": 7, - "endLine": 26720, + "endLine": 17216, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -32107,15 +31287,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource271", + "logicalId": "Resource175", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 26819, + "startLine": 17315, "startColumn": 7, - "endLine": 26819, + "endLine": 17315, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -32130,15 +31310,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource272", + "logicalId": "Resource176", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 26918, + "startLine": 17414, "startColumn": 7, - "endLine": 26918, + "endLine": 17414, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -32153,15 +31333,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource273", + "logicalId": "Resource177", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 27017, + "startLine": 17513, "startColumn": 7, - "endLine": 27017, + "endLine": 17513, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -32176,15 +31356,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource274", + "logicalId": "Resource178", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 27116, + "startLine": 17612, "startColumn": 7, - "endLine": 27116, + "endLine": 17612, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -32199,15 +31379,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource275", + "logicalId": "Resource179", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 27215, + "startLine": 17711, "startColumn": 7, - "endLine": 27215, + "endLine": 17711, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -32222,15 +31402,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource276", + "logicalId": "Resource180", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 27314, + "startLine": 17810, "startColumn": 7, - "endLine": 27314, + "endLine": 17810, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -32245,15 +31425,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource277", + "logicalId": "Resource181", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 27413, + "startLine": 17909, "startColumn": 7, - "endLine": 27413, + "endLine": 17909, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -32268,15 +31448,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource278", + "logicalId": "Resource182", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 27512, + "startLine": 18008, "startColumn": 7, - "endLine": 27512, + "endLine": 18008, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -32291,15 +31471,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource279", + "logicalId": "Resource183", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 27611, + "startLine": 18107, "startColumn": 7, - "endLine": 27611, + "endLine": 18107, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -32314,15 +31494,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource280", + "logicalId": "Resource184", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 27710, + "startLine": 18206, "startColumn": 7, - "endLine": 27710, + "endLine": 18206, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -32337,15 +31517,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource281", + "logicalId": "Resource185", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 27809, + "startLine": 18305, "startColumn": 7, - "endLine": 27809, + "endLine": 18305, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -32360,15 +31540,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource282", + "logicalId": "Resource186", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 27908, + "startLine": 18404, "startColumn": 7, - "endLine": 27908, + "endLine": 18404, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -32383,15 +31563,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource283", + "logicalId": "Resource187", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 28007, + "startLine": 18503, "startColumn": 7, - "endLine": 28007, + "endLine": 18503, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -32406,15 +31586,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource284", + "logicalId": "Resource188", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 28106, + "startLine": 18602, "startColumn": 7, - "endLine": 28106, + "endLine": 18602, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -32429,15 +31609,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource285", + "logicalId": "Resource189", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 28205, + "startLine": 18701, "startColumn": 7, - "endLine": 28205, + "endLine": 18701, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -32452,15 +31632,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource286", + "logicalId": "Resource190", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 28304, + "startLine": 18800, "startColumn": 7, - "endLine": 28304, + "endLine": 18800, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -32475,15 +31655,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource287", + "logicalId": "Resource191", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 28403, + "startLine": 18899, "startColumn": 7, - "endLine": 28403, + "endLine": 18899, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -32498,15 +31678,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource288", + "logicalId": "Resource192", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 28502, + "startLine": 18998, "startColumn": 7, - "endLine": 28502, + "endLine": 18998, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -32521,15 +31701,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource289", + "logicalId": "Resource193", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 28601, + "startLine": 19097, "startColumn": 7, - "endLine": 28601, + "endLine": 19097, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -32544,15 +31724,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource290", + "logicalId": "Resource194", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 28700, + "startLine": 19196, "startColumn": 7, - "endLine": 28700, + "endLine": 19196, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -32567,15 +31747,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource291", + "logicalId": "Resource195", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 28799, + "startLine": 19295, "startColumn": 7, - "endLine": 28799, + "endLine": 19295, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -32590,15 +31770,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource292", + "logicalId": "Resource196", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 28898, + "startLine": 19394, "startColumn": 7, - "endLine": 28898, + "endLine": 19394, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -32613,15 +31793,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource293", + "logicalId": "Resource197", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 28997, + "startLine": 19493, "startColumn": 7, - "endLine": 28997, + "endLine": 19493, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -32636,15 +31816,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource294", + "logicalId": "Resource198", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 29096, + "startLine": 19592, "startColumn": 7, - "endLine": 29096, + "endLine": 19592, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -32659,15 +31839,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource295", + "logicalId": "Resource199", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 29195, + "startLine": 19691, "startColumn": 7, - "endLine": 29195, + "endLine": 19691, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -32682,15 +31862,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource296", + "logicalId": "Resource200", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 29294, + "startLine": 19790, "startColumn": 7, - "endLine": 29294, + "endLine": 19790, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -32705,15 +31885,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource297", + "logicalId": "Resource201", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 29393, + "startLine": 19889, "startColumn": 7, - "endLine": 29393, + "endLine": 19889, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -32728,15 +31908,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource298", + "logicalId": "Resource202", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 29492, + "startLine": 19988, "startColumn": 7, - "endLine": 29492, + "endLine": 19988, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -32751,15 +31931,15 @@ "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource299", + "logicalId": "Resource203", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Intrinsic Function", - "startLine": 29591, + "startLine": 20087, "startColumn": 7, - "endLine": 29591, + "endLine": 20087, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Validate AMI id format", @@ -32769,2170 +31949,2212 @@ } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", - "source": "CFN_LINT", - "entity": { - "logicalId": "Resource1", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", - "category": "Best Practice", - "startLine": 20, - "startColumn": 15, - "endLine": 20, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" - }, - { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", - "source": "CFN_LINT", - "entity": { - "logicalId": "Resource1", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 55, - "startColumn": 15, - "endLine": 55, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" - }, - { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", - "source": "CFN_LINT", - "entity": { - "logicalId": "Resource1", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 61, - "startColumn": 15, - "endLine": 61, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" - }, - { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", - "source": "CFN_LINT", - "entity": { - "logicalId": "Resource2", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", - "category": "Best Practice", - "startLine": 119, - "startColumn": 15, - "endLine": 119, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" - }, - { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", - "source": "CFN_LINT", - "entity": { - "logicalId": "Resource2", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 154, - "startColumn": 15, - "endLine": 154, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" - }, - { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", - "source": "CFN_LINT", - "entity": { - "logicalId": "Resource2", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 160, - "startColumn": 15, - "endLine": 160, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" - }, - { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", - "source": "CFN_LINT", - "entity": { - "logicalId": "Resource3", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", - "category": "Best Practice", - "startLine": 218, - "startColumn": 15, - "endLine": 218, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" - }, - { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", - "source": "CFN_LINT", - "entity": { - "logicalId": "Resource3", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 253, - "startColumn": 15, - "endLine": 253, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" - }, - { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", - "source": "CFN_LINT", - "entity": { - "logicalId": "Resource3", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 259, - "startColumn": 15, - "endLine": 259, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" - }, - { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", - "source": "CFN_LINT", - "entity": { - "logicalId": "Resource4", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", - "category": "Best Practice", - "startLine": 317, - "startColumn": 15, - "endLine": 317, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" - }, - { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", - "source": "CFN_LINT", - "entity": { - "logicalId": "Resource4", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 352, - "startColumn": 15, - "endLine": 352, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" - }, - { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", - "source": "CFN_LINT", - "entity": { - "logicalId": "Resource4", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 358, - "startColumn": 15, - "endLine": 358, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" - }, - { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", - "source": "CFN_LINT", - "entity": { - "logicalId": "Resource5", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", - "category": "Best Practice", - "startLine": 416, - "startColumn": 15, - "endLine": 416, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" - }, - { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", - "source": "CFN_LINT", - "entity": { - "logicalId": "Resource5", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 451, - "startColumn": 15, - "endLine": 451, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" - }, - { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", - "source": "CFN_LINT", - "entity": { - "logicalId": "Resource5", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 457, - "startColumn": 15, - "endLine": 457, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" - }, - { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", - "source": "CFN_LINT", - "entity": { - "logicalId": "Resource6", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", - "category": "Best Practice", - "startLine": 515, - "startColumn": 15, - "endLine": 515, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" - }, - { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", - "source": "CFN_LINT", - "entity": { - "logicalId": "Resource6", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 550, - "startColumn": 15, - "endLine": 550, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" - }, - { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", - "source": "CFN_LINT", - "entity": { - "logicalId": "Resource6", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 556, - "startColumn": 15, - "endLine": 556, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" - }, - { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource7", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", - "category": "Best Practice", - "startLine": 614, - "startColumn": 15, - "endLine": 614, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "logicalId": "Resource204", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 20186, + "startColumn": 7, + "endLine": 20186, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource7", + "logicalId": "Resource205", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 649, - "startColumn": 15, - "endLine": 649, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 20285, + "startColumn": 7, + "endLine": 20285, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource7", + "logicalId": "Resource206", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 655, - "startColumn": 15, - "endLine": 655, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 20384, + "startColumn": 7, + "endLine": 20384, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource8", + "logicalId": "Resource207", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", - "category": "Best Practice", - "startLine": 713, - "startColumn": 15, - "endLine": 713, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 20483, + "startColumn": 7, + "endLine": 20483, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource8", + "logicalId": "Resource208", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 748, - "startColumn": 15, - "endLine": 748, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 20582, + "startColumn": 7, + "endLine": 20582, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource8", + "logicalId": "Resource209", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 754, - "startColumn": 15, - "endLine": 754, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 20681, + "startColumn": 7, + "endLine": 20681, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource9", + "logicalId": "Resource210", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", - "category": "Best Practice", - "startLine": 812, - "startColumn": 15, - "endLine": 812, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 20780, + "startColumn": 7, + "endLine": 20780, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource9", + "logicalId": "Resource211", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 847, - "startColumn": 15, - "endLine": 847, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 20879, + "startColumn": 7, + "endLine": 20879, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource9", + "logicalId": "Resource212", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 853, - "startColumn": 15, - "endLine": 853, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 20978, + "startColumn": 7, + "endLine": 20978, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource10", + "logicalId": "Resource213", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", - "category": "Best Practice", - "startLine": 911, - "startColumn": 15, - "endLine": 911, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 21077, + "startColumn": 7, + "endLine": 21077, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource10", + "logicalId": "Resource214", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 946, - "startColumn": 15, - "endLine": 946, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 21176, + "startColumn": 7, + "endLine": 21176, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource10", + "logicalId": "Resource215", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 952, - "startColumn": 15, - "endLine": 952, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 21275, + "startColumn": 7, + "endLine": 21275, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource11", + "logicalId": "Resource216", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", - "category": "Best Practice", - "startLine": 1010, - "startColumn": 15, - "endLine": 1010, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 21374, + "startColumn": 7, + "endLine": 21374, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource11", + "logicalId": "Resource217", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 1045, - "startColumn": 15, - "endLine": 1045, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 21473, + "startColumn": 7, + "endLine": 21473, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource11", + "logicalId": "Resource218", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 1051, - "startColumn": 15, - "endLine": 1051, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 21572, + "startColumn": 7, + "endLine": 21572, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource12", + "logicalId": "Resource219", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", - "category": "Best Practice", - "startLine": 1109, - "startColumn": 15, - "endLine": 1109, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 21671, + "startColumn": 7, + "endLine": 21671, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource12", + "logicalId": "Resource220", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 1144, - "startColumn": 15, - "endLine": 1144, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 21770, + "startColumn": 7, + "endLine": 21770, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource12", + "logicalId": "Resource221", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 1150, - "startColumn": 15, - "endLine": 1150, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 21869, + "startColumn": 7, + "endLine": 21869, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource13", + "logicalId": "Resource222", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", - "category": "Best Practice", - "startLine": 1208, - "startColumn": 15, - "endLine": 1208, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 21968, + "startColumn": 7, + "endLine": 21968, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource13", + "logicalId": "Resource223", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 1243, - "startColumn": 15, - "endLine": 1243, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 22067, + "startColumn": 7, + "endLine": 22067, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource13", + "logicalId": "Resource224", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 1249, - "startColumn": 15, - "endLine": 1249, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 22166, + "startColumn": 7, + "endLine": 22166, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource14", + "logicalId": "Resource225", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", - "category": "Best Practice", - "startLine": 1307, - "startColumn": 15, - "endLine": 1307, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 22265, + "startColumn": 7, + "endLine": 22265, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource14", + "logicalId": "Resource226", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 1342, - "startColumn": 15, - "endLine": 1342, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 22364, + "startColumn": 7, + "endLine": 22364, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource14", + "logicalId": "Resource227", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 1348, - "startColumn": 15, - "endLine": 1348, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 22463, + "startColumn": 7, + "endLine": 22463, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource15", + "logicalId": "Resource228", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", - "category": "Best Practice", - "startLine": 1406, - "startColumn": 15, - "endLine": 1406, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 22562, + "startColumn": 7, + "endLine": 22562, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource15", + "logicalId": "Resource229", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 1441, - "startColumn": 15, - "endLine": 1441, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 22661, + "startColumn": 7, + "endLine": 22661, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource15", + "logicalId": "Resource230", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 1447, - "startColumn": 15, - "endLine": 1447, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 22760, + "startColumn": 7, + "endLine": 22760, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource16", + "logicalId": "Resource231", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", - "category": "Best Practice", - "startLine": 1505, - "startColumn": 15, - "endLine": 1505, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 22859, + "startColumn": 7, + "endLine": 22859, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource16", + "logicalId": "Resource232", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 1540, - "startColumn": 15, - "endLine": 1540, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 22958, + "startColumn": 7, + "endLine": 22958, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource16", + "logicalId": "Resource233", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 1546, - "startColumn": 15, - "endLine": 1546, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 23057, + "startColumn": 7, + "endLine": 23057, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource17", + "logicalId": "Resource234", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", - "category": "Best Practice", - "startLine": 1604, - "startColumn": 15, - "endLine": 1604, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 23156, + "startColumn": 7, + "endLine": 23156, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource17", + "logicalId": "Resource235", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 1639, - "startColumn": 15, - "endLine": 1639, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 23255, + "startColumn": 7, + "endLine": 23255, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource17", + "logicalId": "Resource236", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 1645, - "startColumn": 15, - "endLine": 1645, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 23354, + "startColumn": 7, + "endLine": 23354, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource18", + "logicalId": "Resource237", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", - "category": "Best Practice", - "startLine": 1703, - "startColumn": 15, - "endLine": 1703, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 23453, + "startColumn": 7, + "endLine": 23453, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource18", + "logicalId": "Resource238", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 1738, - "startColumn": 15, - "endLine": 1738, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 23552, + "startColumn": 7, + "endLine": 23552, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource18", + "logicalId": "Resource239", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 1744, - "startColumn": 15, - "endLine": 1744, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 23651, + "startColumn": 7, + "endLine": 23651, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource19", + "logicalId": "Resource240", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", - "category": "Best Practice", - "startLine": 1802, - "startColumn": 15, - "endLine": 1802, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 23750, + "startColumn": 7, + "endLine": 23750, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource19", + "logicalId": "Resource241", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 1837, - "startColumn": 15, - "endLine": 1837, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 23849, + "startColumn": 7, + "endLine": 23849, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource19", + "logicalId": "Resource242", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 1843, - "startColumn": 15, - "endLine": 1843, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 23948, + "startColumn": 7, + "endLine": 23948, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource20", + "logicalId": "Resource243", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", - "category": "Best Practice", - "startLine": 1901, - "startColumn": 15, - "endLine": 1901, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 24047, + "startColumn": 7, + "endLine": 24047, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource20", + "logicalId": "Resource244", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 1936, - "startColumn": 15, - "endLine": 1936, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 24146, + "startColumn": 7, + "endLine": 24146, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource20", + "logicalId": "Resource245", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 1942, - "startColumn": 15, - "endLine": 1942, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 24245, + "startColumn": 7, + "endLine": 24245, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource21", + "logicalId": "Resource246", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", - "category": "Best Practice", - "startLine": 2000, - "startColumn": 15, - "endLine": 2000, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 24344, + "startColumn": 7, + "endLine": 24344, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource21", + "logicalId": "Resource247", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 2035, - "startColumn": 15, - "endLine": 2035, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 24443, + "startColumn": 7, + "endLine": 24443, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource21", + "logicalId": "Resource248", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 2041, - "startColumn": 15, - "endLine": 2041, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 24542, + "startColumn": 7, + "endLine": 24542, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource22", + "logicalId": "Resource249", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", - "category": "Best Practice", - "startLine": 2099, - "startColumn": 15, - "endLine": 2099, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 24641, + "startColumn": 7, + "endLine": 24641, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource22", + "logicalId": "Resource250", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 2134, - "startColumn": 15, - "endLine": 2134, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 24740, + "startColumn": 7, + "endLine": 24740, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource22", + "logicalId": "Resource251", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 2140, - "startColumn": 15, - "endLine": 2140, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 24839, + "startColumn": 7, + "endLine": 24839, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource23", + "logicalId": "Resource252", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", - "category": "Best Practice", - "startLine": 2198, - "startColumn": 15, - "endLine": 2198, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 24938, + "startColumn": 7, + "endLine": 24938, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource23", + "logicalId": "Resource253", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 2233, - "startColumn": 15, - "endLine": 2233, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 25037, + "startColumn": 7, + "endLine": 25037, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource23", + "logicalId": "Resource254", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 2239, - "startColumn": 15, - "endLine": 2239, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 25136, + "startColumn": 7, + "endLine": 25136, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource24", + "logicalId": "Resource255", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", - "category": "Best Practice", - "startLine": 2297, - "startColumn": 15, - "endLine": 2297, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 25235, + "startColumn": 7, + "endLine": 25235, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource24", + "logicalId": "Resource256", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 2332, - "startColumn": 15, - "endLine": 2332, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 25334, + "startColumn": 7, + "endLine": 25334, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource24", + "logicalId": "Resource257", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 2338, - "startColumn": 15, - "endLine": 2338, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 25433, + "startColumn": 7, + "endLine": 25433, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource25", + "logicalId": "Resource258", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", - "category": "Best Practice", - "startLine": 2396, - "startColumn": 15, - "endLine": 2396, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 25532, + "startColumn": 7, + "endLine": 25532, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource25", + "logicalId": "Resource259", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 2431, - "startColumn": 15, - "endLine": 2431, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 25631, + "startColumn": 7, + "endLine": 25631, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource25", + "logicalId": "Resource260", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 2437, - "startColumn": 15, - "endLine": 2437, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 25730, + "startColumn": 7, + "endLine": 25730, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource26", + "logicalId": "Resource261", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", - "category": "Best Practice", - "startLine": 2495, - "startColumn": 15, - "endLine": 2495, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 25829, + "startColumn": 7, + "endLine": 25829, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource26", + "logicalId": "Resource262", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 2530, - "startColumn": 15, - "endLine": 2530, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 25928, + "startColumn": 7, + "endLine": 25928, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource26", + "logicalId": "Resource263", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 2536, - "startColumn": 15, - "endLine": 2536, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 26027, + "startColumn": 7, + "endLine": 26027, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource27", + "logicalId": "Resource264", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", - "category": "Best Practice", - "startLine": 2594, - "startColumn": 15, - "endLine": 2594, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 26126, + "startColumn": 7, + "endLine": 26126, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource27", + "logicalId": "Resource265", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 2629, - "startColumn": 15, - "endLine": 2629, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 26225, + "startColumn": 7, + "endLine": 26225, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource27", + "logicalId": "Resource266", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 2635, - "startColumn": 15, - "endLine": 2635, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 26324, + "startColumn": 7, + "endLine": 26324, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource28", + "logicalId": "Resource267", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", - "category": "Best Practice", - "startLine": 2693, - "startColumn": 15, - "endLine": 2693, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 26423, + "startColumn": 7, + "endLine": 26423, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource28", + "logicalId": "Resource268", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 2728, - "startColumn": 15, - "endLine": 2728, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 26522, + "startColumn": 7, + "endLine": 26522, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource28", + "logicalId": "Resource269", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 2734, - "startColumn": 15, - "endLine": 2734, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 26621, + "startColumn": 7, + "endLine": 26621, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource29", + "logicalId": "Resource270", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", - "category": "Best Practice", - "startLine": 2792, - "startColumn": 15, - "endLine": 2792, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 26720, + "startColumn": 7, + "endLine": 26720, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource29", + "logicalId": "Resource271", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 2827, - "startColumn": 15, - "endLine": 2827, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 26819, + "startColumn": 7, + "endLine": 26819, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource29", + "logicalId": "Resource272", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 2833, - "startColumn": 15, - "endLine": 2833, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 26918, + "startColumn": 7, + "endLine": 26918, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource30", + "logicalId": "Resource273", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", - "category": "Best Practice", - "startLine": 2891, - "startColumn": 15, - "endLine": 2891, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 27017, + "startColumn": 7, + "endLine": 27017, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource30", + "logicalId": "Resource274", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 2926, - "startColumn": 15, - "endLine": 2926, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 27116, + "startColumn": 7, + "endLine": 27116, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource30", + "logicalId": "Resource275", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 2932, - "startColumn": 15, - "endLine": 2932, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 27215, + "startColumn": 7, + "endLine": 27215, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource31", + "logicalId": "Resource276", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", - "category": "Best Practice", - "startLine": 2990, - "startColumn": 15, - "endLine": 2990, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 27314, + "startColumn": 7, + "endLine": 27314, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource31", + "logicalId": "Resource277", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 3025, - "startColumn": 15, - "endLine": 3025, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 27413, + "startColumn": 7, + "endLine": 27413, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource31", + "logicalId": "Resource278", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 3031, - "startColumn": 15, - "endLine": 3031, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 27512, + "startColumn": 7, + "endLine": 27512, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource32", + "logicalId": "Resource279", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", - "category": "Best Practice", - "startLine": 3089, - "startColumn": 15, - "endLine": 3089, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 27611, + "startColumn": 7, + "endLine": 27611, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource32", + "logicalId": "Resource280", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 3124, - "startColumn": 15, - "endLine": 3124, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 27710, + "startColumn": 7, + "endLine": 27710, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource32", + "logicalId": "Resource281", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 3130, - "startColumn": 15, - "endLine": 3130, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 27809, + "startColumn": 7, + "endLine": 27809, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource33", + "logicalId": "Resource282", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", - "category": "Best Practice", - "startLine": 3188, - "startColumn": 15, - "endLine": 3188, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 27908, + "startColumn": 7, + "endLine": 27908, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource33", + "logicalId": "Resource283", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 3223, - "startColumn": 15, - "endLine": 3223, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 28007, + "startColumn": 7, + "endLine": 28007, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource33", + "logicalId": "Resource284", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 3229, - "startColumn": 15, - "endLine": 3229, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 28106, + "startColumn": 7, + "endLine": 28106, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource34", + "logicalId": "Resource285", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", - "category": "Best Practice", - "startLine": 3287, - "startColumn": 15, - "endLine": 3287, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 28205, + "startColumn": 7, + "endLine": 28205, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource34", + "logicalId": "Resource286", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 3322, - "startColumn": 15, - "endLine": 3322, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 28304, + "startColumn": 7, + "endLine": 28304, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource34", + "logicalId": "Resource287", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 3328, - "startColumn": 15, - "endLine": 3328, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 28403, + "startColumn": 7, + "endLine": 28403, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource35", + "logicalId": "Resource288", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", - "category": "Best Practice", - "startLine": 3386, - "startColumn": 15, - "endLine": 3386, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 28502, + "startColumn": 7, + "endLine": 28502, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource35", + "logicalId": "Resource289", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 3421, - "startColumn": 15, - "endLine": 3421, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 28601, + "startColumn": 7, + "endLine": 28601, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource35", + "logicalId": "Resource290", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 3427, - "startColumn": 15, - "endLine": 3427, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 28700, + "startColumn": 7, + "endLine": 28700, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource36", + "logicalId": "Resource291", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", - "category": "Best Practice", - "startLine": 3485, - "startColumn": 15, - "endLine": 3485, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 28799, + "startColumn": 7, + "endLine": 28799, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource36", + "logicalId": "Resource292", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 3520, - "startColumn": 15, - "endLine": 3520, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 28898, + "startColumn": 7, + "endLine": 28898, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource36", + "logicalId": "Resource293", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 3526, - "startColumn": 15, - "endLine": 3526, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 28997, + "startColumn": 7, + "endLine": 28997, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource37", + "logicalId": "Resource294", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", - "category": "Best Practice", - "startLine": 3584, - "startColumn": 15, - "endLine": 3584, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 29096, + "startColumn": 7, + "endLine": 29096, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource37", + "logicalId": "Resource295", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 3619, - "startColumn": 15, - "endLine": 3619, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 29195, + "startColumn": 7, + "endLine": 29195, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource37", + "logicalId": "Resource296", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 3625, - "startColumn": 15, - "endLine": 3625, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 29294, + "startColumn": 7, + "endLine": 29294, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource38", + "logicalId": "Resource297", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", - "category": "Best Practice", - "startLine": 3683, - "startColumn": 15, - "endLine": 3683, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 29393, + "startColumn": 7, + "endLine": 29393, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource38", + "logicalId": "Resource298", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 3718, - "startColumn": 15, - "endLine": 3718, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 29492, + "startColumn": 7, + "endLine": 29492, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-ami' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Resource38", + "logicalId": "Resource299", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", - "category": "Best Practice", - "startLine": 3724, - "startColumn": 15, - "endLine": 3724, - "endColumn": 22, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 29591, + "startColumn": 7, + "endLine": 29591, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-ami" + } }, { "ruleId": "W1020", @@ -34940,15 +34162,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource39", + "logicalId": "Resource1", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 3782, + "startLine": 20, "startColumn": 15, - "endLine": 3782, + "endLine": 20, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -34959,15 +34181,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource39", + "logicalId": "Resource1", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 3817, + "startLine": 55, "startColumn": 15, - "endLine": 3817, + "endLine": 55, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -34978,15 +34200,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource39", + "logicalId": "Resource1", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 3823, + "startLine": 61, "startColumn": 15, - "endLine": 3823, + "endLine": 61, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -34997,15 +34219,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource40", + "logicalId": "Resource2", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 3881, + "startLine": 119, "startColumn": 15, - "endLine": 3881, + "endLine": 119, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -35016,15 +34238,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource40", + "logicalId": "Resource2", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 3916, + "startLine": 154, "startColumn": 15, - "endLine": 3916, + "endLine": 154, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -35035,15 +34257,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource40", + "logicalId": "Resource2", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 3922, + "startLine": 160, "startColumn": 15, - "endLine": 3922, + "endLine": 160, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -35054,15 +34276,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource41", + "logicalId": "Resource3", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 3980, + "startLine": 218, "startColumn": 15, - "endLine": 3980, + "endLine": 218, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -35073,15 +34295,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource41", + "logicalId": "Resource3", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 4015, + "startLine": 253, "startColumn": 15, - "endLine": 4015, + "endLine": 253, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -35092,15 +34314,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource41", + "logicalId": "Resource3", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 4021, + "startLine": 259, "startColumn": 15, - "endLine": 4021, + "endLine": 259, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -35111,15 +34333,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource42", + "logicalId": "Resource4", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 4079, + "startLine": 317, "startColumn": 15, - "endLine": 4079, + "endLine": 317, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -35130,15 +34352,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource42", + "logicalId": "Resource4", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 4114, + "startLine": 352, "startColumn": 15, - "endLine": 4114, + "endLine": 352, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -35149,15 +34371,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource42", + "logicalId": "Resource4", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 4120, + "startLine": 358, "startColumn": 15, - "endLine": 4120, + "endLine": 358, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -35168,15 +34390,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource43", + "logicalId": "Resource5", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 4178, + "startLine": 416, "startColumn": 15, - "endLine": 4178, + "endLine": 416, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -35187,15 +34409,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource43", + "logicalId": "Resource5", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 4213, + "startLine": 451, "startColumn": 15, - "endLine": 4213, + "endLine": 451, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -35206,15 +34428,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource43", + "logicalId": "Resource5", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 4219, + "startLine": 457, "startColumn": 15, - "endLine": 4219, + "endLine": 457, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -35225,15 +34447,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource44", + "logicalId": "Resource6", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 4277, + "startLine": 515, "startColumn": 15, - "endLine": 4277, + "endLine": 515, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -35244,15 +34466,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource44", + "logicalId": "Resource6", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 4312, + "startLine": 550, "startColumn": 15, - "endLine": 4312, + "endLine": 550, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -35263,15 +34485,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource44", + "logicalId": "Resource6", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 4318, + "startLine": 556, "startColumn": 15, - "endLine": 4318, + "endLine": 556, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -35282,15 +34504,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource45", + "logicalId": "Resource7", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 4376, + "startLine": 614, "startColumn": 15, - "endLine": 4376, + "endLine": 614, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -35301,15 +34523,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource45", + "logicalId": "Resource7", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 4411, + "startLine": 649, "startColumn": 15, - "endLine": 4411, + "endLine": 649, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -35320,15 +34542,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource45", + "logicalId": "Resource7", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 4417, + "startLine": 655, "startColumn": 15, - "endLine": 4417, + "endLine": 655, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -35339,15 +34561,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource46", + "logicalId": "Resource8", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 4475, + "startLine": 713, "startColumn": 15, - "endLine": 4475, + "endLine": 713, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -35358,15 +34580,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource46", + "logicalId": "Resource8", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 4510, + "startLine": 748, "startColumn": 15, - "endLine": 4510, + "endLine": 748, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -35377,15 +34599,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource46", + "logicalId": "Resource8", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 4516, + "startLine": 754, "startColumn": 15, - "endLine": 4516, + "endLine": 754, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -35396,15 +34618,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource47", + "logicalId": "Resource9", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 4574, + "startLine": 812, "startColumn": 15, - "endLine": 4574, + "endLine": 812, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -35415,15 +34637,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource47", + "logicalId": "Resource9", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 4609, + "startLine": 847, "startColumn": 15, - "endLine": 4609, + "endLine": 847, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -35434,15 +34656,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource47", + "logicalId": "Resource9", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 4615, + "startLine": 853, "startColumn": 15, - "endLine": 4615, + "endLine": 853, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -35453,15 +34675,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource48", + "logicalId": "Resource10", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 4673, + "startLine": 911, "startColumn": 15, - "endLine": 4673, + "endLine": 911, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -35472,15 +34694,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource48", + "logicalId": "Resource10", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 4708, + "startLine": 946, "startColumn": 15, - "endLine": 4708, + "endLine": 946, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -35491,15 +34713,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource48", + "logicalId": "Resource10", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 4714, + "startLine": 952, "startColumn": 15, - "endLine": 4714, + "endLine": 952, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -35510,15 +34732,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource49", + "logicalId": "Resource11", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 4772, + "startLine": 1010, "startColumn": 15, - "endLine": 4772, + "endLine": 1010, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -35529,15 +34751,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource49", + "logicalId": "Resource11", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 4807, + "startLine": 1045, "startColumn": 15, - "endLine": 4807, + "endLine": 1045, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -35548,15 +34770,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource49", + "logicalId": "Resource11", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 4813, + "startLine": 1051, "startColumn": 15, - "endLine": 4813, + "endLine": 1051, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -35567,15 +34789,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource50", + "logicalId": "Resource12", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 4871, + "startLine": 1109, "startColumn": 15, - "endLine": 4871, + "endLine": 1109, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -35586,15 +34808,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource50", + "logicalId": "Resource12", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 4906, + "startLine": 1144, "startColumn": 15, - "endLine": 4906, + "endLine": 1144, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -35605,15 +34827,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource50", + "logicalId": "Resource12", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 4912, + "startLine": 1150, "startColumn": 15, - "endLine": 4912, + "endLine": 1150, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -35624,15 +34846,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource51", + "logicalId": "Resource13", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 4970, + "startLine": 1208, "startColumn": 15, - "endLine": 4970, + "endLine": 1208, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -35643,15 +34865,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource51", + "logicalId": "Resource13", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 5005, + "startLine": 1243, "startColumn": 15, - "endLine": 5005, + "endLine": 1243, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -35662,15 +34884,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource51", + "logicalId": "Resource13", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 5011, + "startLine": 1249, "startColumn": 15, - "endLine": 5011, + "endLine": 1249, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -35681,15 +34903,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource52", + "logicalId": "Resource14", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 5069, + "startLine": 1307, "startColumn": 15, - "endLine": 5069, + "endLine": 1307, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -35700,15 +34922,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource52", + "logicalId": "Resource14", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 5104, + "startLine": 1342, "startColumn": 15, - "endLine": 5104, + "endLine": 1342, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -35719,15 +34941,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource52", + "logicalId": "Resource14", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 5110, + "startLine": 1348, "startColumn": 15, - "endLine": 5110, + "endLine": 1348, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -35738,15 +34960,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource53", + "logicalId": "Resource15", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 5168, + "startLine": 1406, "startColumn": 15, - "endLine": 5168, + "endLine": 1406, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -35757,15 +34979,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource53", + "logicalId": "Resource15", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 5203, + "startLine": 1441, "startColumn": 15, - "endLine": 5203, + "endLine": 1441, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -35776,15 +34998,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource53", + "logicalId": "Resource15", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 5209, + "startLine": 1447, "startColumn": 15, - "endLine": 5209, + "endLine": 1447, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -35795,15 +35017,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource54", + "logicalId": "Resource16", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 5267, + "startLine": 1505, "startColumn": 15, - "endLine": 5267, + "endLine": 1505, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -35814,15 +35036,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource54", + "logicalId": "Resource16", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 5302, + "startLine": 1540, "startColumn": 15, - "endLine": 5302, + "endLine": 1540, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -35833,15 +35055,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource54", + "logicalId": "Resource16", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 5308, + "startLine": 1546, "startColumn": 15, - "endLine": 5308, + "endLine": 1546, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -35852,15 +35074,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource55", + "logicalId": "Resource17", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 5366, + "startLine": 1604, "startColumn": 15, - "endLine": 5366, + "endLine": 1604, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -35871,15 +35093,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource55", + "logicalId": "Resource17", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 5401, + "startLine": 1639, "startColumn": 15, - "endLine": 5401, + "endLine": 1639, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -35890,15 +35112,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource55", + "logicalId": "Resource17", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 5407, + "startLine": 1645, "startColumn": 15, - "endLine": 5407, + "endLine": 1645, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -35909,15 +35131,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource56", + "logicalId": "Resource18", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 5465, + "startLine": 1703, "startColumn": 15, - "endLine": 5465, + "endLine": 1703, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -35928,15 +35150,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource56", + "logicalId": "Resource18", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 5500, + "startLine": 1738, "startColumn": 15, - "endLine": 5500, + "endLine": 1738, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -35947,15 +35169,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource56", + "logicalId": "Resource18", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 5506, + "startLine": 1744, "startColumn": 15, - "endLine": 5506, + "endLine": 1744, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -35966,15 +35188,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource57", + "logicalId": "Resource19", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 5564, + "startLine": 1802, "startColumn": 15, - "endLine": 5564, + "endLine": 1802, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -35985,15 +35207,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource57", + "logicalId": "Resource19", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 5599, + "startLine": 1837, "startColumn": 15, - "endLine": 5599, + "endLine": 1837, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -36004,15 +35226,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource57", + "logicalId": "Resource19", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 5605, + "startLine": 1843, "startColumn": 15, - "endLine": 5605, + "endLine": 1843, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -36023,15 +35245,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource58", + "logicalId": "Resource20", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 5663, + "startLine": 1901, "startColumn": 15, - "endLine": 5663, + "endLine": 1901, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -36042,15 +35264,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource58", + "logicalId": "Resource20", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 5698, + "startLine": 1936, "startColumn": 15, - "endLine": 5698, + "endLine": 1936, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -36061,15 +35283,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource58", + "logicalId": "Resource20", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 5704, + "startLine": 1942, "startColumn": 15, - "endLine": 5704, + "endLine": 1942, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -36080,15 +35302,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource59", + "logicalId": "Resource21", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 5762, + "startLine": 2000, "startColumn": 15, - "endLine": 5762, + "endLine": 2000, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -36099,15 +35321,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource59", + "logicalId": "Resource21", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 5797, + "startLine": 2035, "startColumn": 15, - "endLine": 5797, + "endLine": 2035, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -36118,15 +35340,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource59", + "logicalId": "Resource21", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 5803, + "startLine": 2041, "startColumn": 15, - "endLine": 5803, + "endLine": 2041, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -36137,15 +35359,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource60", + "logicalId": "Resource22", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 5861, + "startLine": 2099, "startColumn": 15, - "endLine": 5861, + "endLine": 2099, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -36156,15 +35378,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource60", + "logicalId": "Resource22", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 5896, + "startLine": 2134, "startColumn": 15, - "endLine": 5896, + "endLine": 2134, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -36175,15 +35397,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource60", + "logicalId": "Resource22", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 5902, + "startLine": 2140, "startColumn": 15, - "endLine": 5902, + "endLine": 2140, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -36194,15 +35416,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource61", + "logicalId": "Resource23", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 5960, + "startLine": 2198, "startColumn": 15, - "endLine": 5960, + "endLine": 2198, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -36213,15 +35435,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource61", + "logicalId": "Resource23", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 5995, + "startLine": 2233, "startColumn": 15, - "endLine": 5995, + "endLine": 2233, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -36232,15 +35454,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource61", + "logicalId": "Resource23", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 6001, + "startLine": 2239, "startColumn": 15, - "endLine": 6001, + "endLine": 2239, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -36251,15 +35473,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource62", + "logicalId": "Resource24", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 6059, + "startLine": 2297, "startColumn": 15, - "endLine": 6059, + "endLine": 2297, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -36270,15 +35492,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource62", + "logicalId": "Resource24", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 6094, + "startLine": 2332, "startColumn": 15, - "endLine": 6094, + "endLine": 2332, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -36289,15 +35511,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource62", + "logicalId": "Resource24", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 6100, + "startLine": 2338, "startColumn": 15, - "endLine": 6100, + "endLine": 2338, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -36308,15 +35530,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource63", + "logicalId": "Resource25", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 6158, + "startLine": 2396, "startColumn": 15, - "endLine": 6158, + "endLine": 2396, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -36327,15 +35549,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource63", + "logicalId": "Resource25", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 6193, + "startLine": 2431, "startColumn": 15, - "endLine": 6193, + "endLine": 2431, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -36346,15 +35568,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource63", + "logicalId": "Resource25", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 6199, + "startLine": 2437, "startColumn": 15, - "endLine": 6199, + "endLine": 2437, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -36365,15 +35587,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource64", + "logicalId": "Resource26", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 6257, + "startLine": 2495, "startColumn": 15, - "endLine": 6257, + "endLine": 2495, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -36384,15 +35606,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource64", + "logicalId": "Resource26", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 6292, + "startLine": 2530, "startColumn": 15, - "endLine": 6292, + "endLine": 2530, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -36403,15 +35625,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource64", + "logicalId": "Resource26", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 6298, + "startLine": 2536, "startColumn": 15, - "endLine": 6298, + "endLine": 2536, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -36422,15 +35644,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource65", + "logicalId": "Resource27", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 6356, + "startLine": 2594, "startColumn": 15, - "endLine": 6356, + "endLine": 2594, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -36441,15 +35663,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource65", + "logicalId": "Resource27", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 6391, + "startLine": 2629, "startColumn": 15, - "endLine": 6391, + "endLine": 2629, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -36460,15 +35682,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource65", + "logicalId": "Resource27", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 6397, + "startLine": 2635, "startColumn": 15, - "endLine": 6397, + "endLine": 2635, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -36479,15 +35701,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource66", + "logicalId": "Resource28", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 6455, + "startLine": 2693, "startColumn": 15, - "endLine": 6455, + "endLine": 2693, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -36498,15 +35720,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource66", + "logicalId": "Resource28", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 6490, + "startLine": 2728, "startColumn": 15, - "endLine": 6490, + "endLine": 2728, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -36517,15 +35739,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource66", + "logicalId": "Resource28", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 6496, + "startLine": 2734, "startColumn": 15, - "endLine": 6496, + "endLine": 2734, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -36536,15 +35758,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource67", + "logicalId": "Resource29", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 6554, + "startLine": 2792, "startColumn": 15, - "endLine": 6554, + "endLine": 2792, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -36555,15 +35777,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource67", + "logicalId": "Resource29", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 6589, + "startLine": 2827, "startColumn": 15, - "endLine": 6589, + "endLine": 2827, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -36574,15 +35796,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource67", + "logicalId": "Resource29", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 6595, + "startLine": 2833, "startColumn": 15, - "endLine": 6595, + "endLine": 2833, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -36593,15 +35815,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource68", + "logicalId": "Resource30", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 6653, + "startLine": 2891, "startColumn": 15, - "endLine": 6653, + "endLine": 2891, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -36612,15 +35834,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource68", + "logicalId": "Resource30", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 6688, + "startLine": 2926, "startColumn": 15, - "endLine": 6688, + "endLine": 2926, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -36631,15 +35853,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource68", + "logicalId": "Resource30", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 6694, + "startLine": 2932, "startColumn": 15, - "endLine": 6694, + "endLine": 2932, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -36650,15 +35872,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource69", + "logicalId": "Resource31", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 6752, + "startLine": 2990, "startColumn": 15, - "endLine": 6752, + "endLine": 2990, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -36669,15 +35891,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource69", + "logicalId": "Resource31", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 6787, + "startLine": 3025, "startColumn": 15, - "endLine": 6787, + "endLine": 3025, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -36688,15 +35910,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource69", + "logicalId": "Resource31", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 6793, + "startLine": 3031, "startColumn": 15, - "endLine": 6793, + "endLine": 3031, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -36707,15 +35929,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource70", + "logicalId": "Resource32", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 6851, + "startLine": 3089, "startColumn": 15, - "endLine": 6851, + "endLine": 3089, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -36726,15 +35948,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource70", + "logicalId": "Resource32", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 6886, + "startLine": 3124, "startColumn": 15, - "endLine": 6886, + "endLine": 3124, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -36745,15 +35967,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource70", + "logicalId": "Resource32", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 6892, + "startLine": 3130, "startColumn": 15, - "endLine": 6892, + "endLine": 3130, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -36764,15 +35986,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource71", + "logicalId": "Resource33", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 6950, + "startLine": 3188, "startColumn": 15, - "endLine": 6950, + "endLine": 3188, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -36783,15 +36005,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource71", + "logicalId": "Resource33", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 6985, + "startLine": 3223, "startColumn": 15, - "endLine": 6985, + "endLine": 3223, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -36802,15 +36024,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource71", + "logicalId": "Resource33", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 6991, + "startLine": 3229, "startColumn": 15, - "endLine": 6991, + "endLine": 3229, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -36821,15 +36043,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource72", + "logicalId": "Resource34", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 7049, + "startLine": 3287, "startColumn": 15, - "endLine": 7049, + "endLine": 3287, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -36840,15 +36062,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource72", + "logicalId": "Resource34", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 7084, + "startLine": 3322, "startColumn": 15, - "endLine": 7084, + "endLine": 3322, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -36859,15 +36081,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource72", + "logicalId": "Resource34", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 7090, + "startLine": 3328, "startColumn": 15, - "endLine": 7090, + "endLine": 3328, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -36878,15 +36100,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource73", + "logicalId": "Resource35", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 7148, + "startLine": 3386, "startColumn": 15, - "endLine": 7148, + "endLine": 3386, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -36897,15 +36119,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource73", + "logicalId": "Resource35", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 7183, + "startLine": 3421, "startColumn": 15, - "endLine": 7183, + "endLine": 3421, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -36916,15 +36138,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource73", + "logicalId": "Resource35", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 7189, + "startLine": 3427, "startColumn": 15, - "endLine": 7189, + "endLine": 3427, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -36935,15 +36157,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource74", + "logicalId": "Resource36", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 7247, + "startLine": 3485, "startColumn": 15, - "endLine": 7247, + "endLine": 3485, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -36954,15 +36176,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource74", + "logicalId": "Resource36", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 7282, + "startLine": 3520, "startColumn": 15, - "endLine": 7282, + "endLine": 3520, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -36973,15 +36195,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource74", + "logicalId": "Resource36", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 7288, + "startLine": 3526, "startColumn": 15, - "endLine": 7288, + "endLine": 3526, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -36992,15 +36214,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource75", + "logicalId": "Resource37", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 7346, + "startLine": 3584, "startColumn": 15, - "endLine": 7346, + "endLine": 3584, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -37011,15 +36233,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource75", + "logicalId": "Resource37", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 7381, + "startLine": 3619, "startColumn": 15, - "endLine": 7381, + "endLine": 3619, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -37030,15 +36252,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource75", + "logicalId": "Resource37", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 7387, + "startLine": 3625, "startColumn": 15, - "endLine": 7387, + "endLine": 3625, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -37049,15 +36271,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource76", + "logicalId": "Resource38", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 7445, + "startLine": 3683, "startColumn": 15, - "endLine": 7445, + "endLine": 3683, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -37068,15 +36290,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource76", + "logicalId": "Resource38", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 7480, + "startLine": 3718, "startColumn": 15, - "endLine": 7480, + "endLine": 3718, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -37087,15 +36309,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource76", + "logicalId": "Resource38", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 7486, + "startLine": 3724, "startColumn": 15, - "endLine": 7486, + "endLine": 3724, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -37106,15 +36328,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource77", + "logicalId": "Resource39", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 7544, + "startLine": 3782, "startColumn": 15, - "endLine": 7544, + "endLine": 3782, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -37125,15 +36347,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource77", + "logicalId": "Resource39", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 7579, + "startLine": 3817, "startColumn": 15, - "endLine": 7579, + "endLine": 3817, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -37144,15 +36366,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource77", + "logicalId": "Resource39", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 7585, + "startLine": 3823, "startColumn": 15, - "endLine": 7585, + "endLine": 3823, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -37163,15 +36385,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource78", + "logicalId": "Resource40", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 7643, + "startLine": 3881, "startColumn": 15, - "endLine": 7643, + "endLine": 3881, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -37182,15 +36404,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource78", + "logicalId": "Resource40", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 7678, + "startLine": 3916, "startColumn": 15, - "endLine": 7678, + "endLine": 3916, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -37201,15 +36423,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource78", + "logicalId": "Resource40", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 7684, + "startLine": 3922, "startColumn": 15, - "endLine": 7684, + "endLine": 3922, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -37220,15 +36442,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource79", + "logicalId": "Resource41", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 7742, + "startLine": 3980, "startColumn": 15, - "endLine": 7742, + "endLine": 3980, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -37239,15 +36461,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource79", + "logicalId": "Resource41", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 7777, + "startLine": 4015, "startColumn": 15, - "endLine": 7777, + "endLine": 4015, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -37258,15 +36480,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource79", + "logicalId": "Resource41", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 7783, + "startLine": 4021, "startColumn": 15, - "endLine": 7783, + "endLine": 4021, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -37277,15 +36499,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource80", + "logicalId": "Resource42", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 7841, + "startLine": 4079, "startColumn": 15, - "endLine": 7841, + "endLine": 4079, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -37296,15 +36518,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource80", + "logicalId": "Resource42", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 7876, + "startLine": 4114, "startColumn": 15, - "endLine": 7876, + "endLine": 4114, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -37315,15 +36537,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource80", + "logicalId": "Resource42", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 7882, + "startLine": 4120, "startColumn": 15, - "endLine": 7882, + "endLine": 4120, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -37334,15 +36556,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource81", + "logicalId": "Resource43", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 7940, + "startLine": 4178, "startColumn": 15, - "endLine": 7940, + "endLine": 4178, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -37353,15 +36575,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource81", + "logicalId": "Resource43", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 7975, + "startLine": 4213, "startColumn": 15, - "endLine": 7975, + "endLine": 4213, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -37372,15 +36594,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource81", + "logicalId": "Resource43", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 7981, + "startLine": 4219, "startColumn": 15, - "endLine": 7981, + "endLine": 4219, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -37391,15 +36613,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource82", + "logicalId": "Resource44", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 8039, + "startLine": 4277, "startColumn": 15, - "endLine": 8039, + "endLine": 4277, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -37410,15 +36632,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource82", + "logicalId": "Resource44", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 8074, + "startLine": 4312, "startColumn": 15, - "endLine": 8074, + "endLine": 4312, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -37429,15 +36651,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource82", + "logicalId": "Resource44", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 8080, + "startLine": 4318, "startColumn": 15, - "endLine": 8080, + "endLine": 4318, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -37448,15 +36670,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource83", + "logicalId": "Resource45", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 8138, + "startLine": 4376, "startColumn": 15, - "endLine": 8138, + "endLine": 4376, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -37467,15 +36689,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource83", + "logicalId": "Resource45", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 8173, + "startLine": 4411, "startColumn": 15, - "endLine": 8173, + "endLine": 4411, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -37486,15 +36708,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource83", + "logicalId": "Resource45", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 8179, + "startLine": 4417, "startColumn": 15, - "endLine": 8179, + "endLine": 4417, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -37505,15 +36727,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource84", + "logicalId": "Resource46", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 8237, + "startLine": 4475, "startColumn": 15, - "endLine": 8237, + "endLine": 4475, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -37524,15 +36746,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource84", + "logicalId": "Resource46", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 8272, + "startLine": 4510, "startColumn": 15, - "endLine": 8272, + "endLine": 4510, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -37543,15 +36765,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource84", + "logicalId": "Resource46", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 8278, + "startLine": 4516, "startColumn": 15, - "endLine": 8278, + "endLine": 4516, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -37562,15 +36784,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource85", + "logicalId": "Resource47", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 8336, + "startLine": 4574, "startColumn": 15, - "endLine": 8336, + "endLine": 4574, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -37581,15 +36803,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource85", + "logicalId": "Resource47", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 8371, + "startLine": 4609, "startColumn": 15, - "endLine": 8371, + "endLine": 4609, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -37600,15 +36822,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource85", + "logicalId": "Resource47", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 8377, + "startLine": 4615, "startColumn": 15, - "endLine": 8377, + "endLine": 4615, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -37619,15 +36841,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource86", + "logicalId": "Resource48", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 8435, + "startLine": 4673, "startColumn": 15, - "endLine": 8435, + "endLine": 4673, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -37638,15 +36860,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource86", + "logicalId": "Resource48", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 8470, + "startLine": 4708, "startColumn": 15, - "endLine": 8470, + "endLine": 4708, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -37657,15 +36879,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource86", + "logicalId": "Resource48", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 8476, + "startLine": 4714, "startColumn": 15, - "endLine": 8476, + "endLine": 4714, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -37676,15 +36898,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource87", + "logicalId": "Resource49", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 8534, + "startLine": 4772, "startColumn": 15, - "endLine": 8534, + "endLine": 4772, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -37695,15 +36917,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource87", + "logicalId": "Resource49", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 8569, + "startLine": 4807, "startColumn": 15, - "endLine": 8569, + "endLine": 4807, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -37714,15 +36936,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource87", + "logicalId": "Resource49", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 8575, + "startLine": 4813, "startColumn": 15, - "endLine": 8575, + "endLine": 4813, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -37733,15 +36955,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource88", + "logicalId": "Resource50", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 8633, + "startLine": 4871, "startColumn": 15, - "endLine": 8633, + "endLine": 4871, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -37752,15 +36974,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource88", + "logicalId": "Resource50", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 8668, + "startLine": 4906, "startColumn": 15, - "endLine": 8668, + "endLine": 4906, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -37771,15 +36993,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource88", + "logicalId": "Resource50", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 8674, + "startLine": 4912, "startColumn": 15, - "endLine": 8674, + "endLine": 4912, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -37790,15 +37012,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource89", + "logicalId": "Resource51", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 8732, + "startLine": 4970, "startColumn": 15, - "endLine": 8732, + "endLine": 4970, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -37809,15 +37031,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource89", + "logicalId": "Resource51", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 8767, + "startLine": 5005, "startColumn": 15, - "endLine": 8767, + "endLine": 5005, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -37828,15 +37050,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource89", + "logicalId": "Resource51", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 8773, + "startLine": 5011, "startColumn": 15, - "endLine": 8773, + "endLine": 5011, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -37847,15 +37069,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource90", + "logicalId": "Resource52", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 8831, + "startLine": 5069, "startColumn": 15, - "endLine": 8831, + "endLine": 5069, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -37866,15 +37088,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource90", + "logicalId": "Resource52", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 8866, + "startLine": 5104, "startColumn": 15, - "endLine": 8866, + "endLine": 5104, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -37885,15 +37107,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource90", + "logicalId": "Resource52", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 8872, + "startLine": 5110, "startColumn": 15, - "endLine": 8872, + "endLine": 5110, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -37904,15 +37126,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource91", + "logicalId": "Resource53", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 8930, + "startLine": 5168, "startColumn": 15, - "endLine": 8930, + "endLine": 5168, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -37923,15 +37145,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource91", + "logicalId": "Resource53", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 8965, + "startLine": 5203, "startColumn": 15, - "endLine": 8965, + "endLine": 5203, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -37942,15 +37164,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource91", + "logicalId": "Resource53", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 8971, + "startLine": 5209, "startColumn": 15, - "endLine": 8971, + "endLine": 5209, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -37961,15 +37183,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource92", + "logicalId": "Resource54", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 9029, + "startLine": 5267, "startColumn": 15, - "endLine": 9029, + "endLine": 5267, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -37980,15 +37202,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource92", + "logicalId": "Resource54", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 9064, + "startLine": 5302, "startColumn": 15, - "endLine": 9064, + "endLine": 5302, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -37999,15 +37221,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource92", + "logicalId": "Resource54", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 9070, + "startLine": 5308, "startColumn": 15, - "endLine": 9070, + "endLine": 5308, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -38018,15 +37240,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource93", + "logicalId": "Resource55", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 9128, + "startLine": 5366, "startColumn": 15, - "endLine": 9128, + "endLine": 5366, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -38037,15 +37259,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource93", + "logicalId": "Resource55", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 9163, + "startLine": 5401, "startColumn": 15, - "endLine": 9163, + "endLine": 5401, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -38056,15 +37278,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource93", + "logicalId": "Resource55", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 9169, + "startLine": 5407, "startColumn": 15, - "endLine": 9169, + "endLine": 5407, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -38075,15 +37297,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource94", + "logicalId": "Resource56", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 9227, + "startLine": 5465, "startColumn": 15, - "endLine": 9227, + "endLine": 5465, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -38094,15 +37316,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource94", + "logicalId": "Resource56", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 9262, + "startLine": 5500, "startColumn": 15, - "endLine": 9262, + "endLine": 5500, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -38113,15 +37335,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource94", + "logicalId": "Resource56", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 9268, + "startLine": 5506, "startColumn": 15, - "endLine": 9268, + "endLine": 5506, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -38132,15 +37354,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource95", + "logicalId": "Resource57", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 9326, + "startLine": 5564, "startColumn": 15, - "endLine": 9326, + "endLine": 5564, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -38151,15 +37373,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource95", + "logicalId": "Resource57", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 9361, + "startLine": 5599, "startColumn": 15, - "endLine": 9361, + "endLine": 5599, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -38170,15 +37392,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource95", + "logicalId": "Resource57", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 9367, + "startLine": 5605, "startColumn": 15, - "endLine": 9367, + "endLine": 5605, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -38189,15 +37411,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource96", + "logicalId": "Resource58", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 9425, + "startLine": 5663, "startColumn": 15, - "endLine": 9425, + "endLine": 5663, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -38208,15 +37430,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource96", + "logicalId": "Resource58", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 9460, + "startLine": 5698, "startColumn": 15, - "endLine": 9460, + "endLine": 5698, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -38227,15 +37449,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource96", + "logicalId": "Resource58", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 9466, + "startLine": 5704, "startColumn": 15, - "endLine": 9466, + "endLine": 5704, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -38246,15 +37468,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource97", + "logicalId": "Resource59", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 9524, + "startLine": 5762, "startColumn": 15, - "endLine": 9524, + "endLine": 5762, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -38265,15 +37487,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource97", + "logicalId": "Resource59", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 9559, + "startLine": 5797, "startColumn": 15, - "endLine": 9559, + "endLine": 5797, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -38284,15 +37506,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource97", + "logicalId": "Resource59", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 9565, + "startLine": 5803, "startColumn": 15, - "endLine": 9565, + "endLine": 5803, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -38303,15 +37525,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource98", + "logicalId": "Resource60", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 9623, + "startLine": 5861, "startColumn": 15, - "endLine": 9623, + "endLine": 5861, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -38322,15 +37544,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource98", + "logicalId": "Resource60", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 9658, + "startLine": 5896, "startColumn": 15, - "endLine": 9658, + "endLine": 5896, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -38341,15 +37563,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource98", + "logicalId": "Resource60", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 9664, + "startLine": 5902, "startColumn": 15, - "endLine": 9664, + "endLine": 5902, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -38360,15 +37582,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource99", + "logicalId": "Resource61", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 9722, + "startLine": 5960, "startColumn": 15, - "endLine": 9722, + "endLine": 5960, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -38379,15 +37601,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource99", + "logicalId": "Resource61", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 9757, + "startLine": 5995, "startColumn": 15, - "endLine": 9757, + "endLine": 5995, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -38398,15 +37620,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource99", + "logicalId": "Resource61", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 9763, + "startLine": 6001, "startColumn": 15, - "endLine": 9763, + "endLine": 6001, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -38417,15 +37639,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource100", + "logicalId": "Resource62", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 9821, + "startLine": 6059, "startColumn": 15, - "endLine": 9821, + "endLine": 6059, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -38436,15 +37658,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource100", + "logicalId": "Resource62", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 9856, + "startLine": 6094, "startColumn": 15, - "endLine": 9856, + "endLine": 6094, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -38455,15 +37677,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource100", + "logicalId": "Resource62", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 9862, + "startLine": 6100, "startColumn": 15, - "endLine": 9862, + "endLine": 6100, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -38474,15 +37696,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource101", + "logicalId": "Resource63", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 9920, + "startLine": 6158, "startColumn": 15, - "endLine": 9920, + "endLine": 6158, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -38493,15 +37715,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource101", + "logicalId": "Resource63", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 9955, + "startLine": 6193, "startColumn": 15, - "endLine": 9955, + "endLine": 6193, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -38512,15 +37734,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource101", + "logicalId": "Resource63", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 9961, + "startLine": 6199, "startColumn": 15, - "endLine": 9961, + "endLine": 6199, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -38531,15 +37753,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource102", + "logicalId": "Resource64", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 10019, + "startLine": 6257, "startColumn": 15, - "endLine": 10019, + "endLine": 6257, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -38550,15 +37772,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource102", + "logicalId": "Resource64", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 10054, + "startLine": 6292, "startColumn": 15, - "endLine": 10054, + "endLine": 6292, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -38569,15 +37791,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource102", + "logicalId": "Resource64", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 10060, + "startLine": 6298, "startColumn": 15, - "endLine": 10060, + "endLine": 6298, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -38588,15 +37810,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource103", + "logicalId": "Resource65", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 10118, + "startLine": 6356, "startColumn": 15, - "endLine": 10118, + "endLine": 6356, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -38607,15 +37829,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource103", + "logicalId": "Resource65", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 10153, + "startLine": 6391, "startColumn": 15, - "endLine": 10153, + "endLine": 6391, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -38626,15 +37848,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource103", + "logicalId": "Resource65", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 10159, + "startLine": 6397, "startColumn": 15, - "endLine": 10159, + "endLine": 6397, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -38645,15 +37867,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource104", + "logicalId": "Resource66", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 10217, + "startLine": 6455, "startColumn": 15, - "endLine": 10217, + "endLine": 6455, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -38664,15 +37886,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource104", + "logicalId": "Resource66", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 10252, + "startLine": 6490, "startColumn": 15, - "endLine": 10252, + "endLine": 6490, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -38683,15 +37905,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource104", + "logicalId": "Resource66", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 10258, + "startLine": 6496, "startColumn": 15, - "endLine": 10258, + "endLine": 6496, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -38702,15 +37924,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource105", + "logicalId": "Resource67", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 10316, + "startLine": 6554, "startColumn": 15, - "endLine": 10316, + "endLine": 6554, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -38721,15 +37943,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource105", + "logicalId": "Resource67", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 10351, + "startLine": 6589, "startColumn": 15, - "endLine": 10351, + "endLine": 6589, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -38740,15 +37962,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource105", + "logicalId": "Resource67", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 10357, + "startLine": 6595, "startColumn": 15, - "endLine": 10357, + "endLine": 6595, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -38759,15 +37981,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource106", + "logicalId": "Resource68", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 10415, + "startLine": 6653, "startColumn": 15, - "endLine": 10415, + "endLine": 6653, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -38778,15 +38000,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource106", + "logicalId": "Resource68", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 10450, + "startLine": 6688, "startColumn": 15, - "endLine": 10450, + "endLine": 6688, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -38797,15 +38019,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource106", + "logicalId": "Resource68", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 10456, + "startLine": 6694, "startColumn": 15, - "endLine": 10456, + "endLine": 6694, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -38816,15 +38038,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource107", + "logicalId": "Resource69", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 10514, + "startLine": 6752, "startColumn": 15, - "endLine": 10514, + "endLine": 6752, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -38835,15 +38057,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource107", + "logicalId": "Resource69", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 10549, + "startLine": 6787, "startColumn": 15, - "endLine": 10549, + "endLine": 6787, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -38854,15 +38076,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource107", + "logicalId": "Resource69", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 10555, + "startLine": 6793, "startColumn": 15, - "endLine": 10555, + "endLine": 6793, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -38873,15 +38095,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource108", + "logicalId": "Resource70", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 10613, + "startLine": 6851, "startColumn": 15, - "endLine": 10613, + "endLine": 6851, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -38892,15 +38114,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource108", + "logicalId": "Resource70", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 10648, + "startLine": 6886, "startColumn": 15, - "endLine": 10648, + "endLine": 6886, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -38911,15 +38133,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource108", + "logicalId": "Resource70", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 10654, + "startLine": 6892, "startColumn": 15, - "endLine": 10654, + "endLine": 6892, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -38930,15 +38152,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource109", + "logicalId": "Resource71", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 10712, + "startLine": 6950, "startColumn": 15, - "endLine": 10712, + "endLine": 6950, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -38949,15 +38171,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource109", + "logicalId": "Resource71", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 10747, + "startLine": 6985, "startColumn": 15, - "endLine": 10747, + "endLine": 6985, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -38968,15 +38190,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource109", + "logicalId": "Resource71", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 10753, + "startLine": 6991, "startColumn": 15, - "endLine": 10753, + "endLine": 6991, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -38987,15 +38209,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource110", + "logicalId": "Resource72", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 10811, + "startLine": 7049, "startColumn": 15, - "endLine": 10811, + "endLine": 7049, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -39006,15 +38228,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource110", + "logicalId": "Resource72", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 10846, + "startLine": 7084, "startColumn": 15, - "endLine": 10846, + "endLine": 7084, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -39025,15 +38247,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource110", + "logicalId": "Resource72", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 10852, + "startLine": 7090, "startColumn": 15, - "endLine": 10852, + "endLine": 7090, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -39044,15 +38266,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource111", + "logicalId": "Resource73", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 10910, + "startLine": 7148, "startColumn": 15, - "endLine": 10910, + "endLine": 7148, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -39063,15 +38285,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource111", + "logicalId": "Resource73", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 10945, + "startLine": 7183, "startColumn": 15, - "endLine": 10945, + "endLine": 7183, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -39082,15 +38304,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource111", + "logicalId": "Resource73", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 10951, + "startLine": 7189, "startColumn": 15, - "endLine": 10951, + "endLine": 7189, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -39101,15 +38323,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource112", + "logicalId": "Resource74", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 11009, + "startLine": 7247, "startColumn": 15, - "endLine": 11009, + "endLine": 7247, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -39120,15 +38342,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource112", + "logicalId": "Resource74", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 11044, + "startLine": 7282, "startColumn": 15, - "endLine": 11044, + "endLine": 7282, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -39139,15 +38361,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource112", + "logicalId": "Resource74", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 11050, + "startLine": 7288, "startColumn": 15, - "endLine": 11050, + "endLine": 7288, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -39158,15 +38380,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource113", + "logicalId": "Resource75", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 11108, + "startLine": 7346, "startColumn": 15, - "endLine": 11108, + "endLine": 7346, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -39177,15 +38399,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource113", + "logicalId": "Resource75", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 11143, + "startLine": 7381, "startColumn": 15, - "endLine": 11143, + "endLine": 7381, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -39196,15 +38418,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource113", + "logicalId": "Resource75", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 11149, + "startLine": 7387, "startColumn": 15, - "endLine": 11149, + "endLine": 7387, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -39215,15 +38437,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource114", + "logicalId": "Resource76", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 11207, + "startLine": 7445, "startColumn": 15, - "endLine": 11207, + "endLine": 7445, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -39234,15 +38456,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource114", + "logicalId": "Resource76", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 11242, + "startLine": 7480, "startColumn": 15, - "endLine": 11242, + "endLine": 7480, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -39253,15 +38475,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource114", + "logicalId": "Resource76", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 11248, + "startLine": 7486, "startColumn": 15, - "endLine": 11248, + "endLine": 7486, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -39272,15 +38494,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource115", + "logicalId": "Resource77", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 11306, + "startLine": 7544, "startColumn": 15, - "endLine": 11306, + "endLine": 7544, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -39291,15 +38513,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource115", + "logicalId": "Resource77", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 11341, + "startLine": 7579, "startColumn": 15, - "endLine": 11341, + "endLine": 7579, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -39310,15 +38532,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource115", + "logicalId": "Resource77", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 11347, + "startLine": 7585, "startColumn": 15, - "endLine": 11347, + "endLine": 7585, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -39329,15 +38551,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource116", + "logicalId": "Resource78", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 11405, + "startLine": 7643, "startColumn": 15, - "endLine": 11405, + "endLine": 7643, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -39348,15 +38570,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource116", + "logicalId": "Resource78", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 11440, + "startLine": 7678, "startColumn": 15, - "endLine": 11440, + "endLine": 7678, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -39367,15 +38589,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource116", + "logicalId": "Resource78", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 11446, + "startLine": 7684, "startColumn": 15, - "endLine": 11446, + "endLine": 7684, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -39386,15 +38608,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource117", + "logicalId": "Resource79", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 11504, + "startLine": 7742, "startColumn": 15, - "endLine": 11504, + "endLine": 7742, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -39405,15 +38627,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource117", + "logicalId": "Resource79", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 11539, + "startLine": 7777, "startColumn": 15, - "endLine": 11539, + "endLine": 7777, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -39424,15 +38646,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource117", + "logicalId": "Resource79", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 11545, + "startLine": 7783, "startColumn": 15, - "endLine": 11545, + "endLine": 7783, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -39443,15 +38665,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource118", + "logicalId": "Resource80", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 11603, + "startLine": 7841, "startColumn": 15, - "endLine": 11603, + "endLine": 7841, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -39462,15 +38684,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource118", + "logicalId": "Resource80", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 11638, + "startLine": 7876, "startColumn": 15, - "endLine": 11638, + "endLine": 7876, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -39481,15 +38703,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource118", + "logicalId": "Resource80", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 11644, + "startLine": 7882, "startColumn": 15, - "endLine": 11644, + "endLine": 7882, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -39500,15 +38722,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource119", + "logicalId": "Resource81", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 11702, + "startLine": 7940, "startColumn": 15, - "endLine": 11702, + "endLine": 7940, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -39519,15 +38741,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource119", + "logicalId": "Resource81", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 11737, + "startLine": 7975, "startColumn": 15, - "endLine": 11737, + "endLine": 7975, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -39538,15 +38760,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource119", + "logicalId": "Resource81", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 11743, + "startLine": 7981, "startColumn": 15, - "endLine": 11743, + "endLine": 7981, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -39557,15 +38779,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource120", + "logicalId": "Resource82", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 11801, + "startLine": 8039, "startColumn": 15, - "endLine": 11801, + "endLine": 8039, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -39576,15 +38798,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource120", + "logicalId": "Resource82", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 11836, + "startLine": 8074, "startColumn": 15, - "endLine": 11836, + "endLine": 8074, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -39595,15 +38817,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource120", + "logicalId": "Resource82", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 11842, + "startLine": 8080, "startColumn": 15, - "endLine": 11842, + "endLine": 8080, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -39614,15 +38836,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource121", + "logicalId": "Resource83", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 11900, + "startLine": 8138, "startColumn": 15, - "endLine": 11900, + "endLine": 8138, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -39633,15 +38855,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource121", + "logicalId": "Resource83", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 11935, + "startLine": 8173, "startColumn": 15, - "endLine": 11935, + "endLine": 8173, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -39652,15 +38874,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource121", + "logicalId": "Resource83", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 11941, + "startLine": 8179, "startColumn": 15, - "endLine": 11941, + "endLine": 8179, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -39671,15 +38893,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource122", + "logicalId": "Resource84", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 11999, + "startLine": 8237, "startColumn": 15, - "endLine": 11999, + "endLine": 8237, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -39690,15 +38912,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource122", + "logicalId": "Resource84", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 12034, + "startLine": 8272, "startColumn": 15, - "endLine": 12034, + "endLine": 8272, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -39709,15 +38931,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource122", + "logicalId": "Resource84", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 12040, + "startLine": 8278, "startColumn": 15, - "endLine": 12040, + "endLine": 8278, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -39728,15 +38950,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource123", + "logicalId": "Resource85", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 12098, + "startLine": 8336, "startColumn": 15, - "endLine": 12098, + "endLine": 8336, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -39747,15 +38969,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource123", + "logicalId": "Resource85", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 12133, + "startLine": 8371, "startColumn": 15, - "endLine": 12133, + "endLine": 8371, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -39766,15 +38988,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource123", + "logicalId": "Resource85", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 12139, + "startLine": 8377, "startColumn": 15, - "endLine": 12139, + "endLine": 8377, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -39785,15 +39007,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource124", + "logicalId": "Resource86", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 12197, + "startLine": 8435, "startColumn": 15, - "endLine": 12197, + "endLine": 8435, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -39804,15 +39026,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource124", + "logicalId": "Resource86", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 12232, + "startLine": 8470, "startColumn": 15, - "endLine": 12232, + "endLine": 8470, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -39823,15 +39045,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource124", + "logicalId": "Resource86", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 12238, + "startLine": 8476, "startColumn": 15, - "endLine": 12238, + "endLine": 8476, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -39842,15 +39064,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource125", + "logicalId": "Resource87", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 12296, + "startLine": 8534, "startColumn": 15, - "endLine": 12296, + "endLine": 8534, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -39861,15 +39083,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource125", + "logicalId": "Resource87", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 12331, + "startLine": 8569, "startColumn": 15, - "endLine": 12331, + "endLine": 8569, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -39880,15 +39102,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource125", + "logicalId": "Resource87", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 12337, + "startLine": 8575, "startColumn": 15, - "endLine": 12337, + "endLine": 8575, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -39899,15 +39121,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource126", + "logicalId": "Resource88", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 12395, + "startLine": 8633, "startColumn": 15, - "endLine": 12395, + "endLine": 8633, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -39918,15 +39140,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource126", + "logicalId": "Resource88", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 12430, + "startLine": 8668, "startColumn": 15, - "endLine": 12430, + "endLine": 8668, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -39937,15 +39159,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource126", + "logicalId": "Resource88", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 12436, + "startLine": 8674, "startColumn": 15, - "endLine": 12436, + "endLine": 8674, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -39956,15 +39178,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource127", + "logicalId": "Resource89", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 12494, + "startLine": 8732, "startColumn": 15, - "endLine": 12494, + "endLine": 8732, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -39975,15 +39197,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource127", + "logicalId": "Resource89", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 12529, + "startLine": 8767, "startColumn": 15, - "endLine": 12529, + "endLine": 8767, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -39994,15 +39216,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource127", + "logicalId": "Resource89", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 12535, + "startLine": 8773, "startColumn": 15, - "endLine": 12535, + "endLine": 8773, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -40013,15 +39235,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource128", + "logicalId": "Resource90", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 12593, + "startLine": 8831, "startColumn": 15, - "endLine": 12593, + "endLine": 8831, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -40032,15 +39254,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource128", + "logicalId": "Resource90", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 12628, + "startLine": 8866, "startColumn": 15, - "endLine": 12628, + "endLine": 8866, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -40051,15 +39273,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource128", + "logicalId": "Resource90", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 12634, + "startLine": 8872, "startColumn": 15, - "endLine": 12634, + "endLine": 8872, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -40070,15 +39292,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource129", + "logicalId": "Resource91", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 12692, + "startLine": 8930, "startColumn": 15, - "endLine": 12692, + "endLine": 8930, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -40089,15 +39311,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource129", + "logicalId": "Resource91", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 12727, + "startLine": 8965, "startColumn": 15, - "endLine": 12727, + "endLine": 8965, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -40108,15 +39330,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource129", + "logicalId": "Resource91", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 12733, + "startLine": 8971, "startColumn": 15, - "endLine": 12733, + "endLine": 8971, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -40127,15 +39349,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource130", + "logicalId": "Resource92", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 12791, + "startLine": 9029, "startColumn": 15, - "endLine": 12791, + "endLine": 9029, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -40146,15 +39368,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource130", + "logicalId": "Resource92", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 12826, + "startLine": 9064, "startColumn": 15, - "endLine": 12826, + "endLine": 9064, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -40165,15 +39387,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource130", + "logicalId": "Resource92", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 12832, + "startLine": 9070, "startColumn": 15, - "endLine": 12832, + "endLine": 9070, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -40184,15 +39406,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource131", + "logicalId": "Resource93", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 12890, + "startLine": 9128, "startColumn": 15, - "endLine": 12890, + "endLine": 9128, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -40203,15 +39425,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource131", + "logicalId": "Resource93", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 12925, + "startLine": 9163, "startColumn": 15, - "endLine": 12925, + "endLine": 9163, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -40222,15 +39444,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource131", + "logicalId": "Resource93", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 12931, + "startLine": 9169, "startColumn": 15, - "endLine": 12931, + "endLine": 9169, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -40241,15 +39463,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource132", + "logicalId": "Resource94", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 12989, + "startLine": 9227, "startColumn": 15, - "endLine": 12989, + "endLine": 9227, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -40260,15 +39482,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource132", + "logicalId": "Resource94", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 13024, + "startLine": 9262, "startColumn": 15, - "endLine": 13024, + "endLine": 9262, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -40279,15 +39501,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource132", + "logicalId": "Resource94", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 13030, + "startLine": 9268, "startColumn": 15, - "endLine": 13030, + "endLine": 9268, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -40298,15 +39520,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource133", + "logicalId": "Resource95", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 13088, + "startLine": 9326, "startColumn": 15, - "endLine": 13088, + "endLine": 9326, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -40317,15 +39539,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource133", + "logicalId": "Resource95", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 13123, + "startLine": 9361, "startColumn": 15, - "endLine": 13123, + "endLine": 9361, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -40336,15 +39558,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource133", + "logicalId": "Resource95", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 13129, + "startLine": 9367, "startColumn": 15, - "endLine": 13129, + "endLine": 9367, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -40355,15 +39577,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource134", + "logicalId": "Resource96", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 13187, + "startLine": 9425, "startColumn": 15, - "endLine": 13187, + "endLine": 9425, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -40374,15 +39596,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource134", + "logicalId": "Resource96", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 13222, + "startLine": 9460, "startColumn": 15, - "endLine": 13222, + "endLine": 9460, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -40393,15 +39615,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource134", + "logicalId": "Resource96", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 13228, + "startLine": 9466, "startColumn": 15, - "endLine": 13228, + "endLine": 9466, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -40412,15 +39634,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource135", + "logicalId": "Resource97", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 13286, + "startLine": 9524, "startColumn": 15, - "endLine": 13286, + "endLine": 9524, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -40431,15 +39653,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource135", + "logicalId": "Resource97", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 13321, + "startLine": 9559, "startColumn": 15, - "endLine": 13321, + "endLine": 9559, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -40450,15 +39672,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource135", + "logicalId": "Resource97", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 13327, + "startLine": 9565, "startColumn": 15, - "endLine": 13327, + "endLine": 9565, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -40469,15 +39691,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource136", + "logicalId": "Resource98", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 13385, + "startLine": 9623, "startColumn": 15, - "endLine": 13385, + "endLine": 9623, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -40488,15 +39710,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource136", + "logicalId": "Resource98", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 13420, + "startLine": 9658, "startColumn": 15, - "endLine": 13420, + "endLine": 9658, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -40507,15 +39729,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource136", + "logicalId": "Resource98", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 13426, + "startLine": 9664, "startColumn": 15, - "endLine": 13426, + "endLine": 9664, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -40526,15 +39748,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource137", + "logicalId": "Resource99", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 13484, + "startLine": 9722, "startColumn": 15, - "endLine": 13484, + "endLine": 9722, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -40545,15 +39767,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource137", + "logicalId": "Resource99", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 13519, + "startLine": 9757, "startColumn": 15, - "endLine": 13519, + "endLine": 9757, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -40564,15 +39786,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource137", + "logicalId": "Resource99", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 13525, + "startLine": 9763, "startColumn": 15, - "endLine": 13525, + "endLine": 9763, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -40583,15 +39805,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource138", + "logicalId": "Resource100", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 13583, + "startLine": 9821, "startColumn": 15, - "endLine": 13583, + "endLine": 9821, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -40602,15 +39824,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource138", + "logicalId": "Resource100", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 13618, + "startLine": 9856, "startColumn": 15, - "endLine": 13618, + "endLine": 9856, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -40621,15 +39843,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource138", + "logicalId": "Resource100", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 13624, + "startLine": 9862, "startColumn": 15, - "endLine": 13624, + "endLine": 9862, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -40640,15 +39862,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource139", + "logicalId": "Resource101", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 13682, + "startLine": 9920, "startColumn": 15, - "endLine": 13682, + "endLine": 9920, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -40659,15 +39881,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource139", + "logicalId": "Resource101", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 13717, + "startLine": 9955, "startColumn": 15, - "endLine": 13717, + "endLine": 9955, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -40678,15 +39900,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource139", + "logicalId": "Resource101", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 13723, + "startLine": 9961, "startColumn": 15, - "endLine": 13723, + "endLine": 9961, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -40697,15 +39919,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource140", + "logicalId": "Resource102", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 13781, + "startLine": 10019, "startColumn": 15, - "endLine": 13781, + "endLine": 10019, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -40716,15 +39938,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource140", + "logicalId": "Resource102", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 13816, + "startLine": 10054, "startColumn": 15, - "endLine": 13816, + "endLine": 10054, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -40735,15 +39957,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource140", + "logicalId": "Resource102", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 13822, + "startLine": 10060, "startColumn": 15, - "endLine": 13822, + "endLine": 10060, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -40754,15 +39976,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource141", + "logicalId": "Resource103", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 13880, + "startLine": 10118, "startColumn": 15, - "endLine": 13880, + "endLine": 10118, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -40773,15 +39995,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource141", + "logicalId": "Resource103", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 13915, + "startLine": 10153, "startColumn": 15, - "endLine": 13915, + "endLine": 10153, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -40792,15 +40014,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource141", + "logicalId": "Resource103", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 13921, + "startLine": 10159, "startColumn": 15, - "endLine": 13921, + "endLine": 10159, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -40811,15 +40033,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource142", + "logicalId": "Resource104", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 13979, + "startLine": 10217, "startColumn": 15, - "endLine": 13979, + "endLine": 10217, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -40830,15 +40052,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource142", + "logicalId": "Resource104", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 14014, + "startLine": 10252, "startColumn": 15, - "endLine": 14014, + "endLine": 10252, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -40849,15 +40071,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource142", + "logicalId": "Resource104", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 14020, + "startLine": 10258, "startColumn": 15, - "endLine": 14020, + "endLine": 10258, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -40868,15 +40090,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource143", + "logicalId": "Resource105", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 14078, + "startLine": 10316, "startColumn": 15, - "endLine": 14078, + "endLine": 10316, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -40887,15 +40109,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource143", + "logicalId": "Resource105", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 14113, + "startLine": 10351, "startColumn": 15, - "endLine": 14113, + "endLine": 10351, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -40906,15 +40128,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource143", + "logicalId": "Resource105", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 14119, + "startLine": 10357, "startColumn": 15, - "endLine": 14119, + "endLine": 10357, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -40925,15 +40147,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource144", + "logicalId": "Resource106", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 14177, + "startLine": 10415, "startColumn": 15, - "endLine": 14177, + "endLine": 10415, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -40944,15 +40166,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource144", + "logicalId": "Resource106", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 14212, + "startLine": 10450, "startColumn": 15, - "endLine": 14212, + "endLine": 10450, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -40963,15 +40185,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource144", + "logicalId": "Resource106", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 14218, + "startLine": 10456, "startColumn": 15, - "endLine": 14218, + "endLine": 10456, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -40982,15 +40204,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource145", + "logicalId": "Resource107", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 14276, + "startLine": 10514, "startColumn": 15, - "endLine": 14276, + "endLine": 10514, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -41001,15 +40223,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource145", + "logicalId": "Resource107", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 14311, + "startLine": 10549, "startColumn": 15, - "endLine": 14311, + "endLine": 10549, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -41020,15 +40242,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource145", + "logicalId": "Resource107", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 14317, + "startLine": 10555, "startColumn": 15, - "endLine": 14317, + "endLine": 10555, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -41039,15 +40261,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource146", + "logicalId": "Resource108", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 14375, + "startLine": 10613, "startColumn": 15, - "endLine": 14375, + "endLine": 10613, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -41058,15 +40280,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource146", + "logicalId": "Resource108", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 14410, + "startLine": 10648, "startColumn": 15, - "endLine": 14410, + "endLine": 10648, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -41077,15 +40299,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource146", + "logicalId": "Resource108", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 14416, + "startLine": 10654, "startColumn": 15, - "endLine": 14416, + "endLine": 10654, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -41096,15 +40318,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource147", + "logicalId": "Resource109", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 14474, + "startLine": 10712, "startColumn": 15, - "endLine": 14474, + "endLine": 10712, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -41115,15 +40337,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource147", + "logicalId": "Resource109", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 14509, + "startLine": 10747, "startColumn": 15, - "endLine": 14509, + "endLine": 10747, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -41134,15 +40356,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource147", + "logicalId": "Resource109", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 14515, + "startLine": 10753, "startColumn": 15, - "endLine": 14515, + "endLine": 10753, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -41153,15 +40375,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource148", + "logicalId": "Resource110", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 14573, + "startLine": 10811, "startColumn": 15, - "endLine": 14573, + "endLine": 10811, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -41172,15 +40394,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource148", + "logicalId": "Resource110", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 14608, + "startLine": 10846, "startColumn": 15, - "endLine": 14608, + "endLine": 10846, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -41191,15 +40413,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource148", + "logicalId": "Resource110", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 14614, + "startLine": 10852, "startColumn": 15, - "endLine": 14614, + "endLine": 10852, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -41210,15 +40432,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource149", + "logicalId": "Resource111", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 14672, + "startLine": 10910, "startColumn": 15, - "endLine": 14672, + "endLine": 10910, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -41229,15 +40451,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource149", + "logicalId": "Resource111", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 14707, + "startLine": 10945, "startColumn": 15, - "endLine": 14707, + "endLine": 10945, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -41248,15 +40470,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource149", + "logicalId": "Resource111", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 14713, + "startLine": 10951, "startColumn": 15, - "endLine": 14713, + "endLine": 10951, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -41267,15 +40489,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource150", + "logicalId": "Resource112", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 14771, + "startLine": 11009, "startColumn": 15, - "endLine": 14771, + "endLine": 11009, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -41286,15 +40508,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource150", + "logicalId": "Resource112", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 14806, + "startLine": 11044, "startColumn": 15, - "endLine": 14806, + "endLine": 11044, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -41305,15 +40527,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource150", + "logicalId": "Resource112", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 14812, + "startLine": 11050, "startColumn": 15, - "endLine": 14812, + "endLine": 11050, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -41324,15 +40546,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource151", + "logicalId": "Resource113", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 14870, + "startLine": 11108, "startColumn": 15, - "endLine": 14870, + "endLine": 11108, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -41343,15 +40565,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource151", + "logicalId": "Resource113", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 14905, + "startLine": 11143, "startColumn": 15, - "endLine": 14905, + "endLine": 11143, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -41362,15 +40584,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource151", + "logicalId": "Resource113", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 14911, + "startLine": 11149, "startColumn": 15, - "endLine": 14911, + "endLine": 11149, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -41381,15 +40603,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource152", + "logicalId": "Resource114", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 14969, + "startLine": 11207, "startColumn": 15, - "endLine": 14969, + "endLine": 11207, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -41400,15 +40622,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource152", + "logicalId": "Resource114", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 15004, + "startLine": 11242, "startColumn": 15, - "endLine": 15004, + "endLine": 11242, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -41419,15 +40641,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource152", + "logicalId": "Resource114", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 15010, + "startLine": 11248, "startColumn": 15, - "endLine": 15010, + "endLine": 11248, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -41438,15 +40660,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource153", + "logicalId": "Resource115", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 15068, + "startLine": 11306, "startColumn": 15, - "endLine": 15068, + "endLine": 11306, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -41457,15 +40679,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource153", + "logicalId": "Resource115", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 15103, + "startLine": 11341, "startColumn": 15, - "endLine": 15103, + "endLine": 11341, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -41476,15 +40698,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource153", + "logicalId": "Resource115", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 15109, + "startLine": 11347, "startColumn": 15, - "endLine": 15109, + "endLine": 11347, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -41495,15 +40717,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource154", + "logicalId": "Resource116", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 15167, + "startLine": 11405, "startColumn": 15, - "endLine": 15167, + "endLine": 11405, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -41514,15 +40736,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource154", + "logicalId": "Resource116", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 15202, + "startLine": 11440, "startColumn": 15, - "endLine": 15202, + "endLine": 11440, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -41533,15 +40755,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource154", + "logicalId": "Resource116", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 15208, + "startLine": 11446, "startColumn": 15, - "endLine": 15208, + "endLine": 11446, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -41552,15 +40774,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource155", + "logicalId": "Resource117", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 15266, + "startLine": 11504, "startColumn": 15, - "endLine": 15266, + "endLine": 11504, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -41571,15 +40793,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource155", + "logicalId": "Resource117", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 15301, + "startLine": 11539, "startColumn": 15, - "endLine": 15301, + "endLine": 11539, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -41590,15 +40812,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource155", + "logicalId": "Resource117", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 15307, + "startLine": 11545, "startColumn": 15, - "endLine": 15307, + "endLine": 11545, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -41609,15 +40831,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource156", + "logicalId": "Resource118", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 15365, + "startLine": 11603, "startColumn": 15, - "endLine": 15365, + "endLine": 11603, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -41628,15 +40850,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource156", + "logicalId": "Resource118", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 15400, + "startLine": 11638, "startColumn": 15, - "endLine": 15400, + "endLine": 11638, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -41647,15 +40869,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource156", + "logicalId": "Resource118", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 15406, + "startLine": 11644, "startColumn": 15, - "endLine": 15406, + "endLine": 11644, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -41666,15 +40888,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource157", + "logicalId": "Resource119", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 15464, + "startLine": 11702, "startColumn": 15, - "endLine": 15464, + "endLine": 11702, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -41685,15 +40907,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource157", + "logicalId": "Resource119", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 15499, + "startLine": 11737, "startColumn": 15, - "endLine": 15499, + "endLine": 11737, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -41704,15 +40926,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource157", + "logicalId": "Resource119", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 15505, + "startLine": 11743, "startColumn": 15, - "endLine": 15505, + "endLine": 11743, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -41723,15 +40945,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource158", + "logicalId": "Resource120", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 15563, + "startLine": 11801, "startColumn": 15, - "endLine": 15563, + "endLine": 11801, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -41742,15 +40964,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource158", + "logicalId": "Resource120", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 15598, + "startLine": 11836, "startColumn": 15, - "endLine": 15598, + "endLine": 11836, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -41761,15 +40983,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource158", + "logicalId": "Resource120", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 15604, + "startLine": 11842, "startColumn": 15, - "endLine": 15604, + "endLine": 11842, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -41780,15 +41002,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource159", + "logicalId": "Resource121", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 15662, + "startLine": 11900, "startColumn": 15, - "endLine": 15662, + "endLine": 11900, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -41799,15 +41021,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource159", + "logicalId": "Resource121", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 15697, + "startLine": 11935, "startColumn": 15, - "endLine": 15697, + "endLine": 11935, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -41818,15 +41040,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource159", + "logicalId": "Resource121", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 15703, + "startLine": 11941, "startColumn": 15, - "endLine": 15703, + "endLine": 11941, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -41837,15 +41059,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource160", + "logicalId": "Resource122", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 15761, + "startLine": 11999, "startColumn": 15, - "endLine": 15761, + "endLine": 11999, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -41856,15 +41078,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource160", + "logicalId": "Resource122", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 15796, + "startLine": 12034, "startColumn": 15, - "endLine": 15796, + "endLine": 12034, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -41875,15 +41097,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource160", + "logicalId": "Resource122", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 15802, + "startLine": 12040, "startColumn": 15, - "endLine": 15802, + "endLine": 12040, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -41894,15 +41116,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource161", + "logicalId": "Resource123", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 15860, + "startLine": 12098, "startColumn": 15, - "endLine": 15860, + "endLine": 12098, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -41913,15 +41135,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource161", + "logicalId": "Resource123", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 15895, + "startLine": 12133, "startColumn": 15, - "endLine": 15895, + "endLine": 12133, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -41932,15 +41154,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource161", + "logicalId": "Resource123", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 15901, + "startLine": 12139, "startColumn": 15, - "endLine": 15901, + "endLine": 12139, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -41951,15 +41173,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource162", + "logicalId": "Resource124", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 15959, + "startLine": 12197, "startColumn": 15, - "endLine": 15959, + "endLine": 12197, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -41970,15 +41192,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource162", + "logicalId": "Resource124", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 15994, + "startLine": 12232, "startColumn": 15, - "endLine": 15994, + "endLine": 12232, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -41989,15 +41211,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource162", + "logicalId": "Resource124", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 16000, + "startLine": 12238, "startColumn": 15, - "endLine": 16000, + "endLine": 12238, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -42008,15 +41230,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource163", + "logicalId": "Resource125", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 16058, + "startLine": 12296, "startColumn": 15, - "endLine": 16058, + "endLine": 12296, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -42027,15 +41249,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource163", + "logicalId": "Resource125", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 16093, + "startLine": 12331, "startColumn": 15, - "endLine": 16093, + "endLine": 12331, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -42046,15 +41268,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource163", + "logicalId": "Resource125", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 16099, + "startLine": 12337, "startColumn": 15, - "endLine": 16099, + "endLine": 12337, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -42065,15 +41287,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource164", + "logicalId": "Resource126", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 16157, + "startLine": 12395, "startColumn": 15, - "endLine": 16157, + "endLine": 12395, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -42084,15 +41306,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource164", + "logicalId": "Resource126", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 16192, + "startLine": 12430, "startColumn": 15, - "endLine": 16192, + "endLine": 12430, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -42103,15 +41325,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource164", + "logicalId": "Resource126", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 16198, + "startLine": 12436, "startColumn": 15, - "endLine": 16198, + "endLine": 12436, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -42122,15 +41344,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource165", + "logicalId": "Resource127", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 16256, + "startLine": 12494, "startColumn": 15, - "endLine": 16256, + "endLine": 12494, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -42141,15 +41363,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource165", + "logicalId": "Resource127", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 16291, + "startLine": 12529, "startColumn": 15, - "endLine": 16291, + "endLine": 12529, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -42160,15 +41382,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource165", + "logicalId": "Resource127", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 16297, + "startLine": 12535, "startColumn": 15, - "endLine": 16297, + "endLine": 12535, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -42179,15 +41401,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource166", + "logicalId": "Resource128", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 16355, + "startLine": 12593, "startColumn": 15, - "endLine": 16355, + "endLine": 12593, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -42198,15 +41420,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource166", + "logicalId": "Resource128", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 16390, + "startLine": 12628, "startColumn": 15, - "endLine": 16390, + "endLine": 12628, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -42217,15 +41439,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource166", + "logicalId": "Resource128", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 16396, + "startLine": 12634, "startColumn": 15, - "endLine": 16396, + "endLine": 12634, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -42236,15 +41458,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource167", + "logicalId": "Resource129", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 16454, + "startLine": 12692, "startColumn": 15, - "endLine": 16454, + "endLine": 12692, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -42255,15 +41477,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource167", + "logicalId": "Resource129", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 16489, + "startLine": 12727, "startColumn": 15, - "endLine": 16489, + "endLine": 12727, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -42274,15 +41496,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource167", + "logicalId": "Resource129", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 16495, + "startLine": 12733, "startColumn": 15, - "endLine": 16495, + "endLine": 12733, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -42293,15 +41515,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource168", + "logicalId": "Resource130", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 16553, + "startLine": 12791, "startColumn": 15, - "endLine": 16553, + "endLine": 12791, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -42312,15 +41534,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource168", + "logicalId": "Resource130", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 16588, + "startLine": 12826, "startColumn": 15, - "endLine": 16588, + "endLine": 12826, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -42331,15 +41553,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource168", + "logicalId": "Resource130", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 16594, + "startLine": 12832, "startColumn": 15, - "endLine": 16594, + "endLine": 12832, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -42350,15 +41572,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource169", + "logicalId": "Resource131", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 16652, + "startLine": 12890, "startColumn": 15, - "endLine": 16652, + "endLine": 12890, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -42369,15 +41591,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource169", + "logicalId": "Resource131", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 16687, + "startLine": 12925, "startColumn": 15, - "endLine": 16687, + "endLine": 12925, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -42388,15 +41610,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource169", + "logicalId": "Resource131", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 16693, + "startLine": 12931, "startColumn": 15, - "endLine": 16693, + "endLine": 12931, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -42407,15 +41629,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource170", + "logicalId": "Resource132", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 16751, + "startLine": 12989, "startColumn": 15, - "endLine": 16751, + "endLine": 12989, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -42426,15 +41648,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource170", + "logicalId": "Resource132", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 16786, + "startLine": 13024, "startColumn": 15, - "endLine": 16786, + "endLine": 13024, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -42445,15 +41667,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource170", + "logicalId": "Resource132", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 16792, + "startLine": 13030, "startColumn": 15, - "endLine": 16792, + "endLine": 13030, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -42464,15 +41686,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource171", + "logicalId": "Resource133", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 16850, + "startLine": 13088, "startColumn": 15, - "endLine": 16850, + "endLine": 13088, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -42483,15 +41705,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource171", + "logicalId": "Resource133", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 16885, + "startLine": 13123, "startColumn": 15, - "endLine": 16885, + "endLine": 13123, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -42502,15 +41724,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource171", + "logicalId": "Resource133", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 16891, + "startLine": 13129, "startColumn": 15, - "endLine": 16891, + "endLine": 13129, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -42521,15 +41743,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource172", + "logicalId": "Resource134", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 16949, + "startLine": 13187, "startColumn": 15, - "endLine": 16949, + "endLine": 13187, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -42540,15 +41762,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource172", + "logicalId": "Resource134", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 16984, + "startLine": 13222, "startColumn": 15, - "endLine": 16984, + "endLine": 13222, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -42559,15 +41781,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource172", + "logicalId": "Resource134", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 16990, + "startLine": 13228, "startColumn": 15, - "endLine": 16990, + "endLine": 13228, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -42578,15 +41800,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource173", + "logicalId": "Resource135", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 17048, + "startLine": 13286, "startColumn": 15, - "endLine": 17048, + "endLine": 13286, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -42597,15 +41819,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource173", + "logicalId": "Resource135", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 17083, + "startLine": 13321, "startColumn": 15, - "endLine": 17083, + "endLine": 13321, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -42616,15 +41838,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource173", + "logicalId": "Resource135", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 17089, + "startLine": 13327, "startColumn": 15, - "endLine": 17089, + "endLine": 13327, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -42635,15 +41857,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource174", + "logicalId": "Resource136", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 17147, + "startLine": 13385, "startColumn": 15, - "endLine": 17147, + "endLine": 13385, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -42654,15 +41876,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource174", + "logicalId": "Resource136", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 17182, + "startLine": 13420, "startColumn": 15, - "endLine": 17182, + "endLine": 13420, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -42673,15 +41895,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource174", + "logicalId": "Resource136", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 17188, + "startLine": 13426, "startColumn": 15, - "endLine": 17188, + "endLine": 13426, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -42692,15 +41914,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource175", + "logicalId": "Resource137", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 17246, + "startLine": 13484, "startColumn": 15, - "endLine": 17246, + "endLine": 13484, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -42711,15 +41933,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource175", + "logicalId": "Resource137", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 17281, + "startLine": 13519, "startColumn": 15, - "endLine": 17281, + "endLine": 13519, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -42730,15 +41952,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource175", + "logicalId": "Resource137", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 17287, + "startLine": 13525, "startColumn": 15, - "endLine": 17287, + "endLine": 13525, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -42749,15 +41971,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource176", + "logicalId": "Resource138", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 17345, + "startLine": 13583, "startColumn": 15, - "endLine": 17345, + "endLine": 13583, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -42768,15 +41990,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource176", + "logicalId": "Resource138", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 17380, + "startLine": 13618, "startColumn": 15, - "endLine": 17380, + "endLine": 13618, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -42787,15 +42009,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource176", + "logicalId": "Resource138", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 17386, + "startLine": 13624, "startColumn": 15, - "endLine": 17386, + "endLine": 13624, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -42806,15 +42028,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource177", + "logicalId": "Resource139", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 17444, + "startLine": 13682, "startColumn": 15, - "endLine": 17444, + "endLine": 13682, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -42825,15 +42047,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource177", + "logicalId": "Resource139", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 17479, + "startLine": 13717, "startColumn": 15, - "endLine": 17479, + "endLine": 13717, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -42844,15 +42066,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource177", + "logicalId": "Resource139", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 17485, + "startLine": 13723, "startColumn": 15, - "endLine": 17485, + "endLine": 13723, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -42863,15 +42085,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource178", + "logicalId": "Resource140", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 17543, + "startLine": 13781, "startColumn": 15, - "endLine": 17543, + "endLine": 13781, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -42882,15 +42104,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource178", + "logicalId": "Resource140", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 17578, + "startLine": 13816, "startColumn": 15, - "endLine": 17578, + "endLine": 13816, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -42901,15 +42123,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource178", + "logicalId": "Resource140", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 17584, + "startLine": 13822, "startColumn": 15, - "endLine": 17584, + "endLine": 13822, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -42920,15 +42142,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource179", + "logicalId": "Resource141", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 17642, + "startLine": 13880, "startColumn": 15, - "endLine": 17642, + "endLine": 13880, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -42939,15 +42161,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource179", + "logicalId": "Resource141", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 17677, + "startLine": 13915, "startColumn": 15, - "endLine": 17677, + "endLine": 13915, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -42958,15 +42180,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource179", + "logicalId": "Resource141", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 17683, + "startLine": 13921, "startColumn": 15, - "endLine": 17683, + "endLine": 13921, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -42977,15 +42199,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource180", + "logicalId": "Resource142", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 17741, + "startLine": 13979, "startColumn": 15, - "endLine": 17741, + "endLine": 13979, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -42996,15 +42218,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource180", + "logicalId": "Resource142", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 17776, + "startLine": 14014, "startColumn": 15, - "endLine": 17776, + "endLine": 14014, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -43015,15 +42237,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource180", + "logicalId": "Resource142", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 17782, + "startLine": 14020, "startColumn": 15, - "endLine": 17782, + "endLine": 14020, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -43034,15 +42256,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource181", + "logicalId": "Resource143", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 17840, + "startLine": 14078, "startColumn": 15, - "endLine": 17840, + "endLine": 14078, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -43053,15 +42275,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource181", + "logicalId": "Resource143", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 17875, + "startLine": 14113, "startColumn": 15, - "endLine": 17875, + "endLine": 14113, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -43072,15 +42294,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource181", + "logicalId": "Resource143", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 17881, + "startLine": 14119, "startColumn": 15, - "endLine": 17881, + "endLine": 14119, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -43091,15 +42313,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource182", + "logicalId": "Resource144", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 17939, + "startLine": 14177, "startColumn": 15, - "endLine": 17939, + "endLine": 14177, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -43110,15 +42332,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource182", + "logicalId": "Resource144", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 17974, + "startLine": 14212, "startColumn": 15, - "endLine": 17974, + "endLine": 14212, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -43129,15 +42351,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource182", + "logicalId": "Resource144", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 17980, + "startLine": 14218, "startColumn": 15, - "endLine": 17980, + "endLine": 14218, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -43148,15 +42370,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource183", + "logicalId": "Resource145", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 18038, + "startLine": 14276, "startColumn": 15, - "endLine": 18038, + "endLine": 14276, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -43167,15 +42389,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource183", + "logicalId": "Resource145", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 18073, + "startLine": 14311, "startColumn": 15, - "endLine": 18073, + "endLine": 14311, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -43186,15 +42408,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource183", + "logicalId": "Resource145", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 18079, + "startLine": 14317, "startColumn": 15, - "endLine": 18079, + "endLine": 14317, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -43205,15 +42427,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource184", + "logicalId": "Resource146", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 18137, + "startLine": 14375, "startColumn": 15, - "endLine": 18137, + "endLine": 14375, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -43224,15 +42446,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource184", + "logicalId": "Resource146", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 18172, + "startLine": 14410, "startColumn": 15, - "endLine": 18172, + "endLine": 14410, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -43243,15 +42465,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource184", + "logicalId": "Resource146", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 18178, + "startLine": 14416, "startColumn": 15, - "endLine": 18178, + "endLine": 14416, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -43262,15 +42484,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource185", + "logicalId": "Resource147", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 18236, + "startLine": 14474, "startColumn": 15, - "endLine": 18236, + "endLine": 14474, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -43281,15 +42503,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource185", + "logicalId": "Resource147", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 18271, + "startLine": 14509, "startColumn": 15, - "endLine": 18271, + "endLine": 14509, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -43300,15 +42522,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource185", + "logicalId": "Resource147", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 18277, + "startLine": 14515, "startColumn": 15, - "endLine": 18277, + "endLine": 14515, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -43319,15 +42541,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource186", + "logicalId": "Resource148", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 18335, + "startLine": 14573, "startColumn": 15, - "endLine": 18335, + "endLine": 14573, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -43338,15 +42560,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource186", + "logicalId": "Resource148", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 18370, + "startLine": 14608, "startColumn": 15, - "endLine": 18370, + "endLine": 14608, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -43357,15 +42579,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource186", + "logicalId": "Resource148", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 18376, + "startLine": 14614, "startColumn": 15, - "endLine": 18376, + "endLine": 14614, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -43376,15 +42598,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource187", + "logicalId": "Resource149", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 18434, + "startLine": 14672, "startColumn": 15, - "endLine": 18434, + "endLine": 14672, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -43395,15 +42617,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource187", + "logicalId": "Resource149", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 18469, + "startLine": 14707, "startColumn": 15, - "endLine": 18469, + "endLine": 14707, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -43414,15 +42636,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource187", + "logicalId": "Resource149", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 18475, + "startLine": 14713, "startColumn": 15, - "endLine": 18475, + "endLine": 14713, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -43433,15 +42655,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource188", + "logicalId": "Resource150", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 18533, + "startLine": 14771, "startColumn": 15, - "endLine": 18533, + "endLine": 14771, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -43452,15 +42674,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource188", + "logicalId": "Resource150", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 18568, + "startLine": 14806, "startColumn": 15, - "endLine": 18568, + "endLine": 14806, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -43471,15 +42693,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource188", + "logicalId": "Resource150", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 18574, + "startLine": 14812, "startColumn": 15, - "endLine": 18574, + "endLine": 14812, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -43490,15 +42712,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource189", + "logicalId": "Resource151", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 18632, + "startLine": 14870, "startColumn": 15, - "endLine": 18632, + "endLine": 14870, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -43509,15 +42731,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource189", + "logicalId": "Resource151", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 18667, + "startLine": 14905, "startColumn": 15, - "endLine": 18667, + "endLine": 14905, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -43528,15 +42750,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource189", + "logicalId": "Resource151", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 18673, + "startLine": 14911, "startColumn": 15, - "endLine": 18673, + "endLine": 14911, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -43547,15 +42769,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource190", + "logicalId": "Resource152", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 18731, + "startLine": 14969, "startColumn": 15, - "endLine": 18731, + "endLine": 14969, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -43566,15 +42788,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource190", + "logicalId": "Resource152", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 18766, + "startLine": 15004, "startColumn": 15, - "endLine": 18766, + "endLine": 15004, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -43585,15 +42807,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource190", + "logicalId": "Resource152", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 18772, + "startLine": 15010, "startColumn": 15, - "endLine": 18772, + "endLine": 15010, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -43604,15 +42826,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource191", + "logicalId": "Resource153", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 18830, + "startLine": 15068, "startColumn": 15, - "endLine": 18830, + "endLine": 15068, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -43623,15 +42845,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource191", + "logicalId": "Resource153", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 18865, + "startLine": 15103, "startColumn": 15, - "endLine": 18865, + "endLine": 15103, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -43642,15 +42864,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource191", + "logicalId": "Resource153", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 18871, + "startLine": 15109, "startColumn": 15, - "endLine": 18871, + "endLine": 15109, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -43661,15 +42883,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource192", + "logicalId": "Resource154", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 18929, + "startLine": 15167, "startColumn": 15, - "endLine": 18929, + "endLine": 15167, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -43680,15 +42902,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource192", + "logicalId": "Resource154", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 18964, + "startLine": 15202, "startColumn": 15, - "endLine": 18964, + "endLine": 15202, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -43699,15 +42921,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource192", + "logicalId": "Resource154", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 18970, + "startLine": 15208, "startColumn": 15, - "endLine": 18970, + "endLine": 15208, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -43718,15 +42940,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource193", + "logicalId": "Resource155", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 19028, + "startLine": 15266, "startColumn": 15, - "endLine": 19028, + "endLine": 15266, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -43737,15 +42959,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource193", + "logicalId": "Resource155", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 19063, + "startLine": 15301, "startColumn": 15, - "endLine": 19063, + "endLine": 15301, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -43756,15 +42978,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource193", + "logicalId": "Resource155", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 19069, + "startLine": 15307, "startColumn": 15, - "endLine": 19069, + "endLine": 15307, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -43775,15 +42997,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource194", + "logicalId": "Resource156", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 19127, + "startLine": 15365, "startColumn": 15, - "endLine": 19127, + "endLine": 15365, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -43794,15 +43016,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource194", + "logicalId": "Resource156", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 19162, + "startLine": 15400, "startColumn": 15, - "endLine": 19162, + "endLine": 15400, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -43813,15 +43035,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource194", + "logicalId": "Resource156", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 19168, + "startLine": 15406, "startColumn": 15, - "endLine": 19168, + "endLine": 15406, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -43832,15 +43054,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource195", + "logicalId": "Resource157", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 19226, + "startLine": 15464, "startColumn": 15, - "endLine": 19226, + "endLine": 15464, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -43851,15 +43073,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource195", + "logicalId": "Resource157", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 19261, + "startLine": 15499, "startColumn": 15, - "endLine": 19261, + "endLine": 15499, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -43870,15 +43092,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource195", + "logicalId": "Resource157", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 19267, + "startLine": 15505, "startColumn": 15, - "endLine": 19267, + "endLine": 15505, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -43889,15 +43111,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource196", + "logicalId": "Resource158", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 19325, + "startLine": 15563, "startColumn": 15, - "endLine": 19325, + "endLine": 15563, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -43908,15 +43130,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource196", + "logicalId": "Resource158", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 19360, + "startLine": 15598, "startColumn": 15, - "endLine": 19360, + "endLine": 15598, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -43927,15 +43149,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource196", + "logicalId": "Resource158", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 19366, + "startLine": 15604, "startColumn": 15, - "endLine": 19366, + "endLine": 15604, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -43946,15 +43168,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource197", + "logicalId": "Resource159", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 19424, + "startLine": 15662, "startColumn": 15, - "endLine": 19424, + "endLine": 15662, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -43965,15 +43187,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource197", + "logicalId": "Resource159", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 19459, + "startLine": 15697, "startColumn": 15, - "endLine": 19459, + "endLine": 15697, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -43984,15 +43206,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource197", + "logicalId": "Resource159", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 19465, + "startLine": 15703, "startColumn": 15, - "endLine": 19465, + "endLine": 15703, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -44003,15 +43225,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource198", + "logicalId": "Resource160", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 19523, + "startLine": 15761, "startColumn": 15, - "endLine": 19523, + "endLine": 15761, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -44022,15 +43244,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource198", + "logicalId": "Resource160", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 19558, + "startLine": 15796, "startColumn": 15, - "endLine": 19558, + "endLine": 15796, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -44041,15 +43263,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource198", + "logicalId": "Resource160", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 19564, + "startLine": 15802, "startColumn": 15, - "endLine": 19564, + "endLine": 15802, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -44060,15 +43282,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource199", + "logicalId": "Resource161", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 19622, + "startLine": 15860, "startColumn": 15, - "endLine": 19622, + "endLine": 15860, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -44079,15 +43301,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource199", + "logicalId": "Resource161", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 19657, + "startLine": 15895, "startColumn": 15, - "endLine": 19657, + "endLine": 15895, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -44098,15 +43320,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource199", + "logicalId": "Resource161", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 19663, + "startLine": 15901, "startColumn": 15, - "endLine": 19663, + "endLine": 15901, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -44117,15 +43339,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource200", + "logicalId": "Resource162", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 19721, + "startLine": 15959, "startColumn": 15, - "endLine": 19721, + "endLine": 15959, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -44136,15 +43358,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource200", + "logicalId": "Resource162", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 19756, + "startLine": 15994, "startColumn": 15, - "endLine": 19756, + "endLine": 15994, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -44155,15 +43377,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource200", + "logicalId": "Resource162", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 19762, + "startLine": 16000, "startColumn": 15, - "endLine": 19762, + "endLine": 16000, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -44174,15 +43396,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource201", + "logicalId": "Resource163", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 19820, + "startLine": 16058, "startColumn": 15, - "endLine": 19820, + "endLine": 16058, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -44193,15 +43415,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource201", + "logicalId": "Resource163", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 19855, + "startLine": 16093, "startColumn": 15, - "endLine": 19855, + "endLine": 16093, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -44212,15 +43434,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource201", + "logicalId": "Resource163", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 19861, + "startLine": 16099, "startColumn": 15, - "endLine": 19861, + "endLine": 16099, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -44231,15 +43453,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource202", + "logicalId": "Resource164", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 19919, + "startLine": 16157, "startColumn": 15, - "endLine": 19919, + "endLine": 16157, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -44250,15 +43472,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource202", + "logicalId": "Resource164", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 19954, + "startLine": 16192, "startColumn": 15, - "endLine": 19954, + "endLine": 16192, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -44269,15 +43491,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource202", + "logicalId": "Resource164", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 19960, + "startLine": 16198, "startColumn": 15, - "endLine": 19960, + "endLine": 16198, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -44288,15 +43510,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource203", + "logicalId": "Resource165", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 20018, + "startLine": 16256, "startColumn": 15, - "endLine": 20018, + "endLine": 16256, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -44307,15 +43529,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource203", + "logicalId": "Resource165", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 20053, + "startLine": 16291, "startColumn": 15, - "endLine": 20053, + "endLine": 16291, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -44326,15 +43548,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource203", + "logicalId": "Resource165", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 20059, + "startLine": 16297, "startColumn": 15, - "endLine": 20059, + "endLine": 16297, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -44345,15 +43567,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource204", + "logicalId": "Resource166", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 20117, + "startLine": 16355, "startColumn": 15, - "endLine": 20117, + "endLine": 16355, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -44364,15 +43586,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource204", + "logicalId": "Resource166", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 20152, + "startLine": 16390, "startColumn": 15, - "endLine": 20152, + "endLine": 16390, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -44383,15 +43605,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource204", + "logicalId": "Resource166", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 20158, + "startLine": 16396, "startColumn": 15, - "endLine": 20158, + "endLine": 16396, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -44402,15 +43624,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource205", + "logicalId": "Resource167", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 20216, + "startLine": 16454, "startColumn": 15, - "endLine": 20216, + "endLine": 16454, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -44421,15 +43643,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource205", + "logicalId": "Resource167", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 20251, + "startLine": 16489, "startColumn": 15, - "endLine": 20251, + "endLine": 16489, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -44440,15 +43662,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource205", + "logicalId": "Resource167", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 20257, + "startLine": 16495, "startColumn": 15, - "endLine": 20257, + "endLine": 16495, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -44459,15 +43681,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource206", + "logicalId": "Resource168", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 20315, + "startLine": 16553, "startColumn": 15, - "endLine": 20315, + "endLine": 16553, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -44478,15 +43700,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource206", + "logicalId": "Resource168", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 20350, + "startLine": 16588, "startColumn": 15, - "endLine": 20350, + "endLine": 16588, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -44497,15 +43719,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource206", + "logicalId": "Resource168", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 20356, + "startLine": 16594, "startColumn": 15, - "endLine": 20356, + "endLine": 16594, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -44516,15 +43738,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource207", + "logicalId": "Resource169", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 20414, + "startLine": 16652, "startColumn": 15, - "endLine": 20414, + "endLine": 16652, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -44535,15 +43757,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource207", + "logicalId": "Resource169", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 20449, + "startLine": 16687, "startColumn": 15, - "endLine": 20449, + "endLine": 16687, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -44554,15 +43776,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource207", + "logicalId": "Resource169", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 20455, + "startLine": 16693, "startColumn": 15, - "endLine": 20455, + "endLine": 16693, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -44573,15 +43795,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource208", + "logicalId": "Resource170", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 20513, + "startLine": 16751, "startColumn": 15, - "endLine": 20513, + "endLine": 16751, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -44592,15 +43814,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource208", + "logicalId": "Resource170", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 20548, + "startLine": 16786, "startColumn": 15, - "endLine": 20548, + "endLine": 16786, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -44611,15 +43833,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource208", + "logicalId": "Resource170", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 20554, + "startLine": 16792, "startColumn": 15, - "endLine": 20554, + "endLine": 16792, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -44630,15 +43852,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource209", + "logicalId": "Resource171", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 20612, + "startLine": 16850, "startColumn": 15, - "endLine": 20612, + "endLine": 16850, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -44649,15 +43871,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource209", + "logicalId": "Resource171", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 20647, + "startLine": 16885, "startColumn": 15, - "endLine": 20647, + "endLine": 16885, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -44668,15 +43890,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource209", + "logicalId": "Resource171", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 20653, + "startLine": 16891, "startColumn": 15, - "endLine": 20653, + "endLine": 16891, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -44687,15 +43909,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource210", + "logicalId": "Resource172", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 20711, + "startLine": 16949, "startColumn": 15, - "endLine": 20711, + "endLine": 16949, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -44706,15 +43928,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource210", + "logicalId": "Resource172", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 20746, + "startLine": 16984, "startColumn": 15, - "endLine": 20746, + "endLine": 16984, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -44725,15 +43947,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource210", + "logicalId": "Resource172", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 20752, + "startLine": 16990, "startColumn": 15, - "endLine": 20752, + "endLine": 16990, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -44744,15 +43966,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource211", + "logicalId": "Resource173", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 20810, + "startLine": 17048, "startColumn": 15, - "endLine": 20810, + "endLine": 17048, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -44763,15 +43985,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource211", + "logicalId": "Resource173", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 20845, + "startLine": 17083, "startColumn": 15, - "endLine": 20845, + "endLine": 17083, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -44782,15 +44004,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource211", + "logicalId": "Resource173", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 20851, + "startLine": 17089, "startColumn": 15, - "endLine": 20851, + "endLine": 17089, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -44801,15 +44023,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource212", + "logicalId": "Resource174", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 20909, + "startLine": 17147, "startColumn": 15, - "endLine": 20909, + "endLine": 17147, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -44820,15 +44042,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource212", + "logicalId": "Resource174", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 20944, + "startLine": 17182, "startColumn": 15, - "endLine": 20944, + "endLine": 17182, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -44839,15 +44061,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource212", + "logicalId": "Resource174", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 20950, + "startLine": 17188, "startColumn": 15, - "endLine": 20950, + "endLine": 17188, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -44858,15 +44080,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource213", + "logicalId": "Resource175", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 21008, + "startLine": 17246, "startColumn": 15, - "endLine": 21008, + "endLine": 17246, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -44877,15 +44099,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource213", + "logicalId": "Resource175", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 21043, + "startLine": 17281, "startColumn": 15, - "endLine": 21043, + "endLine": 17281, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -44896,15 +44118,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource213", + "logicalId": "Resource175", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 21049, + "startLine": 17287, "startColumn": 15, - "endLine": 21049, + "endLine": 17287, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -44915,15 +44137,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource214", + "logicalId": "Resource176", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 21107, + "startLine": 17345, "startColumn": 15, - "endLine": 21107, + "endLine": 17345, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -44934,15 +44156,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource214", + "logicalId": "Resource176", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 21142, + "startLine": 17380, "startColumn": 15, - "endLine": 21142, + "endLine": 17380, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -44953,15 +44175,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource214", + "logicalId": "Resource176", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 21148, + "startLine": 17386, "startColumn": 15, - "endLine": 21148, + "endLine": 17386, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -44972,15 +44194,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource215", + "logicalId": "Resource177", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 21206, + "startLine": 17444, "startColumn": 15, - "endLine": 21206, + "endLine": 17444, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -44991,15 +44213,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource215", + "logicalId": "Resource177", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 21241, + "startLine": 17479, "startColumn": 15, - "endLine": 21241, + "endLine": 17479, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -45010,15 +44232,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource215", + "logicalId": "Resource177", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 21247, + "startLine": 17485, "startColumn": 15, - "endLine": 21247, + "endLine": 17485, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -45029,15 +44251,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource216", + "logicalId": "Resource178", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 21305, + "startLine": 17543, "startColumn": 15, - "endLine": 21305, + "endLine": 17543, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -45048,15 +44270,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource216", + "logicalId": "Resource178", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 21340, + "startLine": 17578, "startColumn": 15, - "endLine": 21340, + "endLine": 17578, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -45067,15 +44289,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource216", + "logicalId": "Resource178", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 21346, + "startLine": 17584, "startColumn": 15, - "endLine": 21346, + "endLine": 17584, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -45086,15 +44308,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource217", + "logicalId": "Resource179", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 21404, + "startLine": 17642, "startColumn": 15, - "endLine": 21404, + "endLine": 17642, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -45105,15 +44327,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource217", + "logicalId": "Resource179", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 21439, + "startLine": 17677, "startColumn": 15, - "endLine": 21439, + "endLine": 17677, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -45124,15 +44346,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource217", + "logicalId": "Resource179", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 21445, + "startLine": 17683, "startColumn": 15, - "endLine": 21445, + "endLine": 17683, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -45143,15 +44365,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource218", + "logicalId": "Resource180", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 21503, + "startLine": 17741, "startColumn": 15, - "endLine": 21503, + "endLine": 17741, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -45162,15 +44384,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource218", + "logicalId": "Resource180", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 21538, + "startLine": 17776, "startColumn": 15, - "endLine": 21538, + "endLine": 17776, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -45181,15 +44403,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource218", + "logicalId": "Resource180", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 21544, + "startLine": 17782, "startColumn": 15, - "endLine": 21544, + "endLine": 17782, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -45200,15 +44422,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource219", + "logicalId": "Resource181", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 21602, + "startLine": 17840, "startColumn": 15, - "endLine": 21602, + "endLine": 17840, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -45219,15 +44441,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource219", + "logicalId": "Resource181", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 21637, + "startLine": 17875, "startColumn": 15, - "endLine": 21637, + "endLine": 17875, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -45238,15 +44460,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource219", + "logicalId": "Resource181", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 21643, + "startLine": 17881, "startColumn": 15, - "endLine": 21643, + "endLine": 17881, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -45257,15 +44479,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource220", + "logicalId": "Resource182", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 21701, + "startLine": 17939, "startColumn": 15, - "endLine": 21701, + "endLine": 17939, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -45276,15 +44498,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource220", + "logicalId": "Resource182", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 21736, + "startLine": 17974, "startColumn": 15, - "endLine": 21736, + "endLine": 17974, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -45295,15 +44517,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource220", + "logicalId": "Resource182", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 21742, + "startLine": 17980, "startColumn": 15, - "endLine": 21742, + "endLine": 17980, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -45314,15 +44536,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource221", + "logicalId": "Resource183", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 21800, + "startLine": 18038, "startColumn": 15, - "endLine": 21800, + "endLine": 18038, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -45333,15 +44555,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource221", + "logicalId": "Resource183", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 21835, + "startLine": 18073, "startColumn": 15, - "endLine": 21835, + "endLine": 18073, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -45352,15 +44574,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource221", + "logicalId": "Resource183", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 21841, + "startLine": 18079, "startColumn": 15, - "endLine": 21841, + "endLine": 18079, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -45371,15 +44593,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource222", + "logicalId": "Resource184", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 21899, + "startLine": 18137, "startColumn": 15, - "endLine": 21899, + "endLine": 18137, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -45390,15 +44612,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource222", + "logicalId": "Resource184", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 21934, + "startLine": 18172, "startColumn": 15, - "endLine": 21934, + "endLine": 18172, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -45409,15 +44631,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource222", + "logicalId": "Resource184", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 21940, + "startLine": 18178, "startColumn": 15, - "endLine": 21940, + "endLine": 18178, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -45428,15 +44650,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource223", + "logicalId": "Resource185", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 21998, + "startLine": 18236, "startColumn": 15, - "endLine": 21998, + "endLine": 18236, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -45447,15 +44669,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource223", + "logicalId": "Resource185", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 22033, + "startLine": 18271, "startColumn": 15, - "endLine": 22033, + "endLine": 18271, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -45466,15 +44688,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource223", + "logicalId": "Resource185", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 22039, + "startLine": 18277, "startColumn": 15, - "endLine": 22039, + "endLine": 18277, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -45485,15 +44707,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource224", + "logicalId": "Resource186", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 22097, + "startLine": 18335, "startColumn": 15, - "endLine": 22097, + "endLine": 18335, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -45504,15 +44726,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource224", + "logicalId": "Resource186", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 22132, + "startLine": 18370, "startColumn": 15, - "endLine": 22132, + "endLine": 18370, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -45523,15 +44745,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource224", + "logicalId": "Resource186", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 22138, + "startLine": 18376, "startColumn": 15, - "endLine": 22138, + "endLine": 18376, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -45542,15 +44764,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource225", + "logicalId": "Resource187", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 22196, + "startLine": 18434, "startColumn": 15, - "endLine": 22196, + "endLine": 18434, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -45561,15 +44783,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource225", + "logicalId": "Resource187", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 22231, + "startLine": 18469, "startColumn": 15, - "endLine": 22231, + "endLine": 18469, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -45580,15 +44802,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource225", + "logicalId": "Resource187", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 22237, + "startLine": 18475, "startColumn": 15, - "endLine": 22237, + "endLine": 18475, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -45599,15 +44821,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource226", + "logicalId": "Resource188", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 22295, + "startLine": 18533, "startColumn": 15, - "endLine": 22295, + "endLine": 18533, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -45618,15 +44840,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource226", + "logicalId": "Resource188", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 22330, + "startLine": 18568, "startColumn": 15, - "endLine": 22330, + "endLine": 18568, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -45637,15 +44859,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource226", + "logicalId": "Resource188", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 22336, + "startLine": 18574, "startColumn": 15, - "endLine": 22336, + "endLine": 18574, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -45656,15 +44878,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource227", + "logicalId": "Resource189", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 22394, + "startLine": 18632, "startColumn": 15, - "endLine": 22394, + "endLine": 18632, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -45675,15 +44897,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource227", + "logicalId": "Resource189", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 22429, + "startLine": 18667, "startColumn": 15, - "endLine": 22429, + "endLine": 18667, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -45694,15 +44916,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource227", + "logicalId": "Resource189", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 22435, + "startLine": 18673, "startColumn": 15, - "endLine": 22435, + "endLine": 18673, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -45713,15 +44935,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource228", + "logicalId": "Resource190", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 22493, + "startLine": 18731, "startColumn": 15, - "endLine": 22493, + "endLine": 18731, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -45732,15 +44954,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource228", + "logicalId": "Resource190", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 22528, + "startLine": 18766, "startColumn": 15, - "endLine": 22528, + "endLine": 18766, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -45751,15 +44973,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource228", + "logicalId": "Resource190", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 22534, + "startLine": 18772, "startColumn": 15, - "endLine": 22534, + "endLine": 18772, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -45770,15 +44992,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource229", + "logicalId": "Resource191", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 22592, + "startLine": 18830, "startColumn": 15, - "endLine": 22592, + "endLine": 18830, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -45789,15 +45011,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource229", + "logicalId": "Resource191", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 22627, + "startLine": 18865, "startColumn": 15, - "endLine": 22627, + "endLine": 18865, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -45808,15 +45030,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource229", + "logicalId": "Resource191", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 22633, + "startLine": 18871, "startColumn": 15, - "endLine": 22633, + "endLine": 18871, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -45827,15 +45049,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource230", + "logicalId": "Resource192", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 22691, + "startLine": 18929, "startColumn": 15, - "endLine": 22691, + "endLine": 18929, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -45846,15 +45068,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource230", + "logicalId": "Resource192", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 22726, + "startLine": 18964, "startColumn": 15, - "endLine": 22726, + "endLine": 18964, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -45865,15 +45087,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource230", + "logicalId": "Resource192", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 22732, + "startLine": 18970, "startColumn": 15, - "endLine": 22732, + "endLine": 18970, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -45884,15 +45106,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource231", + "logicalId": "Resource193", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 22790, + "startLine": 19028, "startColumn": 15, - "endLine": 22790, + "endLine": 19028, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -45903,15 +45125,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource231", + "logicalId": "Resource193", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 22825, + "startLine": 19063, "startColumn": 15, - "endLine": 22825, + "endLine": 19063, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -45922,15 +45144,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource231", + "logicalId": "Resource193", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 22831, + "startLine": 19069, "startColumn": 15, - "endLine": 22831, + "endLine": 19069, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -45941,15 +45163,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource232", + "logicalId": "Resource194", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 22889, + "startLine": 19127, "startColumn": 15, - "endLine": 22889, + "endLine": 19127, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -45960,15 +45182,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource232", + "logicalId": "Resource194", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 22924, + "startLine": 19162, "startColumn": 15, - "endLine": 22924, + "endLine": 19162, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -45979,15 +45201,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource232", + "logicalId": "Resource194", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 22930, + "startLine": 19168, "startColumn": 15, - "endLine": 22930, + "endLine": 19168, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -45998,15 +45220,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource233", + "logicalId": "Resource195", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 22988, + "startLine": 19226, "startColumn": 15, - "endLine": 22988, + "endLine": 19226, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -46017,15 +45239,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource233", + "logicalId": "Resource195", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 23023, + "startLine": 19261, "startColumn": 15, - "endLine": 23023, + "endLine": 19261, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -46036,15 +45258,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource233", + "logicalId": "Resource195", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 23029, + "startLine": 19267, "startColumn": 15, - "endLine": 23029, + "endLine": 19267, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -46055,15 +45277,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource234", + "logicalId": "Resource196", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 23087, + "startLine": 19325, "startColumn": 15, - "endLine": 23087, + "endLine": 19325, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -46074,15 +45296,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource234", + "logicalId": "Resource196", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 23122, + "startLine": 19360, "startColumn": 15, - "endLine": 23122, + "endLine": 19360, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -46093,15 +45315,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource234", + "logicalId": "Resource196", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 23128, + "startLine": 19366, "startColumn": 15, - "endLine": 23128, + "endLine": 19366, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -46112,15 +45334,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource235", + "logicalId": "Resource197", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 23186, + "startLine": 19424, "startColumn": 15, - "endLine": 23186, + "endLine": 19424, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -46131,15 +45353,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource235", + "logicalId": "Resource197", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 23221, + "startLine": 19459, "startColumn": 15, - "endLine": 23221, + "endLine": 19459, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -46150,15 +45372,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource235", + "logicalId": "Resource197", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 23227, + "startLine": 19465, "startColumn": 15, - "endLine": 23227, + "endLine": 19465, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -46169,15 +45391,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource236", + "logicalId": "Resource198", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 23285, + "startLine": 19523, "startColumn": 15, - "endLine": 23285, + "endLine": 19523, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -46188,15 +45410,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource236", + "logicalId": "Resource198", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 23320, + "startLine": 19558, "startColumn": 15, - "endLine": 23320, + "endLine": 19558, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -46207,15 +45429,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource236", + "logicalId": "Resource198", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 23326, + "startLine": 19564, "startColumn": 15, - "endLine": 23326, + "endLine": 19564, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -46226,15 +45448,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource237", + "logicalId": "Resource199", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 23384, + "startLine": 19622, "startColumn": 15, - "endLine": 23384, + "endLine": 19622, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -46245,15 +45467,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource237", + "logicalId": "Resource199", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 23419, + "startLine": 19657, "startColumn": 15, - "endLine": 23419, + "endLine": 19657, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -46264,15 +45486,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource237", + "logicalId": "Resource199", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 23425, + "startLine": 19663, "startColumn": 15, - "endLine": 23425, + "endLine": 19663, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -46283,15 +45505,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource238", + "logicalId": "Resource200", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 23483, + "startLine": 19721, "startColumn": 15, - "endLine": 23483, + "endLine": 19721, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -46302,15 +45524,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource238", + "logicalId": "Resource200", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 23518, + "startLine": 19756, "startColumn": 15, - "endLine": 23518, + "endLine": 19756, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -46321,15 +45543,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource238", + "logicalId": "Resource200", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 23524, + "startLine": 19762, "startColumn": 15, - "endLine": 23524, + "endLine": 19762, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -46340,15 +45562,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource239", + "logicalId": "Resource201", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 23582, + "startLine": 19820, "startColumn": 15, - "endLine": 23582, + "endLine": 19820, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -46359,15 +45581,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource239", + "logicalId": "Resource201", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 23617, + "startLine": 19855, "startColumn": 15, - "endLine": 23617, + "endLine": 19855, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -46378,15 +45600,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource239", + "logicalId": "Resource201", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 23623, + "startLine": 19861, "startColumn": 15, - "endLine": 23623, + "endLine": 19861, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -46397,15 +45619,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource240", + "logicalId": "Resource202", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 23681, + "startLine": 19919, "startColumn": 15, - "endLine": 23681, + "endLine": 19919, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -46416,15 +45638,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource240", + "logicalId": "Resource202", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 23716, + "startLine": 19954, "startColumn": 15, - "endLine": 23716, + "endLine": 19954, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -46435,15 +45657,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource240", + "logicalId": "Resource202", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 23722, + "startLine": 19960, "startColumn": 15, - "endLine": 23722, + "endLine": 19960, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -46454,15 +45676,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource241", + "logicalId": "Resource203", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 23780, + "startLine": 20018, "startColumn": 15, - "endLine": 23780, + "endLine": 20018, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -46473,15 +45695,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource241", + "logicalId": "Resource203", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 23815, + "startLine": 20053, "startColumn": 15, - "endLine": 23815, + "endLine": 20053, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -46492,15 +45714,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource241", + "logicalId": "Resource203", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 23821, + "startLine": 20059, "startColumn": 15, - "endLine": 23821, + "endLine": 20059, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -46511,15 +45733,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource242", + "logicalId": "Resource204", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 23879, + "startLine": 20117, "startColumn": 15, - "endLine": 23879, + "endLine": 20117, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -46530,15 +45752,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource242", + "logicalId": "Resource204", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 23914, + "startLine": 20152, "startColumn": 15, - "endLine": 23914, + "endLine": 20152, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -46549,15 +45771,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource242", + "logicalId": "Resource204", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 23920, + "startLine": 20158, "startColumn": 15, - "endLine": 23920, + "endLine": 20158, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -46568,15 +45790,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource243", + "logicalId": "Resource205", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 23978, + "startLine": 20216, "startColumn": 15, - "endLine": 23978, + "endLine": 20216, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -46587,15 +45809,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource243", + "logicalId": "Resource205", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 24013, + "startLine": 20251, "startColumn": 15, - "endLine": 24013, + "endLine": 20251, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -46606,15 +45828,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource243", + "logicalId": "Resource205", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 24019, + "startLine": 20257, "startColumn": 15, - "endLine": 24019, + "endLine": 20257, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -46625,15 +45847,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource244", + "logicalId": "Resource206", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 24077, + "startLine": 20315, "startColumn": 15, - "endLine": 24077, + "endLine": 20315, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -46644,15 +45866,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource244", + "logicalId": "Resource206", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 24112, + "startLine": 20350, "startColumn": 15, - "endLine": 24112, + "endLine": 20350, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -46663,15 +45885,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource244", + "logicalId": "Resource206", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 24118, + "startLine": 20356, "startColumn": 15, - "endLine": 24118, + "endLine": 20356, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -46682,15 +45904,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource245", + "logicalId": "Resource207", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 24176, + "startLine": 20414, "startColumn": 15, - "endLine": 24176, + "endLine": 20414, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -46701,15 +45923,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource245", + "logicalId": "Resource207", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 24211, + "startLine": 20449, "startColumn": 15, - "endLine": 24211, + "endLine": 20449, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -46720,15 +45942,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource245", + "logicalId": "Resource207", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 24217, + "startLine": 20455, "startColumn": 15, - "endLine": 24217, + "endLine": 20455, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -46739,15 +45961,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource246", + "logicalId": "Resource208", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 24275, + "startLine": 20513, "startColumn": 15, - "endLine": 24275, + "endLine": 20513, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -46758,15 +45980,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource246", + "logicalId": "Resource208", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 24310, + "startLine": 20548, "startColumn": 15, - "endLine": 24310, + "endLine": 20548, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -46777,15 +45999,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource246", + "logicalId": "Resource208", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 24316, + "startLine": 20554, "startColumn": 15, - "endLine": 24316, + "endLine": 20554, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -46796,15 +46018,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource247", + "logicalId": "Resource209", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 24374, + "startLine": 20612, "startColumn": 15, - "endLine": 24374, + "endLine": 20612, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -46815,15 +46037,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource247", + "logicalId": "Resource209", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 24409, + "startLine": 20647, "startColumn": 15, - "endLine": 24409, + "endLine": 20647, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -46834,15 +46056,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource247", + "logicalId": "Resource209", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 24415, + "startLine": 20653, "startColumn": 15, - "endLine": 24415, + "endLine": 20653, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -46853,15 +46075,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource248", + "logicalId": "Resource210", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 24473, + "startLine": 20711, "startColumn": 15, - "endLine": 24473, + "endLine": 20711, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -46872,15 +46094,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource248", + "logicalId": "Resource210", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 24508, + "startLine": 20746, "startColumn": 15, - "endLine": 24508, + "endLine": 20746, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -46891,15 +46113,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource248", + "logicalId": "Resource210", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 24514, + "startLine": 20752, "startColumn": 15, - "endLine": 24514, + "endLine": 20752, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -46910,15 +46132,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource249", + "logicalId": "Resource211", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 24572, + "startLine": 20810, "startColumn": 15, - "endLine": 24572, + "endLine": 20810, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -46929,15 +46151,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource249", + "logicalId": "Resource211", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 24607, + "startLine": 20845, "startColumn": 15, - "endLine": 24607, + "endLine": 20845, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -46948,15 +46170,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource249", + "logicalId": "Resource211", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 24613, + "startLine": 20851, "startColumn": 15, - "endLine": 24613, + "endLine": 20851, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -46967,15 +46189,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource250", + "logicalId": "Resource212", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 24671, + "startLine": 20909, "startColumn": 15, - "endLine": 24671, + "endLine": 20909, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -46986,15 +46208,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource250", + "logicalId": "Resource212", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 24706, + "startLine": 20944, "startColumn": 15, - "endLine": 24706, + "endLine": 20944, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -47005,15 +46227,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource250", + "logicalId": "Resource212", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 24712, + "startLine": 20950, "startColumn": 15, - "endLine": 24712, + "endLine": 20950, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -47024,15 +46246,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource251", + "logicalId": "Resource213", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 24770, + "startLine": 21008, "startColumn": 15, - "endLine": 24770, + "endLine": 21008, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -47043,15 +46265,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource251", + "logicalId": "Resource213", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 24805, + "startLine": 21043, "startColumn": 15, - "endLine": 24805, + "endLine": 21043, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -47062,15 +46284,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource251", + "logicalId": "Resource213", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 24811, + "startLine": 21049, "startColumn": 15, - "endLine": 24811, + "endLine": 21049, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -47081,15 +46303,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource252", + "logicalId": "Resource214", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 24869, + "startLine": 21107, "startColumn": 15, - "endLine": 24869, + "endLine": 21107, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -47100,15 +46322,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource252", + "logicalId": "Resource214", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 24904, + "startLine": 21142, "startColumn": 15, - "endLine": 24904, + "endLine": 21142, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -47119,15 +46341,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource252", + "logicalId": "Resource214", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 24910, + "startLine": 21148, "startColumn": 15, - "endLine": 24910, + "endLine": 21148, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -47138,15 +46360,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource253", + "logicalId": "Resource215", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 24968, + "startLine": 21206, "startColumn": 15, - "endLine": 24968, + "endLine": 21206, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -47157,15 +46379,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource253", + "logicalId": "Resource215", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 25003, + "startLine": 21241, "startColumn": 15, - "endLine": 25003, + "endLine": 21241, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -47176,15 +46398,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource253", + "logicalId": "Resource215", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 25009, + "startLine": 21247, "startColumn": 15, - "endLine": 25009, + "endLine": 21247, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -47195,15 +46417,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource254", + "logicalId": "Resource216", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 25067, + "startLine": 21305, "startColumn": 15, - "endLine": 25067, + "endLine": 21305, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -47214,15 +46436,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource254", + "logicalId": "Resource216", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 25102, + "startLine": 21340, "startColumn": 15, - "endLine": 25102, + "endLine": 21340, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -47233,15 +46455,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource254", + "logicalId": "Resource216", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 25108, + "startLine": 21346, "startColumn": 15, - "endLine": 25108, + "endLine": 21346, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -47252,15 +46474,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource255", + "logicalId": "Resource217", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 25166, + "startLine": 21404, "startColumn": 15, - "endLine": 25166, + "endLine": 21404, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -47271,15 +46493,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource255", + "logicalId": "Resource217", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 25201, + "startLine": 21439, "startColumn": 15, - "endLine": 25201, + "endLine": 21439, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -47290,15 +46512,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource255", + "logicalId": "Resource217", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 25207, + "startLine": 21445, "startColumn": 15, - "endLine": 25207, + "endLine": 21445, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -47309,15 +46531,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource256", + "logicalId": "Resource218", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 25265, + "startLine": 21503, "startColumn": 15, - "endLine": 25265, + "endLine": 21503, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -47328,15 +46550,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource256", + "logicalId": "Resource218", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 25300, + "startLine": 21538, "startColumn": 15, - "endLine": 25300, + "endLine": 21538, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -47347,15 +46569,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource256", + "logicalId": "Resource218", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 25306, + "startLine": 21544, "startColumn": 15, - "endLine": 25306, + "endLine": 21544, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -47366,15 +46588,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource257", + "logicalId": "Resource219", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 25364, + "startLine": 21602, "startColumn": 15, - "endLine": 25364, + "endLine": 21602, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -47385,15 +46607,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource257", + "logicalId": "Resource219", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 25399, + "startLine": 21637, "startColumn": 15, - "endLine": 25399, + "endLine": 21637, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -47404,15 +46626,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource257", + "logicalId": "Resource219", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 25405, + "startLine": 21643, "startColumn": 15, - "endLine": 25405, + "endLine": 21643, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -47423,15 +46645,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource258", + "logicalId": "Resource220", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 25463, + "startLine": 21701, "startColumn": 15, - "endLine": 25463, + "endLine": 21701, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -47442,15 +46664,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource258", + "logicalId": "Resource220", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 25498, + "startLine": 21736, "startColumn": 15, - "endLine": 25498, + "endLine": 21736, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -47461,15 +46683,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource258", + "logicalId": "Resource220", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 25504, + "startLine": 21742, "startColumn": 15, - "endLine": 25504, + "endLine": 21742, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -47480,15 +46702,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource259", + "logicalId": "Resource221", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 25562, + "startLine": 21800, "startColumn": 15, - "endLine": 25562, + "endLine": 21800, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -47499,15 +46721,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource259", + "logicalId": "Resource221", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 25597, + "startLine": 21835, "startColumn": 15, - "endLine": 25597, + "endLine": 21835, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -47518,15 +46740,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource259", + "logicalId": "Resource221", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 25603, + "startLine": 21841, "startColumn": 15, - "endLine": 25603, + "endLine": 21841, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -47537,15 +46759,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource260", + "logicalId": "Resource222", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 25661, + "startLine": 21899, "startColumn": 15, - "endLine": 25661, + "endLine": 21899, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -47556,15 +46778,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource260", + "logicalId": "Resource222", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 25696, + "startLine": 21934, "startColumn": 15, - "endLine": 25696, + "endLine": 21934, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -47575,15 +46797,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource260", + "logicalId": "Resource222", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 25702, + "startLine": 21940, "startColumn": 15, - "endLine": 25702, + "endLine": 21940, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -47594,15 +46816,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource261", + "logicalId": "Resource223", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 25760, + "startLine": 21998, "startColumn": 15, - "endLine": 25760, + "endLine": 21998, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -47613,15 +46835,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource261", + "logicalId": "Resource223", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 25795, + "startLine": 22033, "startColumn": 15, - "endLine": 25795, + "endLine": 22033, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -47632,15 +46854,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource261", + "logicalId": "Resource223", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 25801, + "startLine": 22039, "startColumn": 15, - "endLine": 25801, + "endLine": 22039, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -47651,15 +46873,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource262", + "logicalId": "Resource224", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 25859, + "startLine": 22097, "startColumn": 15, - "endLine": 25859, + "endLine": 22097, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -47670,15 +46892,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource262", + "logicalId": "Resource224", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 25894, + "startLine": 22132, "startColumn": 15, - "endLine": 25894, + "endLine": 22132, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -47689,15 +46911,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource262", + "logicalId": "Resource224", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 25900, + "startLine": 22138, "startColumn": 15, - "endLine": 25900, + "endLine": 22138, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -47708,15 +46930,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource263", + "logicalId": "Resource225", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 25958, + "startLine": 22196, "startColumn": 15, - "endLine": 25958, + "endLine": 22196, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -47727,15 +46949,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource263", + "logicalId": "Resource225", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 25993, + "startLine": 22231, "startColumn": 15, - "endLine": 25993, + "endLine": 22231, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -47746,15 +46968,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource263", + "logicalId": "Resource225", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 25999, + "startLine": 22237, "startColumn": 15, - "endLine": 25999, + "endLine": 22237, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -47765,15 +46987,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource264", + "logicalId": "Resource226", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 26057, + "startLine": 22295, "startColumn": 15, - "endLine": 26057, + "endLine": 22295, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -47784,15 +47006,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource264", + "logicalId": "Resource226", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 26092, + "startLine": 22330, "startColumn": 15, - "endLine": 26092, + "endLine": 22330, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -47803,15 +47025,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource264", + "logicalId": "Resource226", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 26098, + "startLine": 22336, "startColumn": 15, - "endLine": 26098, + "endLine": 22336, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -47822,15 +47044,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource265", + "logicalId": "Resource227", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 26156, + "startLine": 22394, "startColumn": 15, - "endLine": 26156, + "endLine": 22394, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -47841,15 +47063,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource265", + "logicalId": "Resource227", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 26191, + "startLine": 22429, "startColumn": 15, - "endLine": 26191, + "endLine": 22429, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -47860,15 +47082,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource265", + "logicalId": "Resource227", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 26197, + "startLine": 22435, "startColumn": 15, - "endLine": 26197, + "endLine": 22435, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -47879,15 +47101,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource266", + "logicalId": "Resource228", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 26255, + "startLine": 22493, "startColumn": 15, - "endLine": 26255, + "endLine": 22493, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -47898,15 +47120,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource266", + "logicalId": "Resource228", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 26290, + "startLine": 22528, "startColumn": 15, - "endLine": 26290, + "endLine": 22528, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -47917,15 +47139,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource266", + "logicalId": "Resource228", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 26296, + "startLine": 22534, "startColumn": 15, - "endLine": 26296, + "endLine": 22534, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -47936,15 +47158,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource267", + "logicalId": "Resource229", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 26354, + "startLine": 22592, "startColumn": 15, - "endLine": 26354, + "endLine": 22592, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -47955,15 +47177,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource267", + "logicalId": "Resource229", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 26389, + "startLine": 22627, "startColumn": 15, - "endLine": 26389, + "endLine": 22627, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -47974,15 +47196,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource267", + "logicalId": "Resource229", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 26395, + "startLine": 22633, "startColumn": 15, - "endLine": 26395, + "endLine": 22633, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -47993,15 +47215,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource268", + "logicalId": "Resource230", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 26453, + "startLine": 22691, "startColumn": 15, - "endLine": 26453, + "endLine": 22691, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -48012,15 +47234,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource268", + "logicalId": "Resource230", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 26488, + "startLine": 22726, "startColumn": 15, - "endLine": 26488, + "endLine": 22726, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -48031,15 +47253,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource268", + "logicalId": "Resource230", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 26494, + "startLine": 22732, "startColumn": 15, - "endLine": 26494, + "endLine": 22732, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -48050,15 +47272,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource269", + "logicalId": "Resource231", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 26552, + "startLine": 22790, "startColumn": 15, - "endLine": 26552, + "endLine": 22790, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -48069,15 +47291,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource269", + "logicalId": "Resource231", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 26587, + "startLine": 22825, "startColumn": 15, - "endLine": 26587, + "endLine": 22825, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -48088,15 +47310,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource269", + "logicalId": "Resource231", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 26593, + "startLine": 22831, "startColumn": 15, - "endLine": 26593, + "endLine": 22831, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -48107,15 +47329,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource270", + "logicalId": "Resource232", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 26651, + "startLine": 22889, "startColumn": 15, - "endLine": 26651, + "endLine": 22889, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -48126,15 +47348,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource270", + "logicalId": "Resource232", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 26686, + "startLine": 22924, "startColumn": 15, - "endLine": 26686, + "endLine": 22924, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -48145,15 +47367,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource270", + "logicalId": "Resource232", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 26692, + "startLine": 22930, "startColumn": 15, - "endLine": 26692, + "endLine": 22930, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -48164,15 +47386,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource271", + "logicalId": "Resource233", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 26750, + "startLine": 22988, "startColumn": 15, - "endLine": 26750, + "endLine": 22988, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -48183,15 +47405,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource271", + "logicalId": "Resource233", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 26785, + "startLine": 23023, "startColumn": 15, - "endLine": 26785, + "endLine": 23023, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -48202,15 +47424,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource271", + "logicalId": "Resource233", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 26791, + "startLine": 23029, "startColumn": 15, - "endLine": 26791, + "endLine": 23029, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -48221,15 +47443,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource272", + "logicalId": "Resource234", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 26849, + "startLine": 23087, "startColumn": 15, - "endLine": 26849, + "endLine": 23087, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -48240,15 +47462,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource272", + "logicalId": "Resource234", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 26884, + "startLine": 23122, "startColumn": 15, - "endLine": 26884, + "endLine": 23122, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -48259,15 +47481,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource272", + "logicalId": "Resource234", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 26890, + "startLine": 23128, "startColumn": 15, - "endLine": 26890, + "endLine": 23128, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -48278,15 +47500,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource273", + "logicalId": "Resource235", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 26948, + "startLine": 23186, "startColumn": 15, - "endLine": 26948, + "endLine": 23186, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -48297,15 +47519,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource273", + "logicalId": "Resource235", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 26983, + "startLine": 23221, "startColumn": 15, - "endLine": 26983, + "endLine": 23221, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -48316,15 +47538,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource273", + "logicalId": "Resource235", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 26989, + "startLine": 23227, "startColumn": 15, - "endLine": 26989, + "endLine": 23227, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -48335,15 +47557,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource274", + "logicalId": "Resource236", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 27047, + "startLine": 23285, "startColumn": 15, - "endLine": 27047, + "endLine": 23285, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -48354,15 +47576,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource274", + "logicalId": "Resource236", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 27082, + "startLine": 23320, "startColumn": 15, - "endLine": 27082, + "endLine": 23320, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -48373,15 +47595,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource274", + "logicalId": "Resource236", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 27088, + "startLine": 23326, "startColumn": 15, - "endLine": 27088, + "endLine": 23326, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -48392,15 +47614,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource275", + "logicalId": "Resource237", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 27146, + "startLine": 23384, "startColumn": 15, - "endLine": 27146, + "endLine": 23384, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -48411,15 +47633,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource275", + "logicalId": "Resource237", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 27181, + "startLine": 23419, "startColumn": 15, - "endLine": 27181, + "endLine": 23419, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -48430,15 +47652,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource275", + "logicalId": "Resource237", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 27187, + "startLine": 23425, "startColumn": 15, - "endLine": 27187, + "endLine": 23425, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -48449,15 +47671,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource276", + "logicalId": "Resource238", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 27245, + "startLine": 23483, "startColumn": 15, - "endLine": 27245, + "endLine": 23483, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -48468,15 +47690,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource276", + "logicalId": "Resource238", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 27280, + "startLine": 23518, "startColumn": 15, - "endLine": 27280, + "endLine": 23518, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -48487,15 +47709,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource276", + "logicalId": "Resource238", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 27286, + "startLine": 23524, "startColumn": 15, - "endLine": 27286, + "endLine": 23524, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -48506,15 +47728,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource277", + "logicalId": "Resource239", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 27344, + "startLine": 23582, "startColumn": 15, - "endLine": 27344, + "endLine": 23582, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -48525,15 +47747,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource277", + "logicalId": "Resource239", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 27379, + "startLine": 23617, "startColumn": 15, - "endLine": 27379, + "endLine": 23617, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -48544,15 +47766,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource277", + "logicalId": "Resource239", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 27385, + "startLine": 23623, "startColumn": 15, - "endLine": 27385, + "endLine": 23623, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -48563,15 +47785,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource278", + "logicalId": "Resource240", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 27443, + "startLine": 23681, "startColumn": 15, - "endLine": 27443, + "endLine": 23681, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -48582,15 +47804,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource278", + "logicalId": "Resource240", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 27478, + "startLine": 23716, "startColumn": 15, - "endLine": 27478, + "endLine": 23716, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -48601,15 +47823,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource278", + "logicalId": "Resource240", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 27484, + "startLine": 23722, "startColumn": 15, - "endLine": 27484, + "endLine": 23722, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -48620,15 +47842,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource279", + "logicalId": "Resource241", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 27542, + "startLine": 23780, "startColumn": 15, - "endLine": 27542, + "endLine": 23780, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -48639,15 +47861,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource279", + "logicalId": "Resource241", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 27577, + "startLine": 23815, "startColumn": 15, - "endLine": 27577, + "endLine": 23815, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -48658,15 +47880,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource279", + "logicalId": "Resource241", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 27583, + "startLine": 23821, "startColumn": 15, - "endLine": 27583, + "endLine": 23821, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -48677,15 +47899,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource280", + "logicalId": "Resource242", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 27641, + "startLine": 23879, "startColumn": 15, - "endLine": 27641, + "endLine": 23879, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -48696,15 +47918,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource280", + "logicalId": "Resource242", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 27676, + "startLine": 23914, "startColumn": 15, - "endLine": 27676, + "endLine": 23914, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -48715,15 +47937,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource280", + "logicalId": "Resource242", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 27682, + "startLine": 23920, "startColumn": 15, - "endLine": 27682, + "endLine": 23920, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -48734,15 +47956,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource281", + "logicalId": "Resource243", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 27740, + "startLine": 23978, "startColumn": 15, - "endLine": 27740, + "endLine": 23978, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -48753,15 +47975,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource281", + "logicalId": "Resource243", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 27775, + "startLine": 24013, "startColumn": 15, - "endLine": 27775, + "endLine": 24013, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -48772,15 +47994,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource281", + "logicalId": "Resource243", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 27781, + "startLine": 24019, "startColumn": 15, - "endLine": 27781, + "endLine": 24019, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -48791,15 +48013,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource282", + "logicalId": "Resource244", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 27839, + "startLine": 24077, "startColumn": 15, - "endLine": 27839, + "endLine": 24077, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -48810,15 +48032,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource282", + "logicalId": "Resource244", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 27874, + "startLine": 24112, "startColumn": 15, - "endLine": 27874, + "endLine": 24112, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -48829,15 +48051,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource282", + "logicalId": "Resource244", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 27880, + "startLine": 24118, "startColumn": 15, - "endLine": 27880, + "endLine": 24118, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -48848,15 +48070,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource283", + "logicalId": "Resource245", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 27938, + "startLine": 24176, "startColumn": 15, - "endLine": 27938, + "endLine": 24176, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -48867,15 +48089,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource283", + "logicalId": "Resource245", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 27973, + "startLine": 24211, "startColumn": 15, - "endLine": 27973, + "endLine": 24211, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -48886,15 +48108,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource283", + "logicalId": "Resource245", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 27979, + "startLine": 24217, "startColumn": 15, - "endLine": 27979, + "endLine": 24217, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -48905,15 +48127,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource284", + "logicalId": "Resource246", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 28037, + "startLine": 24275, "startColumn": 15, - "endLine": 28037, + "endLine": 24275, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -48924,15 +48146,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource284", + "logicalId": "Resource246", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 28072, + "startLine": 24310, "startColumn": 15, - "endLine": 28072, + "endLine": 24310, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -48943,15 +48165,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource284", + "logicalId": "Resource246", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 28078, + "startLine": 24316, "startColumn": 15, - "endLine": 28078, + "endLine": 24316, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -48962,15 +48184,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource285", + "logicalId": "Resource247", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 28136, + "startLine": 24374, "startColumn": 15, - "endLine": 28136, + "endLine": 24374, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -48981,15 +48203,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource285", + "logicalId": "Resource247", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 28171, + "startLine": 24409, "startColumn": 15, - "endLine": 28171, + "endLine": 24409, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -49000,15 +48222,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource285", + "logicalId": "Resource247", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 28177, + "startLine": 24415, "startColumn": 15, - "endLine": 28177, + "endLine": 24415, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -49019,15 +48241,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource286", + "logicalId": "Resource248", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 28235, + "startLine": 24473, "startColumn": 15, - "endLine": 28235, + "endLine": 24473, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -49038,15 +48260,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource286", + "logicalId": "Resource248", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 28270, + "startLine": 24508, "startColumn": 15, - "endLine": 28270, + "endLine": 24508, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -49057,15 +48279,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource286", + "logicalId": "Resource248", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 28276, + "startLine": 24514, "startColumn": 15, - "endLine": 28276, + "endLine": 24514, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -49076,15 +48298,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource287", + "logicalId": "Resource249", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 28334, + "startLine": 24572, "startColumn": 15, - "endLine": 28334, + "endLine": 24572, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -49095,15 +48317,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource287", + "logicalId": "Resource249", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 28369, + "startLine": 24607, "startColumn": 15, - "endLine": 28369, + "endLine": 24607, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -49114,15 +48336,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource287", + "logicalId": "Resource249", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 28375, + "startLine": 24613, "startColumn": 15, - "endLine": 28375, + "endLine": 24613, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -49133,15 +48355,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource288", + "logicalId": "Resource250", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 28433, + "startLine": 24671, "startColumn": 15, - "endLine": 28433, + "endLine": 24671, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -49152,15 +48374,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource288", + "logicalId": "Resource250", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 28468, + "startLine": 24706, "startColumn": 15, - "endLine": 28468, + "endLine": 24706, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -49171,15 +48393,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource288", + "logicalId": "Resource250", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 28474, + "startLine": 24712, "startColumn": 15, - "endLine": 28474, + "endLine": 24712, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -49190,15 +48412,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource289", + "logicalId": "Resource251", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 28532, + "startLine": 24770, "startColumn": 15, - "endLine": 28532, + "endLine": 24770, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -49209,15 +48431,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource289", + "logicalId": "Resource251", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 28567, + "startLine": 24805, "startColumn": 15, - "endLine": 28567, + "endLine": 24805, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -49228,15 +48450,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource289", + "logicalId": "Resource251", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 28573, + "startLine": 24811, "startColumn": 15, - "endLine": 28573, + "endLine": 24811, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -49247,15 +48469,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource290", + "logicalId": "Resource252", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 28631, + "startLine": 24869, "startColumn": 15, - "endLine": 28631, + "endLine": 24869, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -49266,15 +48488,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource290", + "logicalId": "Resource252", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 28666, + "startLine": 24904, "startColumn": 15, - "endLine": 28666, + "endLine": 24904, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -49285,15 +48507,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource290", + "logicalId": "Resource252", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 28672, + "startLine": 24910, "startColumn": 15, - "endLine": 28672, + "endLine": 24910, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -49304,15 +48526,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource291", + "logicalId": "Resource253", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 28730, + "startLine": 24968, "startColumn": 15, - "endLine": 28730, + "endLine": 24968, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -49323,15 +48545,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource291", + "logicalId": "Resource253", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 28765, + "startLine": 25003, "startColumn": 15, - "endLine": 28765, + "endLine": 25003, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -49342,15 +48564,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource291", + "logicalId": "Resource253", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 28771, + "startLine": 25009, "startColumn": 15, - "endLine": 28771, + "endLine": 25009, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -49361,15 +48583,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource292", + "logicalId": "Resource254", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 28829, + "startLine": 25067, "startColumn": 15, - "endLine": 28829, + "endLine": 25067, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -49380,15 +48602,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource292", + "logicalId": "Resource254", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 28864, + "startLine": 25102, "startColumn": 15, - "endLine": 28864, + "endLine": 25102, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -49399,15 +48621,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource292", + "logicalId": "Resource254", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 28870, + "startLine": 25108, "startColumn": 15, - "endLine": 28870, + "endLine": 25108, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -49418,15 +48640,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource293", + "logicalId": "Resource255", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 28928, + "startLine": 25166, "startColumn": 15, - "endLine": 28928, + "endLine": 25166, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -49437,15 +48659,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource293", + "logicalId": "Resource255", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 28963, + "startLine": 25201, "startColumn": 15, - "endLine": 28963, + "endLine": 25201, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -49456,15 +48678,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource293", + "logicalId": "Resource255", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 28969, + "startLine": 25207, "startColumn": 15, - "endLine": 28969, + "endLine": 25207, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -49475,15 +48697,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource294", + "logicalId": "Resource256", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 29027, + "startLine": 25265, "startColumn": 15, - "endLine": 29027, + "endLine": 25265, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -49494,15 +48716,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource294", + "logicalId": "Resource256", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 29062, + "startLine": 25300, "startColumn": 15, - "endLine": 29062, + "endLine": 25300, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -49513,15 +48735,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource294", + "logicalId": "Resource256", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 29068, + "startLine": 25306, "startColumn": 15, - "endLine": 29068, + "endLine": 25306, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -49532,15 +48754,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource295", + "logicalId": "Resource257", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 29126, + "startLine": 25364, "startColumn": 15, - "endLine": 29126, + "endLine": 25364, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -49551,15 +48773,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource295", + "logicalId": "Resource257", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 29161, + "startLine": 25399, "startColumn": 15, - "endLine": 29161, + "endLine": 25399, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -49570,15 +48792,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource295", + "logicalId": "Resource257", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 29167, + "startLine": 25405, "startColumn": 15, - "endLine": 29167, + "endLine": 25405, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -49589,15 +48811,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource296", + "logicalId": "Resource258", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 29225, + "startLine": 25463, "startColumn": 15, - "endLine": 29225, + "endLine": 25463, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -49608,15 +48830,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource296", + "logicalId": "Resource258", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 29260, + "startLine": 25498, "startColumn": 15, - "endLine": 29260, + "endLine": 25498, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -49627,15 +48849,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource296", + "logicalId": "Resource258", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 29266, + "startLine": 25504, "startColumn": 15, - "endLine": 29266, + "endLine": 25504, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -49646,15 +48868,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource297", + "logicalId": "Resource259", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 29324, + "startLine": 25562, "startColumn": 15, - "endLine": 29324, + "endLine": 25562, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -49665,15 +48887,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource297", + "logicalId": "Resource259", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 29359, + "startLine": 25597, "startColumn": 15, - "endLine": 29359, + "endLine": 25597, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -49684,15 +48906,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource297", + "logicalId": "Resource259", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 29365, + "startLine": 25603, "startColumn": 15, - "endLine": 29365, + "endLine": 25603, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -49703,15 +48925,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource298", + "logicalId": "Resource260", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 29423, + "startLine": 25661, "startColumn": 15, - "endLine": 29423, + "endLine": 25661, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -49722,15 +48944,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource298", + "logicalId": "Resource260", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 29458, + "startLine": 25696, "startColumn": 15, - "endLine": 29458, + "endLine": 25696, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -49741,15 +48963,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource298", + "logicalId": "Resource260", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 29464, + "startLine": 25702, "startColumn": 15, - "endLine": 29464, + "endLine": 25702, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -49760,15 +48982,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource299", + "logicalId": "Resource261", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 29522, + "startLine": 25760, "startColumn": 15, - "endLine": 29522, + "endLine": 25760, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -49779,15 +49001,15 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource299", + "logicalId": "Resource261", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 29557, + "startLine": 25795, "startColumn": 15, - "endLine": 29557, + "endLine": 25795, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" @@ -49798,2847 +49020,2184 @@ "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "Resource299", + "logicalId": "Resource261", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 29563, + "startLine": 25801, "startColumn": 15, - "endLine": 29563, + "endLine": 25801, "endColumn": 22, "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Resource1", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.ImageId", - "category": "Best Practice", - "startLine": 89, - "startColumn": 7, - "endLine": 89, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Resource1", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.InstanceType", - "category": "Best Practice", - "startLine": 90, - "startColumn": 7, - "endLine": 90, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Resource1", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.UserData", - "category": "Best Practice", - "startLine": 91, - "startColumn": 7, - "endLine": 91, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Resource2", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.ImageId", - "category": "Best Practice", - "startLine": 188, - "startColumn": 7, - "endLine": 188, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Resource2", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.InstanceType", - "category": "Best Practice", - "startLine": 189, - "startColumn": 7, - "endLine": 189, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Resource2", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.UserData", - "category": "Best Practice", - "startLine": 190, - "startColumn": 7, - "endLine": 190, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Resource3", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.ImageId", - "category": "Best Practice", - "startLine": 287, - "startColumn": 7, - "endLine": 287, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Resource3", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.InstanceType", - "category": "Best Practice", - "startLine": 288, - "startColumn": 7, - "endLine": 288, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Resource3", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.UserData", - "category": "Best Practice", - "startLine": 289, - "startColumn": 7, - "endLine": 289, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Resource4", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.ImageId", - "category": "Best Practice", - "startLine": 386, - "startColumn": 7, - "endLine": 386, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Resource4", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.InstanceType", - "category": "Best Practice", - "startLine": 387, - "startColumn": 7, - "endLine": 387, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource4", + "logicalId": "Resource262", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.UserData", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 388, - "startColumn": 7, - "endLine": 388, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 25859, + "startColumn": 15, + "endLine": 25859, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource5", + "logicalId": "Resource262", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 485, - "startColumn": 7, - "endLine": 485, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 25894, + "startColumn": 15, + "endLine": 25894, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource5", + "logicalId": "Resource262", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.InstanceType", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 486, - "startColumn": 7, - "endLine": 486, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 25900, + "startColumn": 15, + "endLine": 25900, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource5", + "logicalId": "Resource263", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.UserData", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 487, - "startColumn": 7, - "endLine": 487, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 25958, + "startColumn": 15, + "endLine": 25958, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource6", + "logicalId": "Resource263", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 584, - "startColumn": 7, - "endLine": 584, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 25993, + "startColumn": 15, + "endLine": 25993, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource6", + "logicalId": "Resource263", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.InstanceType", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 585, - "startColumn": 7, - "endLine": 585, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 25999, + "startColumn": 15, + "endLine": 25999, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource6", + "logicalId": "Resource264", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.UserData", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 586, - "startColumn": 7, - "endLine": 586, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 26057, + "startColumn": 15, + "endLine": 26057, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource7", + "logicalId": "Resource264", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 683, - "startColumn": 7, - "endLine": 683, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 26092, + "startColumn": 15, + "endLine": 26092, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource7", + "logicalId": "Resource264", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.InstanceType", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 684, - "startColumn": 7, - "endLine": 684, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 26098, + "startColumn": 15, + "endLine": 26098, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource7", + "logicalId": "Resource265", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.UserData", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 685, - "startColumn": 7, - "endLine": 685, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 26156, + "startColumn": 15, + "endLine": 26156, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource8", + "logicalId": "Resource265", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 782, - "startColumn": 7, - "endLine": 782, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 26191, + "startColumn": 15, + "endLine": 26191, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource8", + "logicalId": "Resource265", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.InstanceType", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 783, - "startColumn": 7, - "endLine": 783, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 26197, + "startColumn": 15, + "endLine": 26197, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource8", + "logicalId": "Resource266", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.UserData", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 784, - "startColumn": 7, - "endLine": 784, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 26255, + "startColumn": 15, + "endLine": 26255, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource9", + "logicalId": "Resource266", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 881, - "startColumn": 7, - "endLine": 881, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 26290, + "startColumn": 15, + "endLine": 26290, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource9", + "logicalId": "Resource266", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.InstanceType", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 882, - "startColumn": 7, - "endLine": 882, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 26296, + "startColumn": 15, + "endLine": 26296, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource9", + "logicalId": "Resource267", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.UserData", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 883, - "startColumn": 7, - "endLine": 883, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 26354, + "startColumn": 15, + "endLine": 26354, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource10", + "logicalId": "Resource267", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 980, - "startColumn": 7, - "endLine": 980, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 26389, + "startColumn": 15, + "endLine": 26389, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource10", + "logicalId": "Resource267", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.InstanceType", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 981, - "startColumn": 7, - "endLine": 981, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 26395, + "startColumn": 15, + "endLine": 26395, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource10", + "logicalId": "Resource268", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.UserData", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 982, - "startColumn": 7, - "endLine": 982, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 26453, + "startColumn": 15, + "endLine": 26453, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource11", + "logicalId": "Resource268", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 1079, - "startColumn": 7, - "endLine": 1079, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "startLine": 26488, + "startColumn": 15, + "endLine": 26488, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" + }, + { + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource11", + "logicalId": "Resource268", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.InstanceType", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 1080, - "startColumn": 7, - "endLine": 1080, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 26494, + "startColumn": 15, + "endLine": 26494, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource11", + "logicalId": "Resource269", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.UserData", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 1081, - "startColumn": 7, - "endLine": 1081, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 26552, + "startColumn": 15, + "endLine": 26552, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource12", + "logicalId": "Resource269", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 1178, - "startColumn": 7, - "endLine": 1178, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 26587, + "startColumn": 15, + "endLine": 26587, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource12", + "logicalId": "Resource269", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.InstanceType", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 1179, - "startColumn": 7, - "endLine": 1179, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 26593, + "startColumn": 15, + "endLine": 26593, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource12", + "logicalId": "Resource270", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.UserData", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 1180, - "startColumn": 7, - "endLine": 1180, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 26651, + "startColumn": 15, + "endLine": 26651, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource13", + "logicalId": "Resource270", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 1277, - "startColumn": 7, - "endLine": 1277, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 26686, + "startColumn": 15, + "endLine": 26686, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource13", + "logicalId": "Resource270", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.InstanceType", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 1278, - "startColumn": 7, - "endLine": 1278, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 26692, + "startColumn": 15, + "endLine": 26692, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource13", + "logicalId": "Resource271", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.UserData", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 1279, - "startColumn": 7, - "endLine": 1279, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 26750, + "startColumn": 15, + "endLine": 26750, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource14", + "logicalId": "Resource271", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 1376, - "startColumn": 7, - "endLine": 1376, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 26785, + "startColumn": 15, + "endLine": 26785, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource14", + "logicalId": "Resource271", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.InstanceType", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 1377, - "startColumn": 7, - "endLine": 1377, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 26791, + "startColumn": 15, + "endLine": 26791, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource14", + "logicalId": "Resource272", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.UserData", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 1378, - "startColumn": 7, - "endLine": 1378, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 26849, + "startColumn": 15, + "endLine": 26849, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource15", + "logicalId": "Resource272", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 1475, - "startColumn": 7, - "endLine": 1475, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 26884, + "startColumn": 15, + "endLine": 26884, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource15", + "logicalId": "Resource272", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.InstanceType", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 1476, - "startColumn": 7, - "endLine": 1476, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 26890, + "startColumn": 15, + "endLine": 26890, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource15", + "logicalId": "Resource273", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.UserData", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 1477, - "startColumn": 7, - "endLine": 1477, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 26948, + "startColumn": 15, + "endLine": 26948, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource16", + "logicalId": "Resource273", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 1574, - "startColumn": 7, - "endLine": 1574, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 26983, + "startColumn": 15, + "endLine": 26983, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource16", + "logicalId": "Resource273", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.InstanceType", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 1575, - "startColumn": 7, - "endLine": 1575, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 26989, + "startColumn": 15, + "endLine": 26989, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource16", + "logicalId": "Resource274", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.UserData", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 1576, - "startColumn": 7, - "endLine": 1576, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 27047, + "startColumn": 15, + "endLine": 27047, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource17", + "logicalId": "Resource274", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 1673, - "startColumn": 7, - "endLine": 1673, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 27082, + "startColumn": 15, + "endLine": 27082, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" + }, + { + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", + "entity": { + "logicalId": "Resource274", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", + "category": "Best Practice", + "startLine": 27088, + "startColumn": 15, + "endLine": 27088, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource17", + "logicalId": "Resource275", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.InstanceType", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 1674, - "startColumn": 7, - "endLine": 1674, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 27146, + "startColumn": 15, + "endLine": 27146, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource17", + "logicalId": "Resource275", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.UserData", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 1675, - "startColumn": 7, - "endLine": 1675, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 27181, + "startColumn": 15, + "endLine": 27181, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource18", + "logicalId": "Resource275", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 1772, - "startColumn": 7, - "endLine": 1772, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 27187, + "startColumn": 15, + "endLine": 27187, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource18", + "logicalId": "Resource276", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.InstanceType", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 1773, - "startColumn": 7, - "endLine": 1773, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 27245, + "startColumn": 15, + "endLine": 27245, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource18", + "logicalId": "Resource276", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.UserData", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 1774, - "startColumn": 7, - "endLine": 1774, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 27280, + "startColumn": 15, + "endLine": 27280, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource19", + "logicalId": "Resource276", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 1871, - "startColumn": 7, - "endLine": 1871, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 27286, + "startColumn": 15, + "endLine": 27286, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource19", + "logicalId": "Resource277", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.InstanceType", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 1872, - "startColumn": 7, - "endLine": 1872, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 27344, + "startColumn": 15, + "endLine": 27344, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource19", + "logicalId": "Resource277", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.UserData", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 1873, - "startColumn": 7, - "endLine": 1873, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 27379, + "startColumn": 15, + "endLine": 27379, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource20", + "logicalId": "Resource277", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 1970, - "startColumn": 7, - "endLine": 1970, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 27385, + "startColumn": 15, + "endLine": 27385, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource20", + "logicalId": "Resource278", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.InstanceType", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 1971, - "startColumn": 7, - "endLine": 1971, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 27443, + "startColumn": 15, + "endLine": 27443, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource20", + "logicalId": "Resource278", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.UserData", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 1972, - "startColumn": 7, - "endLine": 1972, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 27478, + "startColumn": 15, + "endLine": 27478, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource21", + "logicalId": "Resource278", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 2069, - "startColumn": 7, - "endLine": 2069, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 27484, + "startColumn": 15, + "endLine": 27484, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource21", + "logicalId": "Resource279", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.InstanceType", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 2070, - "startColumn": 7, - "endLine": 2070, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 27542, + "startColumn": 15, + "endLine": 27542, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource21", + "logicalId": "Resource279", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.UserData", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 2071, - "startColumn": 7, - "endLine": 2071, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 27577, + "startColumn": 15, + "endLine": 27577, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource22", + "logicalId": "Resource279", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 2168, - "startColumn": 7, - "endLine": 2168, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 27583, + "startColumn": 15, + "endLine": 27583, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource22", + "logicalId": "Resource280", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.InstanceType", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 2169, - "startColumn": 7, - "endLine": 2169, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 27641, + "startColumn": 15, + "endLine": 27641, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource22", + "logicalId": "Resource280", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.UserData", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 2170, - "startColumn": 7, - "endLine": 2170, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 27676, + "startColumn": 15, + "endLine": 27676, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource23", + "logicalId": "Resource280", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 2267, - "startColumn": 7, - "endLine": 2267, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 27682, + "startColumn": 15, + "endLine": 27682, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource23", + "logicalId": "Resource281", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.InstanceType", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 2268, - "startColumn": 7, - "endLine": 2268, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 27740, + "startColumn": 15, + "endLine": 27740, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource23", + "logicalId": "Resource281", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.UserData", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 2269, - "startColumn": 7, - "endLine": 2269, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 27775, + "startColumn": 15, + "endLine": 27775, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource24", + "logicalId": "Resource281", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 2366, - "startColumn": 7, - "endLine": 2366, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 27781, + "startColumn": 15, + "endLine": 27781, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource24", + "logicalId": "Resource282", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.InstanceType", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 2367, - "startColumn": 7, - "endLine": 2367, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 27839, + "startColumn": 15, + "endLine": 27839, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource24", + "logicalId": "Resource282", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.UserData", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 2368, - "startColumn": 7, - "endLine": 2368, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 27874, + "startColumn": 15, + "endLine": 27874, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource25", + "logicalId": "Resource282", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 2465, - "startColumn": 7, - "endLine": 2465, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 27880, + "startColumn": 15, + "endLine": 27880, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource25", + "logicalId": "Resource283", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.InstanceType", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 2466, - "startColumn": 7, - "endLine": 2466, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 27938, + "startColumn": 15, + "endLine": 27938, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource25", + "logicalId": "Resource283", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.UserData", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 2467, - "startColumn": 7, - "endLine": 2467, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 27973, + "startColumn": 15, + "endLine": 27973, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource26", + "logicalId": "Resource283", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 2564, - "startColumn": 7, - "endLine": 2564, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 27979, + "startColumn": 15, + "endLine": 27979, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource26", + "logicalId": "Resource284", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.InstanceType", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 2565, - "startColumn": 7, - "endLine": 2565, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 28037, + "startColumn": 15, + "endLine": 28037, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource26", + "logicalId": "Resource284", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.UserData", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 2566, - "startColumn": 7, - "endLine": 2566, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 28072, + "startColumn": 15, + "endLine": 28072, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource27", + "logicalId": "Resource284", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 2663, - "startColumn": 7, - "endLine": 2663, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 28078, + "startColumn": 15, + "endLine": 28078, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource27", + "logicalId": "Resource285", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.InstanceType", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 2664, - "startColumn": 7, - "endLine": 2664, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 28136, + "startColumn": 15, + "endLine": 28136, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource27", + "logicalId": "Resource285", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.UserData", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 2665, - "startColumn": 7, - "endLine": 2665, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 28171, + "startColumn": 15, + "endLine": 28171, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource28", + "logicalId": "Resource285", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 2762, - "startColumn": 7, - "endLine": 2762, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 28177, + "startColumn": 15, + "endLine": 28177, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource28", + "logicalId": "Resource286", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.InstanceType", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 2763, - "startColumn": 7, - "endLine": 2763, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 28235, + "startColumn": 15, + "endLine": 28235, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource28", + "logicalId": "Resource286", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.UserData", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 2764, - "startColumn": 7, - "endLine": 2764, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 28270, + "startColumn": 15, + "endLine": 28270, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource29", + "logicalId": "Resource286", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 2861, - "startColumn": 7, - "endLine": 2861, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "startLine": 28276, + "startColumn": 15, + "endLine": 28276, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" + }, + { + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource29", + "logicalId": "Resource287", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.InstanceType", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 2862, - "startColumn": 7, - "endLine": 2862, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 28334, + "startColumn": 15, + "endLine": 28334, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource29", + "logicalId": "Resource287", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.UserData", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 2863, - "startColumn": 7, - "endLine": 2863, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 28369, + "startColumn": 15, + "endLine": 28369, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource30", + "logicalId": "Resource287", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 2960, - "startColumn": 7, - "endLine": 2960, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 28375, + "startColumn": 15, + "endLine": 28375, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource30", + "logicalId": "Resource288", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.InstanceType", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 2961, - "startColumn": 7, - "endLine": 2961, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 28433, + "startColumn": 15, + "endLine": 28433, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource30", + "logicalId": "Resource288", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.UserData", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 2962, - "startColumn": 7, - "endLine": 2962, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 28468, + "startColumn": 15, + "endLine": 28468, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource31", + "logicalId": "Resource288", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 3059, - "startColumn": 7, - "endLine": 3059, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 28474, + "startColumn": 15, + "endLine": 28474, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource31", + "logicalId": "Resource289", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.InstanceType", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 3060, - "startColumn": 7, - "endLine": 3060, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 28532, + "startColumn": 15, + "endLine": 28532, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource31", + "logicalId": "Resource289", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.UserData", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 3061, - "startColumn": 7, - "endLine": 3061, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 28567, + "startColumn": 15, + "endLine": 28567, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource32", + "logicalId": "Resource289", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 3158, - "startColumn": 7, - "endLine": 3158, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 28573, + "startColumn": 15, + "endLine": 28573, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource32", + "logicalId": "Resource290", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.InstanceType", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 3159, - "startColumn": 7, - "endLine": 3159, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 28631, + "startColumn": 15, + "endLine": 28631, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource32", + "logicalId": "Resource290", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.UserData", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 3160, - "startColumn": 7, - "endLine": 3160, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 28666, + "startColumn": 15, + "endLine": 28666, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource33", + "logicalId": "Resource290", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 3257, - "startColumn": 7, - "endLine": 3257, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 28672, + "startColumn": 15, + "endLine": 28672, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource33", + "logicalId": "Resource291", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.InstanceType", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 3258, - "startColumn": 7, - "endLine": 3258, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 28730, + "startColumn": 15, + "endLine": 28730, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource33", + "logicalId": "Resource291", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.UserData", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 3259, - "startColumn": 7, - "endLine": 3259, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 28765, + "startColumn": 15, + "endLine": 28765, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource34", + "logicalId": "Resource291", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 3356, - "startColumn": 7, - "endLine": 3356, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 28771, + "startColumn": 15, + "endLine": 28771, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource34", + "logicalId": "Resource292", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.InstanceType", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 3357, - "startColumn": 7, - "endLine": 3357, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 28829, + "startColumn": 15, + "endLine": 28829, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource34", + "logicalId": "Resource292", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.UserData", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 3358, - "startColumn": 7, - "endLine": 3358, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 28864, + "startColumn": 15, + "endLine": 28864, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource35", + "logicalId": "Resource292", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 3455, - "startColumn": 7, - "endLine": 3455, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 28870, + "startColumn": 15, + "endLine": 28870, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" + }, + { + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", + "entity": { + "logicalId": "Resource293", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", + "category": "Best Practice", + "startLine": 28928, + "startColumn": 15, + "endLine": 28928, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource35", + "logicalId": "Resource293", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.InstanceType", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 3456, - "startColumn": 7, - "endLine": 3456, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 28963, + "startColumn": 15, + "endLine": 28963, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource35", + "logicalId": "Resource293", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.UserData", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 3457, - "startColumn": 7, - "endLine": 3457, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 28969, + "startColumn": 15, + "endLine": 28969, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource36", + "logicalId": "Resource294", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 3554, - "startColumn": 7, - "endLine": 3554, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 29027, + "startColumn": 15, + "endLine": 29027, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource36", + "logicalId": "Resource294", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.InstanceType", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 3555, - "startColumn": 7, - "endLine": 3555, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 29062, + "startColumn": 15, + "endLine": 29062, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource36", + "logicalId": "Resource294", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.UserData", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 3556, - "startColumn": 7, - "endLine": 3556, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 29068, + "startColumn": 15, + "endLine": 29068, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource37", + "logicalId": "Resource295", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 3653, - "startColumn": 7, - "endLine": 3653, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 29126, + "startColumn": 15, + "endLine": 29126, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource37", + "logicalId": "Resource295", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.InstanceType", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 3654, - "startColumn": 7, - "endLine": 3654, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 29161, + "startColumn": 15, + "endLine": 29161, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource37", + "logicalId": "Resource295", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.UserData", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 3655, - "startColumn": 7, - "endLine": 3655, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 29167, + "startColumn": 15, + "endLine": 29167, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource38", + "logicalId": "Resource296", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 3752, - "startColumn": 7, - "endLine": 3752, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 29225, + "startColumn": 15, + "endLine": 29225, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource38", + "logicalId": "Resource296", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.InstanceType", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 3753, - "startColumn": 7, - "endLine": 3753, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 29260, + "startColumn": 15, + "endLine": 29260, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource38", + "logicalId": "Resource296", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.UserData", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 3754, - "startColumn": 7, - "endLine": 3754, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 29266, + "startColumn": 15, + "endLine": 29266, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource39", + "logicalId": "Resource297", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 3851, - "startColumn": 7, - "endLine": 3851, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 29324, + "startColumn": 15, + "endLine": 29324, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource39", + "logicalId": "Resource297", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.InstanceType", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 3852, - "startColumn": 7, - "endLine": 3852, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 29359, + "startColumn": 15, + "endLine": 29359, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource39", + "logicalId": "Resource297", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.UserData", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 3853, - "startColumn": 7, - "endLine": 3853, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 29365, + "startColumn": 15, + "endLine": 29365, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource40", + "logicalId": "Resource298", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 3950, - "startColumn": 7, - "endLine": 3950, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 29423, + "startColumn": 15, + "endLine": 29423, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource40", + "logicalId": "Resource298", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.InstanceType", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 3951, - "startColumn": 7, - "endLine": 3951, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 29458, + "startColumn": 15, + "endLine": 29458, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource40", + "logicalId": "Resource298", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.UserData", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 3952, - "startColumn": 7, - "endLine": 3952, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 29464, + "startColumn": 15, + "endLine": 29464, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource41", + "logicalId": "Resource299", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./etc/awslogs/awslogs.conf.content.Fn::Sub", "category": "Best Practice", - "startLine": 4049, - "startColumn": 7, - "endLine": 4049, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 29522, + "startColumn": 15, + "endLine": 29522, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource41", + "logicalId": "Resource299", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.InstanceType", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./install_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 4050, - "startColumn": 7, - "endLine": 4050, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 29557, + "startColumn": 15, + "endLine": 29557, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource41", + "logicalId": "Resource299", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.UserData", + "propertyPath": "Metadata.AWS::CloudFormation::Init.config.files./configure_magento.sh.source.Fn::Sub", "category": "Best Practice", - "startLine": 4051, - "startColumn": 7, - "endLine": 4051, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 29563, + "startColumn": 15, + "endLine": 29563, + "endColumn": 22, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" }, { "ruleId": "I9001", @@ -52646,15 +51205,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource42", + "logicalId": "Resource1", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 4148, + "startLine": 89, "startColumn": 7, - "endLine": 4148, + "endLine": 89, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -52669,15 +51228,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource42", + "logicalId": "Resource1", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 4149, + "startLine": 90, "startColumn": 7, - "endLine": 4149, + "endLine": 90, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -52692,15 +51251,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource42", + "logicalId": "Resource1", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 4150, + "startLine": 91, "startColumn": 7, - "endLine": 4150, + "endLine": 91, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -52715,15 +51274,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource43", + "logicalId": "Resource2", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 4247, + "startLine": 188, "startColumn": 7, - "endLine": 4247, + "endLine": 188, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -52738,15 +51297,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource43", + "logicalId": "Resource2", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 4248, + "startLine": 189, "startColumn": 7, - "endLine": 4248, + "endLine": 189, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -52761,15 +51320,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource43", + "logicalId": "Resource2", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 4249, + "startLine": 190, "startColumn": 7, - "endLine": 4249, + "endLine": 190, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -52784,15 +51343,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource44", + "logicalId": "Resource3", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 4346, + "startLine": 287, "startColumn": 7, - "endLine": 4346, + "endLine": 287, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -52807,15 +51366,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource44", + "logicalId": "Resource3", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 4347, + "startLine": 288, "startColumn": 7, - "endLine": 4347, + "endLine": 288, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -52830,15 +51389,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource44", + "logicalId": "Resource3", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 4348, + "startLine": 289, "startColumn": 7, - "endLine": 4348, + "endLine": 289, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -52853,15 +51412,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource45", + "logicalId": "Resource4", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 4445, + "startLine": 386, "startColumn": 7, - "endLine": 4445, + "endLine": 386, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -52876,15 +51435,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource45", + "logicalId": "Resource4", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 4446, + "startLine": 387, "startColumn": 7, - "endLine": 4446, + "endLine": 387, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -52899,15 +51458,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource45", + "logicalId": "Resource4", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 4447, + "startLine": 388, "startColumn": 7, - "endLine": 4447, + "endLine": 388, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -52922,15 +51481,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource46", + "logicalId": "Resource5", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 4544, + "startLine": 485, "startColumn": 7, - "endLine": 4544, + "endLine": 485, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -52945,15 +51504,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource46", + "logicalId": "Resource5", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 4545, + "startLine": 486, "startColumn": 7, - "endLine": 4545, + "endLine": 486, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -52968,15 +51527,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource46", + "logicalId": "Resource5", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 4546, + "startLine": 487, "startColumn": 7, - "endLine": 4546, + "endLine": 487, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -52991,15 +51550,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource47", + "logicalId": "Resource6", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 4643, + "startLine": 584, "startColumn": 7, - "endLine": 4643, + "endLine": 584, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -53014,15 +51573,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource47", + "logicalId": "Resource6", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 4644, + "startLine": 585, "startColumn": 7, - "endLine": 4644, + "endLine": 585, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -53037,15 +51596,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource47", + "logicalId": "Resource6", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 4645, + "startLine": 586, "startColumn": 7, - "endLine": 4645, + "endLine": 586, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -53060,15 +51619,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource48", + "logicalId": "Resource7", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 4742, + "startLine": 683, "startColumn": 7, - "endLine": 4742, + "endLine": 683, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -53083,15 +51642,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource48", + "logicalId": "Resource7", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 4743, + "startLine": 684, "startColumn": 7, - "endLine": 4743, + "endLine": 684, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -53106,15 +51665,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource48", + "logicalId": "Resource7", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 4744, + "startLine": 685, "startColumn": 7, - "endLine": 4744, + "endLine": 685, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -53129,15 +51688,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource49", + "logicalId": "Resource8", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 4841, + "startLine": 782, "startColumn": 7, - "endLine": 4841, + "endLine": 782, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -53152,15 +51711,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource49", + "logicalId": "Resource8", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 4842, + "startLine": 783, "startColumn": 7, - "endLine": 4842, + "endLine": 783, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -53175,15 +51734,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource49", + "logicalId": "Resource8", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 4843, + "startLine": 784, "startColumn": 7, - "endLine": 4843, + "endLine": 784, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -53198,15 +51757,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource50", + "logicalId": "Resource9", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 4940, + "startLine": 881, "startColumn": 7, - "endLine": 4940, + "endLine": 881, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -53221,15 +51780,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource50", + "logicalId": "Resource9", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 4941, + "startLine": 882, "startColumn": 7, - "endLine": 4941, + "endLine": 882, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -53244,15 +51803,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource50", + "logicalId": "Resource9", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 4942, + "startLine": 883, "startColumn": 7, - "endLine": 4942, + "endLine": 883, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -53267,15 +51826,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource51", + "logicalId": "Resource10", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 5039, + "startLine": 980, "startColumn": 7, - "endLine": 5039, + "endLine": 980, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -53290,15 +51849,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource51", + "logicalId": "Resource10", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 5040, + "startLine": 981, "startColumn": 7, - "endLine": 5040, + "endLine": 981, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -53313,15 +51872,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource51", + "logicalId": "Resource10", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 5041, + "startLine": 982, "startColumn": 7, - "endLine": 5041, + "endLine": 982, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -53336,15 +51895,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource52", + "logicalId": "Resource11", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 5138, + "startLine": 1079, "startColumn": 7, - "endLine": 5138, + "endLine": 1079, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -53359,15 +51918,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource52", + "logicalId": "Resource11", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 5139, + "startLine": 1080, "startColumn": 7, - "endLine": 5139, + "endLine": 1080, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -53382,15 +51941,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource52", + "logicalId": "Resource11", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 5140, + "startLine": 1081, "startColumn": 7, - "endLine": 5140, + "endLine": 1081, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -53405,15 +51964,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource53", + "logicalId": "Resource12", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 5237, + "startLine": 1178, "startColumn": 7, - "endLine": 5237, + "endLine": 1178, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -53428,15 +51987,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource53", + "logicalId": "Resource12", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 5238, + "startLine": 1179, "startColumn": 7, - "endLine": 5238, + "endLine": 1179, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -53451,15 +52010,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource53", + "logicalId": "Resource12", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 5239, + "startLine": 1180, "startColumn": 7, - "endLine": 5239, + "endLine": 1180, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -53474,15 +52033,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource54", + "logicalId": "Resource13", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 5336, + "startLine": 1277, "startColumn": 7, - "endLine": 5336, + "endLine": 1277, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -53497,15 +52056,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource54", + "logicalId": "Resource13", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 5337, + "startLine": 1278, "startColumn": 7, - "endLine": 5337, + "endLine": 1278, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -53520,15 +52079,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource54", + "logicalId": "Resource13", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 5338, + "startLine": 1279, "startColumn": 7, - "endLine": 5338, + "endLine": 1279, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -53543,15 +52102,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource55", + "logicalId": "Resource14", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 5435, + "startLine": 1376, "startColumn": 7, - "endLine": 5435, + "endLine": 1376, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -53566,15 +52125,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource55", + "logicalId": "Resource14", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 5436, + "startLine": 1377, "startColumn": 7, - "endLine": 5436, + "endLine": 1377, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -53589,15 +52148,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource55", + "logicalId": "Resource14", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 5437, + "startLine": 1378, "startColumn": 7, - "endLine": 5437, + "endLine": 1378, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -53612,15 +52171,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource56", + "logicalId": "Resource15", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 5534, + "startLine": 1475, "startColumn": 7, - "endLine": 5534, + "endLine": 1475, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -53635,15 +52194,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource56", + "logicalId": "Resource15", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 5535, + "startLine": 1476, "startColumn": 7, - "endLine": 5535, + "endLine": 1476, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -53658,15 +52217,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource56", + "logicalId": "Resource15", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 5536, + "startLine": 1477, "startColumn": 7, - "endLine": 5536, + "endLine": 1477, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -53681,15 +52240,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource57", + "logicalId": "Resource16", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 5633, + "startLine": 1574, "startColumn": 7, - "endLine": 5633, + "endLine": 1574, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -53704,15 +52263,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource57", + "logicalId": "Resource16", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 5634, + "startLine": 1575, "startColumn": 7, - "endLine": 5634, + "endLine": 1575, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -53727,15 +52286,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource57", + "logicalId": "Resource16", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 5635, + "startLine": 1576, "startColumn": 7, - "endLine": 5635, + "endLine": 1576, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -53750,15 +52309,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource58", + "logicalId": "Resource17", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 5732, + "startLine": 1673, "startColumn": 7, - "endLine": 5732, + "endLine": 1673, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -53773,15 +52332,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource58", + "logicalId": "Resource17", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 5733, + "startLine": 1674, "startColumn": 7, - "endLine": 5733, + "endLine": 1674, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -53796,15 +52355,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource58", + "logicalId": "Resource17", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 5734, + "startLine": 1675, "startColumn": 7, - "endLine": 5734, + "endLine": 1675, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -53819,15 +52378,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource59", + "logicalId": "Resource18", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 5831, + "startLine": 1772, "startColumn": 7, - "endLine": 5831, + "endLine": 1772, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -53842,15 +52401,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource59", + "logicalId": "Resource18", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 5832, + "startLine": 1773, "startColumn": 7, - "endLine": 5832, + "endLine": 1773, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -53865,15 +52424,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource59", + "logicalId": "Resource18", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 5833, + "startLine": 1774, "startColumn": 7, - "endLine": 5833, + "endLine": 1774, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -53888,15 +52447,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource60", + "logicalId": "Resource19", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 5930, + "startLine": 1871, "startColumn": 7, - "endLine": 5930, + "endLine": 1871, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -53911,15 +52470,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource60", + "logicalId": "Resource19", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 5931, + "startLine": 1872, "startColumn": 7, - "endLine": 5931, + "endLine": 1872, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -53934,15 +52493,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource60", + "logicalId": "Resource19", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 5932, + "startLine": 1873, "startColumn": 7, - "endLine": 5932, + "endLine": 1873, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -53957,15 +52516,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource61", + "logicalId": "Resource20", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 6029, + "startLine": 1970, "startColumn": 7, - "endLine": 6029, + "endLine": 1970, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -53980,15 +52539,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource61", + "logicalId": "Resource20", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 6030, + "startLine": 1971, "startColumn": 7, - "endLine": 6030, + "endLine": 1971, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -54003,15 +52562,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource61", + "logicalId": "Resource20", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 6031, + "startLine": 1972, "startColumn": 7, - "endLine": 6031, + "endLine": 1972, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -54026,15 +52585,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource62", + "logicalId": "Resource21", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 6128, + "startLine": 2069, "startColumn": 7, - "endLine": 6128, + "endLine": 2069, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -54049,15 +52608,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource62", + "logicalId": "Resource21", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 6129, + "startLine": 2070, "startColumn": 7, - "endLine": 6129, + "endLine": 2070, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -54072,15 +52631,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource62", + "logicalId": "Resource21", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 6130, + "startLine": 2071, "startColumn": 7, - "endLine": 6130, + "endLine": 2071, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -54095,15 +52654,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource63", + "logicalId": "Resource22", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 6227, + "startLine": 2168, "startColumn": 7, - "endLine": 6227, + "endLine": 2168, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -54118,15 +52677,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource63", + "logicalId": "Resource22", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 6228, + "startLine": 2169, "startColumn": 7, - "endLine": 6228, + "endLine": 2169, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -54141,15 +52700,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource63", + "logicalId": "Resource22", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 6229, + "startLine": 2170, "startColumn": 7, - "endLine": 6229, + "endLine": 2170, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -54164,15 +52723,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource64", + "logicalId": "Resource23", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 6326, + "startLine": 2267, "startColumn": 7, - "endLine": 6326, + "endLine": 2267, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -54187,15 +52746,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource64", + "logicalId": "Resource23", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 6327, + "startLine": 2268, "startColumn": 7, - "endLine": 6327, + "endLine": 2268, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -54210,15 +52769,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource64", + "logicalId": "Resource23", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 6328, + "startLine": 2269, "startColumn": 7, - "endLine": 6328, + "endLine": 2269, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -54233,15 +52792,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource65", + "logicalId": "Resource24", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 6425, + "startLine": 2366, "startColumn": 7, - "endLine": 6425, + "endLine": 2366, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -54256,15 +52815,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource65", + "logicalId": "Resource24", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 6426, + "startLine": 2367, "startColumn": 7, - "endLine": 6426, + "endLine": 2367, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -54279,15 +52838,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource65", + "logicalId": "Resource24", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 6427, + "startLine": 2368, "startColumn": 7, - "endLine": 6427, + "endLine": 2368, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -54302,15 +52861,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource66", + "logicalId": "Resource25", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 6524, + "startLine": 2465, "startColumn": 7, - "endLine": 6524, + "endLine": 2465, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -54325,15 +52884,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource66", + "logicalId": "Resource25", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 6525, + "startLine": 2466, "startColumn": 7, - "endLine": 6525, + "endLine": 2466, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -54348,15 +52907,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource66", + "logicalId": "Resource25", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 6526, + "startLine": 2467, "startColumn": 7, - "endLine": 6526, + "endLine": 2467, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -54371,15 +52930,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource67", + "logicalId": "Resource26", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 6623, + "startLine": 2564, "startColumn": 7, - "endLine": 6623, + "endLine": 2564, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -54394,15 +52953,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource67", + "logicalId": "Resource26", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 6624, + "startLine": 2565, "startColumn": 7, - "endLine": 6624, + "endLine": 2565, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -54417,15 +52976,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource67", + "logicalId": "Resource26", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 6625, + "startLine": 2566, "startColumn": 7, - "endLine": 6625, + "endLine": 2566, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -54440,15 +52999,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource68", + "logicalId": "Resource27", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 6722, + "startLine": 2663, "startColumn": 7, - "endLine": 6722, + "endLine": 2663, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -54463,15 +53022,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource68", + "logicalId": "Resource27", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 6723, + "startLine": 2664, "startColumn": 7, - "endLine": 6723, + "endLine": 2664, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -54486,15 +53045,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource68", + "logicalId": "Resource27", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 6724, + "startLine": 2665, "startColumn": 7, - "endLine": 6724, + "endLine": 2665, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -54509,15 +53068,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource69", + "logicalId": "Resource28", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 6821, + "startLine": 2762, "startColumn": 7, - "endLine": 6821, + "endLine": 2762, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -54532,15 +53091,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource69", + "logicalId": "Resource28", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 6822, + "startLine": 2763, "startColumn": 7, - "endLine": 6822, + "endLine": 2763, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -54555,15 +53114,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource69", + "logicalId": "Resource28", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 6823, + "startLine": 2764, "startColumn": 7, - "endLine": 6823, + "endLine": 2764, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -54578,15 +53137,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource70", + "logicalId": "Resource29", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 6920, + "startLine": 2861, "startColumn": 7, - "endLine": 6920, + "endLine": 2861, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -54601,15 +53160,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource70", + "logicalId": "Resource29", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 6921, + "startLine": 2862, "startColumn": 7, - "endLine": 6921, + "endLine": 2862, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -54624,15 +53183,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource70", + "logicalId": "Resource29", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 6922, + "startLine": 2863, "startColumn": 7, - "endLine": 6922, + "endLine": 2863, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -54647,15 +53206,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource71", + "logicalId": "Resource30", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 7019, + "startLine": 2960, "startColumn": 7, - "endLine": 7019, + "endLine": 2960, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -54670,15 +53229,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource71", + "logicalId": "Resource30", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 7020, + "startLine": 2961, "startColumn": 7, - "endLine": 7020, + "endLine": 2961, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -54693,15 +53252,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource71", + "logicalId": "Resource30", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 7021, + "startLine": 2962, "startColumn": 7, - "endLine": 7021, + "endLine": 2962, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -54716,15 +53275,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource72", + "logicalId": "Resource31", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 7118, + "startLine": 3059, "startColumn": 7, - "endLine": 7118, + "endLine": 3059, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -54739,15 +53298,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource72", + "logicalId": "Resource31", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 7119, + "startLine": 3060, "startColumn": 7, - "endLine": 7119, + "endLine": 3060, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -54762,15 +53321,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource72", + "logicalId": "Resource31", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 7120, + "startLine": 3061, "startColumn": 7, - "endLine": 7120, + "endLine": 3061, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -54785,15 +53344,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource73", + "logicalId": "Resource32", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 7217, + "startLine": 3158, "startColumn": 7, - "endLine": 7217, + "endLine": 3158, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -54808,15 +53367,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource73", + "logicalId": "Resource32", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 7218, + "startLine": 3159, "startColumn": 7, - "endLine": 7218, + "endLine": 3159, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -54831,15 +53390,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource73", + "logicalId": "Resource32", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 7219, + "startLine": 3160, "startColumn": 7, - "endLine": 7219, + "endLine": 3160, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -54854,15 +53413,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource74", + "logicalId": "Resource33", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 7316, + "startLine": 3257, "startColumn": 7, - "endLine": 7316, + "endLine": 3257, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -54877,15 +53436,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource74", + "logicalId": "Resource33", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 7317, + "startLine": 3258, "startColumn": 7, - "endLine": 7317, + "endLine": 3258, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -54900,15 +53459,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource74", + "logicalId": "Resource33", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 7318, + "startLine": 3259, "startColumn": 7, - "endLine": 7318, + "endLine": 3259, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -54923,15 +53482,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource75", + "logicalId": "Resource34", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 7415, + "startLine": 3356, "startColumn": 7, - "endLine": 7415, + "endLine": 3356, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -54946,15 +53505,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource75", + "logicalId": "Resource34", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 7416, + "startLine": 3357, "startColumn": 7, - "endLine": 7416, + "endLine": 3357, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -54969,15 +53528,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource75", + "logicalId": "Resource34", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 7417, + "startLine": 3358, "startColumn": 7, - "endLine": 7417, + "endLine": 3358, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -54992,15 +53551,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource76", + "logicalId": "Resource35", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 7514, + "startLine": 3455, "startColumn": 7, - "endLine": 7514, + "endLine": 3455, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -55015,15 +53574,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource76", + "logicalId": "Resource35", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 7515, + "startLine": 3456, "startColumn": 7, - "endLine": 7515, + "endLine": 3456, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -55038,15 +53597,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource76", + "logicalId": "Resource35", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 7516, + "startLine": 3457, "startColumn": 7, - "endLine": 7516, + "endLine": 3457, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -55061,15 +53620,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource77", + "logicalId": "Resource36", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 7613, + "startLine": 3554, "startColumn": 7, - "endLine": 7613, + "endLine": 3554, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -55084,15 +53643,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource77", + "logicalId": "Resource36", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 7614, + "startLine": 3555, "startColumn": 7, - "endLine": 7614, + "endLine": 3555, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -55107,15 +53666,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource77", + "logicalId": "Resource36", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 7615, + "startLine": 3556, "startColumn": 7, - "endLine": 7615, + "endLine": 3556, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -55130,15 +53689,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource78", + "logicalId": "Resource37", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 7712, + "startLine": 3653, "startColumn": 7, - "endLine": 7712, + "endLine": 3653, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -55153,15 +53712,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource78", + "logicalId": "Resource37", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 7713, + "startLine": 3654, "startColumn": 7, - "endLine": 7713, + "endLine": 3654, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -55176,15 +53735,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource78", + "logicalId": "Resource37", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 7714, + "startLine": 3655, "startColumn": 7, - "endLine": 7714, + "endLine": 3655, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -55199,15 +53758,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource79", + "logicalId": "Resource38", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 7811, + "startLine": 3752, "startColumn": 7, - "endLine": 7811, + "endLine": 3752, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -55222,15 +53781,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource79", + "logicalId": "Resource38", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 7812, + "startLine": 3753, "startColumn": 7, - "endLine": 7812, + "endLine": 3753, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -55245,15 +53804,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource79", + "logicalId": "Resource38", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 7813, + "startLine": 3754, "startColumn": 7, - "endLine": 7813, + "endLine": 3754, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -55268,15 +53827,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource80", + "logicalId": "Resource39", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 7910, + "startLine": 3851, "startColumn": 7, - "endLine": 7910, + "endLine": 3851, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -55291,15 +53850,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource80", + "logicalId": "Resource39", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 7911, + "startLine": 3852, "startColumn": 7, - "endLine": 7911, + "endLine": 3852, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -55314,15 +53873,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource80", + "logicalId": "Resource39", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 7912, + "startLine": 3853, "startColumn": 7, - "endLine": 7912, + "endLine": 3853, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -55337,15 +53896,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource81", + "logicalId": "Resource40", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 8009, + "startLine": 3950, "startColumn": 7, - "endLine": 8009, + "endLine": 3950, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -55360,15 +53919,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource81", + "logicalId": "Resource40", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 8010, + "startLine": 3951, "startColumn": 7, - "endLine": 8010, + "endLine": 3951, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -55383,15 +53942,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource81", + "logicalId": "Resource40", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 8011, + "startLine": 3952, "startColumn": 7, - "endLine": 8011, + "endLine": 3952, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -55406,15 +53965,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource82", + "logicalId": "Resource41", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 8108, + "startLine": 4049, "startColumn": 7, - "endLine": 8108, + "endLine": 4049, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -55429,15 +53988,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource82", + "logicalId": "Resource41", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 8109, + "startLine": 4050, "startColumn": 7, - "endLine": 8109, + "endLine": 4050, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -55452,15 +54011,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource82", + "logicalId": "Resource41", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 8110, + "startLine": 4051, "startColumn": 7, - "endLine": 8110, + "endLine": 4051, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -55475,15 +54034,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource83", + "logicalId": "Resource42", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 8207, + "startLine": 4148, "startColumn": 7, - "endLine": 8207, + "endLine": 4148, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -55498,15 +54057,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource83", + "logicalId": "Resource42", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 8208, + "startLine": 4149, "startColumn": 7, - "endLine": 8208, + "endLine": 4149, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -55521,15 +54080,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource83", + "logicalId": "Resource42", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 8209, + "startLine": 4150, "startColumn": 7, - "endLine": 8209, + "endLine": 4150, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -55544,15 +54103,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource84", + "logicalId": "Resource43", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 8306, + "startLine": 4247, "startColumn": 7, - "endLine": 8306, + "endLine": 4247, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -55567,15 +54126,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource84", + "logicalId": "Resource43", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 8307, + "startLine": 4248, "startColumn": 7, - "endLine": 8307, + "endLine": 4248, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -55590,15 +54149,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource84", + "logicalId": "Resource43", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 8308, + "startLine": 4249, "startColumn": 7, - "endLine": 8308, + "endLine": 4249, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -55613,15 +54172,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource85", + "logicalId": "Resource44", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 8405, + "startLine": 4346, "startColumn": 7, - "endLine": 8405, + "endLine": 4346, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -55636,15 +54195,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource85", + "logicalId": "Resource44", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 8406, + "startLine": 4347, "startColumn": 7, - "endLine": 8406, + "endLine": 4347, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -55659,15 +54218,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource85", + "logicalId": "Resource44", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 8407, + "startLine": 4348, "startColumn": 7, - "endLine": 8407, + "endLine": 4348, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -55682,15 +54241,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource86", + "logicalId": "Resource45", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 8504, + "startLine": 4445, "startColumn": 7, - "endLine": 8504, + "endLine": 4445, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -55705,15 +54264,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource86", + "logicalId": "Resource45", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 8505, + "startLine": 4446, "startColumn": 7, - "endLine": 8505, + "endLine": 4446, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -55728,15 +54287,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource86", + "logicalId": "Resource45", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 8506, + "startLine": 4447, "startColumn": 7, - "endLine": 8506, + "endLine": 4447, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -55751,15 +54310,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource87", + "logicalId": "Resource46", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 8603, + "startLine": 4544, "startColumn": 7, - "endLine": 8603, + "endLine": 4544, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -55774,15 +54333,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource87", + "logicalId": "Resource46", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 8604, + "startLine": 4545, "startColumn": 7, - "endLine": 8604, + "endLine": 4545, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -55797,15 +54356,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource87", + "logicalId": "Resource46", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 8605, + "startLine": 4546, "startColumn": 7, - "endLine": 8605, + "endLine": 4546, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -55820,15 +54379,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource88", + "logicalId": "Resource47", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 8702, + "startLine": 4643, "startColumn": 7, - "endLine": 8702, + "endLine": 4643, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -55843,15 +54402,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource88", + "logicalId": "Resource47", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 8703, + "startLine": 4644, "startColumn": 7, - "endLine": 8703, + "endLine": 4644, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -55866,15 +54425,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource88", + "logicalId": "Resource47", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 8704, + "startLine": 4645, "startColumn": 7, - "endLine": 8704, + "endLine": 4645, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -55889,15 +54448,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource89", + "logicalId": "Resource48", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 8801, + "startLine": 4742, "startColumn": 7, - "endLine": 8801, + "endLine": 4742, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -55912,15 +54471,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource89", + "logicalId": "Resource48", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 8802, + "startLine": 4743, "startColumn": 7, - "endLine": 8802, + "endLine": 4743, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -55935,15 +54494,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource89", + "logicalId": "Resource48", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 8803, + "startLine": 4744, "startColumn": 7, - "endLine": 8803, + "endLine": 4744, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -55958,15 +54517,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource90", + "logicalId": "Resource49", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 8900, + "startLine": 4841, "startColumn": 7, - "endLine": 8900, + "endLine": 4841, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -55981,15 +54540,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource90", + "logicalId": "Resource49", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 8901, + "startLine": 4842, "startColumn": 7, - "endLine": 8901, + "endLine": 4842, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -56004,15 +54563,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource90", + "logicalId": "Resource49", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 8902, + "startLine": 4843, "startColumn": 7, - "endLine": 8902, + "endLine": 4843, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -56027,15 +54586,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource91", + "logicalId": "Resource50", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 8999, + "startLine": 4940, "startColumn": 7, - "endLine": 8999, + "endLine": 4940, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -56050,15 +54609,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource91", + "logicalId": "Resource50", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 9000, + "startLine": 4941, "startColumn": 7, - "endLine": 9000, + "endLine": 4941, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -56073,15 +54632,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource91", + "logicalId": "Resource50", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 9001, + "startLine": 4942, "startColumn": 7, - "endLine": 9001, + "endLine": 4942, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -56096,15 +54655,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource92", + "logicalId": "Resource51", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 9098, + "startLine": 5039, "startColumn": 7, - "endLine": 9098, + "endLine": 5039, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -56119,15 +54678,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource92", + "logicalId": "Resource51", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 9099, + "startLine": 5040, "startColumn": 7, - "endLine": 9099, + "endLine": 5040, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -56142,15 +54701,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource92", + "logicalId": "Resource51", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 9100, + "startLine": 5041, "startColumn": 7, - "endLine": 9100, + "endLine": 5041, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -56165,15 +54724,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource93", + "logicalId": "Resource52", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 9197, + "startLine": 5138, "startColumn": 7, - "endLine": 9197, + "endLine": 5138, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -56188,15 +54747,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource93", + "logicalId": "Resource52", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 9198, + "startLine": 5139, "startColumn": 7, - "endLine": 9198, + "endLine": 5139, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -56211,15 +54770,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource93", + "logicalId": "Resource52", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 9199, + "startLine": 5140, "startColumn": 7, - "endLine": 9199, + "endLine": 5140, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -56234,15 +54793,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource94", + "logicalId": "Resource53", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 9296, + "startLine": 5237, "startColumn": 7, - "endLine": 9296, + "endLine": 5237, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -56257,15 +54816,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource94", + "logicalId": "Resource53", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 9297, + "startLine": 5238, "startColumn": 7, - "endLine": 9297, + "endLine": 5238, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -56280,15 +54839,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource94", + "logicalId": "Resource53", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 9298, + "startLine": 5239, "startColumn": 7, - "endLine": 9298, + "endLine": 5239, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -56303,15 +54862,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource95", + "logicalId": "Resource54", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 9395, + "startLine": 5336, "startColumn": 7, - "endLine": 9395, + "endLine": 5336, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -56326,15 +54885,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource95", + "logicalId": "Resource54", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 9396, + "startLine": 5337, "startColumn": 7, - "endLine": 9396, + "endLine": 5337, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -56349,15 +54908,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource95", + "logicalId": "Resource54", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 9397, + "startLine": 5338, "startColumn": 7, - "endLine": 9397, + "endLine": 5338, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -56372,15 +54931,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource96", + "logicalId": "Resource55", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 9494, + "startLine": 5435, "startColumn": 7, - "endLine": 9494, + "endLine": 5435, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -56395,15 +54954,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource96", + "logicalId": "Resource55", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 9495, + "startLine": 5436, "startColumn": 7, - "endLine": 9495, + "endLine": 5436, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -56418,15 +54977,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource96", + "logicalId": "Resource55", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 9496, + "startLine": 5437, "startColumn": 7, - "endLine": 9496, + "endLine": 5437, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -56441,15 +55000,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource97", + "logicalId": "Resource56", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 9593, + "startLine": 5534, "startColumn": 7, - "endLine": 9593, + "endLine": 5534, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -56464,15 +55023,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource97", + "logicalId": "Resource56", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 9594, + "startLine": 5535, "startColumn": 7, - "endLine": 9594, + "endLine": 5535, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -56487,15 +55046,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource97", + "logicalId": "Resource56", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 9595, + "startLine": 5536, "startColumn": 7, - "endLine": 9595, + "endLine": 5536, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -56510,15 +55069,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource98", + "logicalId": "Resource57", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 9692, + "startLine": 5633, "startColumn": 7, - "endLine": 9692, + "endLine": 5633, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -56533,15 +55092,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource98", + "logicalId": "Resource57", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 9693, + "startLine": 5634, "startColumn": 7, - "endLine": 9693, + "endLine": 5634, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -56556,15 +55115,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource98", + "logicalId": "Resource57", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 9694, + "startLine": 5635, "startColumn": 7, - "endLine": 9694, + "endLine": 5635, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -56579,15 +55138,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource99", + "logicalId": "Resource58", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 9791, + "startLine": 5732, "startColumn": 7, - "endLine": 9791, + "endLine": 5732, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -56602,15 +55161,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource99", + "logicalId": "Resource58", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 9792, + "startLine": 5733, "startColumn": 7, - "endLine": 9792, + "endLine": 5733, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -56625,15 +55184,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource99", + "logicalId": "Resource58", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 9793, + "startLine": 5734, "startColumn": 7, - "endLine": 9793, + "endLine": 5734, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -56648,15 +55207,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource100", + "logicalId": "Resource59", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 9890, + "startLine": 5831, "startColumn": 7, - "endLine": 9890, + "endLine": 5831, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -56671,15 +55230,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource100", + "logicalId": "Resource59", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 9891, + "startLine": 5832, "startColumn": 7, - "endLine": 9891, + "endLine": 5832, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -56694,15 +55253,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource100", + "logicalId": "Resource59", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 9892, + "startLine": 5833, "startColumn": 7, - "endLine": 9892, + "endLine": 5833, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -56717,15 +55276,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource101", + "logicalId": "Resource60", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 9989, + "startLine": 5930, "startColumn": 7, - "endLine": 9989, + "endLine": 5930, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -56740,15 +55299,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource101", + "logicalId": "Resource60", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 9990, + "startLine": 5931, "startColumn": 7, - "endLine": 9990, + "endLine": 5931, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -56763,15 +55322,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource101", + "logicalId": "Resource60", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 9991, + "startLine": 5932, "startColumn": 7, - "endLine": 9991, + "endLine": 5932, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -56786,15 +55345,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource102", + "logicalId": "Resource61", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 10088, + "startLine": 6029, "startColumn": 7, - "endLine": 10088, + "endLine": 6029, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -56809,15 +55368,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource102", + "logicalId": "Resource61", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 10089, + "startLine": 6030, "startColumn": 7, - "endLine": 10089, + "endLine": 6030, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -56832,15 +55391,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource102", + "logicalId": "Resource61", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 10090, + "startLine": 6031, "startColumn": 7, - "endLine": 10090, + "endLine": 6031, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -56855,15 +55414,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource103", + "logicalId": "Resource62", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 10187, + "startLine": 6128, "startColumn": 7, - "endLine": 10187, + "endLine": 6128, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -56878,15 +55437,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource103", + "logicalId": "Resource62", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 10188, + "startLine": 6129, "startColumn": 7, - "endLine": 10188, + "endLine": 6129, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -56901,15 +55460,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource103", + "logicalId": "Resource62", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 10189, + "startLine": 6130, "startColumn": 7, - "endLine": 10189, + "endLine": 6130, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -56924,15 +55483,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource104", + "logicalId": "Resource63", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 10286, + "startLine": 6227, "startColumn": 7, - "endLine": 10286, + "endLine": 6227, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -56947,15 +55506,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource104", + "logicalId": "Resource63", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 10287, + "startLine": 6228, "startColumn": 7, - "endLine": 10287, + "endLine": 6228, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -56970,15 +55529,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource104", + "logicalId": "Resource63", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 10288, + "startLine": 6229, "startColumn": 7, - "endLine": 10288, + "endLine": 6229, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -56993,15 +55552,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource105", + "logicalId": "Resource64", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 10385, + "startLine": 6326, "startColumn": 7, - "endLine": 10385, + "endLine": 6326, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -57016,15 +55575,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource105", + "logicalId": "Resource64", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 10386, + "startLine": 6327, "startColumn": 7, - "endLine": 10386, + "endLine": 6327, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -57039,15 +55598,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource105", + "logicalId": "Resource64", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 10387, + "startLine": 6328, "startColumn": 7, - "endLine": 10387, + "endLine": 6328, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -57062,15 +55621,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource106", + "logicalId": "Resource65", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 10484, + "startLine": 6425, "startColumn": 7, - "endLine": 10484, + "endLine": 6425, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -57085,15 +55644,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource106", + "logicalId": "Resource65", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 10485, + "startLine": 6426, "startColumn": 7, - "endLine": 10485, + "endLine": 6426, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -57108,15 +55667,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource106", + "logicalId": "Resource65", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 10486, + "startLine": 6427, "startColumn": 7, - "endLine": 10486, + "endLine": 6427, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -57131,15 +55690,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource107", + "logicalId": "Resource66", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 10583, + "startLine": 6524, "startColumn": 7, - "endLine": 10583, + "endLine": 6524, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -57154,15 +55713,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource107", + "logicalId": "Resource66", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 10584, + "startLine": 6525, "startColumn": 7, - "endLine": 10584, + "endLine": 6525, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -57177,15 +55736,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource107", + "logicalId": "Resource66", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 10585, + "startLine": 6526, "startColumn": 7, - "endLine": 10585, + "endLine": 6526, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -57200,15 +55759,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource108", + "logicalId": "Resource67", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 10682, + "startLine": 6623, "startColumn": 7, - "endLine": 10682, + "endLine": 6623, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -57223,15 +55782,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource108", + "logicalId": "Resource67", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 10683, + "startLine": 6624, "startColumn": 7, - "endLine": 10683, + "endLine": 6624, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -57246,15 +55805,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource108", + "logicalId": "Resource67", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 10684, + "startLine": 6625, "startColumn": 7, - "endLine": 10684, + "endLine": 6625, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -57269,15 +55828,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource109", + "logicalId": "Resource68", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 10781, + "startLine": 6722, "startColumn": 7, - "endLine": 10781, + "endLine": 6722, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -57292,15 +55851,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource109", + "logicalId": "Resource68", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 10782, + "startLine": 6723, "startColumn": 7, - "endLine": 10782, + "endLine": 6723, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -57315,15 +55874,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource109", + "logicalId": "Resource68", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 10783, + "startLine": 6724, "startColumn": 7, - "endLine": 10783, + "endLine": 6724, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -57338,15 +55897,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource110", + "logicalId": "Resource69", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 10880, + "startLine": 6821, "startColumn": 7, - "endLine": 10880, + "endLine": 6821, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -57361,15 +55920,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource110", + "logicalId": "Resource69", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 10881, + "startLine": 6822, "startColumn": 7, - "endLine": 10881, + "endLine": 6822, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -57384,15 +55943,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource110", + "logicalId": "Resource69", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 10882, + "startLine": 6823, "startColumn": 7, - "endLine": 10882, + "endLine": 6823, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -57407,15 +55966,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource111", + "logicalId": "Resource70", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 10979, + "startLine": 6920, "startColumn": 7, - "endLine": 10979, + "endLine": 6920, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -57430,15 +55989,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource111", + "logicalId": "Resource70", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 10980, + "startLine": 6921, "startColumn": 7, - "endLine": 10980, + "endLine": 6921, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -57453,15 +56012,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource111", + "logicalId": "Resource70", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 10981, + "startLine": 6922, "startColumn": 7, - "endLine": 10981, + "endLine": 6922, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -57476,15 +56035,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource112", + "logicalId": "Resource71", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 11078, + "startLine": 7019, "startColumn": 7, - "endLine": 11078, + "endLine": 7019, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -57499,15 +56058,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource112", + "logicalId": "Resource71", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 11079, + "startLine": 7020, "startColumn": 7, - "endLine": 11079, + "endLine": 7020, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -57522,15 +56081,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource112", + "logicalId": "Resource71", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 11080, + "startLine": 7021, "startColumn": 7, - "endLine": 11080, + "endLine": 7021, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -57545,15 +56104,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource113", + "logicalId": "Resource72", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 11177, + "startLine": 7118, "startColumn": 7, - "endLine": 11177, + "endLine": 7118, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -57568,15 +56127,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource113", + "logicalId": "Resource72", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 11178, + "startLine": 7119, "startColumn": 7, - "endLine": 11178, + "endLine": 7119, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -57591,15 +56150,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource113", + "logicalId": "Resource72", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 11179, + "startLine": 7120, "startColumn": 7, - "endLine": 11179, + "endLine": 7120, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -57614,15 +56173,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource114", + "logicalId": "Resource73", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 11276, + "startLine": 7217, "startColumn": 7, - "endLine": 11276, + "endLine": 7217, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -57637,15 +56196,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource114", + "logicalId": "Resource73", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 11277, + "startLine": 7218, "startColumn": 7, - "endLine": 11277, + "endLine": 7218, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -57660,15 +56219,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource114", + "logicalId": "Resource73", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 11278, + "startLine": 7219, "startColumn": 7, - "endLine": 11278, + "endLine": 7219, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -57683,15 +56242,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource115", + "logicalId": "Resource74", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 11375, + "startLine": 7316, "startColumn": 7, - "endLine": 11375, + "endLine": 7316, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -57706,15 +56265,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource115", + "logicalId": "Resource74", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 11376, + "startLine": 7317, "startColumn": 7, - "endLine": 11376, + "endLine": 7317, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -57729,15 +56288,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource115", + "logicalId": "Resource74", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 11377, + "startLine": 7318, "startColumn": 7, - "endLine": 11377, + "endLine": 7318, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -57752,15 +56311,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource116", + "logicalId": "Resource75", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 11474, + "startLine": 7415, "startColumn": 7, - "endLine": 11474, + "endLine": 7415, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -57775,15 +56334,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource116", + "logicalId": "Resource75", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 11475, + "startLine": 7416, "startColumn": 7, - "endLine": 11475, + "endLine": 7416, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -57798,15 +56357,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource116", + "logicalId": "Resource75", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 11476, + "startLine": 7417, "startColumn": 7, - "endLine": 11476, + "endLine": 7417, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -57821,15 +56380,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource117", + "logicalId": "Resource76", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 11573, + "startLine": 7514, "startColumn": 7, - "endLine": 11573, + "endLine": 7514, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -57844,15 +56403,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource117", + "logicalId": "Resource76", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 11574, + "startLine": 7515, "startColumn": 7, - "endLine": 11574, + "endLine": 7515, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -57867,15 +56426,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource117", + "logicalId": "Resource76", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 11575, + "startLine": 7516, "startColumn": 7, - "endLine": 11575, + "endLine": 7516, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -57890,15 +56449,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource118", + "logicalId": "Resource77", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 11672, + "startLine": 7613, "startColumn": 7, - "endLine": 11672, + "endLine": 7613, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -57913,15 +56472,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource118", + "logicalId": "Resource77", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 11673, + "startLine": 7614, "startColumn": 7, - "endLine": 11673, + "endLine": 7614, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -57936,15 +56495,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource118", + "logicalId": "Resource77", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 11674, + "startLine": 7615, "startColumn": 7, - "endLine": 11674, + "endLine": 7615, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -57959,15 +56518,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource119", + "logicalId": "Resource78", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 11771, + "startLine": 7712, "startColumn": 7, - "endLine": 11771, + "endLine": 7712, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -57982,15 +56541,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource119", + "logicalId": "Resource78", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 11772, + "startLine": 7713, "startColumn": 7, - "endLine": 11772, + "endLine": 7713, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -58005,15 +56564,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource119", + "logicalId": "Resource78", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 11773, + "startLine": 7714, "startColumn": 7, - "endLine": 11773, + "endLine": 7714, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -58028,15 +56587,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource120", + "logicalId": "Resource79", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 11870, + "startLine": 7811, "startColumn": 7, - "endLine": 11870, + "endLine": 7811, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -58051,15 +56610,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource120", + "logicalId": "Resource79", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 11871, + "startLine": 7812, "startColumn": 7, - "endLine": 11871, + "endLine": 7812, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -58074,15 +56633,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource120", + "logicalId": "Resource79", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 11872, + "startLine": 7813, "startColumn": 7, - "endLine": 11872, + "endLine": 7813, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -58097,15 +56656,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource121", + "logicalId": "Resource80", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 11969, + "startLine": 7910, "startColumn": 7, - "endLine": 11969, + "endLine": 7910, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -58120,15 +56679,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource121", + "logicalId": "Resource80", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 11970, + "startLine": 7911, "startColumn": 7, - "endLine": 11970, + "endLine": 7911, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -58143,15 +56702,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource121", + "logicalId": "Resource80", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 11971, + "startLine": 7912, "startColumn": 7, - "endLine": 11971, + "endLine": 7912, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -58166,15 +56725,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource122", + "logicalId": "Resource81", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 12068, + "startLine": 8009, "startColumn": 7, - "endLine": 12068, + "endLine": 8009, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -58189,15 +56748,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource122", + "logicalId": "Resource81", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 12069, + "startLine": 8010, "startColumn": 7, - "endLine": 12069, + "endLine": 8010, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -58212,15 +56771,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource122", + "logicalId": "Resource81", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 12070, + "startLine": 8011, "startColumn": 7, - "endLine": 12070, + "endLine": 8011, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -58235,15 +56794,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource123", + "logicalId": "Resource82", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 12167, + "startLine": 8108, "startColumn": 7, - "endLine": 12167, + "endLine": 8108, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -58258,15 +56817,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource123", + "logicalId": "Resource82", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 12168, + "startLine": 8109, "startColumn": 7, - "endLine": 12168, + "endLine": 8109, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -58281,15 +56840,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource123", + "logicalId": "Resource82", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 12169, + "startLine": 8110, "startColumn": 7, - "endLine": 12169, + "endLine": 8110, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -58304,15 +56863,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource124", + "logicalId": "Resource83", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 12266, + "startLine": 8207, "startColumn": 7, - "endLine": 12266, + "endLine": 8207, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -58327,15 +56886,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource124", + "logicalId": "Resource83", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 12267, + "startLine": 8208, "startColumn": 7, - "endLine": 12267, + "endLine": 8208, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -58350,15 +56909,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource124", + "logicalId": "Resource83", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 12268, + "startLine": 8209, "startColumn": 7, - "endLine": 12268, + "endLine": 8209, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -58373,15 +56932,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource125", + "logicalId": "Resource84", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 12365, + "startLine": 8306, "startColumn": 7, - "endLine": 12365, + "endLine": 8306, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -58396,15 +56955,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource125", + "logicalId": "Resource84", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 12366, + "startLine": 8307, "startColumn": 7, - "endLine": 12366, + "endLine": 8307, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -58419,15 +56978,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource125", + "logicalId": "Resource84", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 12367, + "startLine": 8308, "startColumn": 7, - "endLine": 12367, + "endLine": 8308, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -58442,15 +57001,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource126", + "logicalId": "Resource85", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 12464, + "startLine": 8405, "startColumn": 7, - "endLine": 12464, + "endLine": 8405, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -58465,15 +57024,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource126", + "logicalId": "Resource85", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 12465, + "startLine": 8406, "startColumn": 7, - "endLine": 12465, + "endLine": 8406, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -58488,15 +57047,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource126", + "logicalId": "Resource85", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 12466, + "startLine": 8407, "startColumn": 7, - "endLine": 12466, + "endLine": 8407, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -58511,15 +57070,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource127", + "logicalId": "Resource86", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 12563, + "startLine": 8504, "startColumn": 7, - "endLine": 12563, + "endLine": 8504, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -58534,15 +57093,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource127", + "logicalId": "Resource86", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 12564, + "startLine": 8505, "startColumn": 7, - "endLine": 12564, + "endLine": 8505, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -58557,15 +57116,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource127", + "logicalId": "Resource86", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 12565, + "startLine": 8506, "startColumn": 7, - "endLine": 12565, + "endLine": 8506, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -58580,15 +57139,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource128", + "logicalId": "Resource87", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 12662, + "startLine": 8603, "startColumn": 7, - "endLine": 12662, + "endLine": 8603, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -58603,15 +57162,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource128", + "logicalId": "Resource87", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 12663, + "startLine": 8604, "startColumn": 7, - "endLine": 12663, + "endLine": 8604, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -58626,15 +57185,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource128", + "logicalId": "Resource87", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 12664, + "startLine": 8605, "startColumn": 7, - "endLine": 12664, + "endLine": 8605, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -58649,15 +57208,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource129", + "logicalId": "Resource88", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 12761, + "startLine": 8702, "startColumn": 7, - "endLine": 12761, + "endLine": 8702, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -58672,15 +57231,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource129", + "logicalId": "Resource88", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 12762, + "startLine": 8703, "startColumn": 7, - "endLine": 12762, + "endLine": 8703, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -58695,15 +57254,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource129", + "logicalId": "Resource88", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 12763, + "startLine": 8704, "startColumn": 7, - "endLine": 12763, + "endLine": 8704, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -58718,15 +57277,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource130", + "logicalId": "Resource89", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 12860, + "startLine": 8801, "startColumn": 7, - "endLine": 12860, + "endLine": 8801, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -58741,15 +57300,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource130", + "logicalId": "Resource89", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 12861, + "startLine": 8802, "startColumn": 7, - "endLine": 12861, + "endLine": 8802, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -58764,15 +57323,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource130", + "logicalId": "Resource89", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 12862, + "startLine": 8803, "startColumn": 7, - "endLine": 12862, + "endLine": 8803, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -58787,15 +57346,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource131", + "logicalId": "Resource90", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 12959, + "startLine": 8900, "startColumn": 7, - "endLine": 12959, + "endLine": 8900, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -58810,15 +57369,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource131", + "logicalId": "Resource90", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 12960, + "startLine": 8901, "startColumn": 7, - "endLine": 12960, + "endLine": 8901, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -58833,15 +57392,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource131", + "logicalId": "Resource90", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 12961, + "startLine": 8902, "startColumn": 7, - "endLine": 12961, + "endLine": 8902, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -58856,15 +57415,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource132", + "logicalId": "Resource91", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 13058, + "startLine": 8999, "startColumn": 7, - "endLine": 13058, + "endLine": 8999, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -58879,15 +57438,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource132", + "logicalId": "Resource91", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 13059, + "startLine": 9000, "startColumn": 7, - "endLine": 13059, + "endLine": 9000, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -58902,15 +57461,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource132", + "logicalId": "Resource91", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 13060, + "startLine": 9001, "startColumn": 7, - "endLine": 13060, + "endLine": 9001, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -58925,15 +57484,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource133", + "logicalId": "Resource92", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 13157, + "startLine": 9098, "startColumn": 7, - "endLine": 13157, + "endLine": 9098, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -58948,15 +57507,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource133", + "logicalId": "Resource92", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 13158, + "startLine": 9099, "startColumn": 7, - "endLine": 13158, + "endLine": 9099, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -58971,15 +57530,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource133", + "logicalId": "Resource92", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 13159, + "startLine": 9100, "startColumn": 7, - "endLine": 13159, + "endLine": 9100, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -58994,15 +57553,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource134", + "logicalId": "Resource93", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 13256, + "startLine": 9197, "startColumn": 7, - "endLine": 13256, + "endLine": 9197, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -59017,15 +57576,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource134", + "logicalId": "Resource93", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 13257, + "startLine": 9198, "startColumn": 7, - "endLine": 13257, + "endLine": 9198, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -59040,15 +57599,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource134", + "logicalId": "Resource93", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 13258, + "startLine": 9199, "startColumn": 7, - "endLine": 13258, + "endLine": 9199, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -59063,15 +57622,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource135", + "logicalId": "Resource94", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 13355, + "startLine": 9296, "startColumn": 7, - "endLine": 13355, + "endLine": 9296, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -59086,15 +57645,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource135", + "logicalId": "Resource94", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 13356, + "startLine": 9297, "startColumn": 7, - "endLine": 13356, + "endLine": 9297, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -59109,15 +57668,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource135", + "logicalId": "Resource94", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 13357, + "startLine": 9298, "startColumn": 7, - "endLine": 13357, + "endLine": 9298, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -59132,15 +57691,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource136", + "logicalId": "Resource95", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 13454, + "startLine": 9395, "startColumn": 7, - "endLine": 13454, + "endLine": 9395, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -59155,15 +57714,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource136", + "logicalId": "Resource95", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 13455, + "startLine": 9396, "startColumn": 7, - "endLine": 13455, + "endLine": 9396, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -59178,15 +57737,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource136", + "logicalId": "Resource95", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 13456, + "startLine": 9397, "startColumn": 7, - "endLine": 13456, + "endLine": 9397, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -59201,15 +57760,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource137", + "logicalId": "Resource96", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 13553, + "startLine": 9494, "startColumn": 7, - "endLine": 13553, + "endLine": 9494, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -59224,15 +57783,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource137", + "logicalId": "Resource96", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 13554, + "startLine": 9495, "startColumn": 7, - "endLine": 13554, + "endLine": 9495, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -59247,15 +57806,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource137", + "logicalId": "Resource96", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 13555, + "startLine": 9496, "startColumn": 7, - "endLine": 13555, + "endLine": 9496, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -59270,15 +57829,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource138", + "logicalId": "Resource97", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 13652, + "startLine": 9593, "startColumn": 7, - "endLine": 13652, + "endLine": 9593, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -59293,15 +57852,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource138", + "logicalId": "Resource97", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 13653, + "startLine": 9594, "startColumn": 7, - "endLine": 13653, + "endLine": 9594, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -59316,15 +57875,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource138", + "logicalId": "Resource97", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 13654, + "startLine": 9595, "startColumn": 7, - "endLine": 13654, + "endLine": 9595, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -59339,15 +57898,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource139", + "logicalId": "Resource98", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 13751, + "startLine": 9692, "startColumn": 7, - "endLine": 13751, + "endLine": 9692, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -59362,15 +57921,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource139", + "logicalId": "Resource98", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 13752, + "startLine": 9693, "startColumn": 7, - "endLine": 13752, + "endLine": 9693, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -59385,15 +57944,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource139", + "logicalId": "Resource98", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 13753, + "startLine": 9694, "startColumn": 7, - "endLine": 13753, + "endLine": 9694, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -59408,15 +57967,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource140", + "logicalId": "Resource99", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 13850, + "startLine": 9791, "startColumn": 7, - "endLine": 13850, + "endLine": 9791, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -59431,15 +57990,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource140", + "logicalId": "Resource99", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 13851, + "startLine": 9792, "startColumn": 7, - "endLine": 13851, + "endLine": 9792, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -59454,15 +58013,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource140", + "logicalId": "Resource99", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 13852, + "startLine": 9793, "startColumn": 7, - "endLine": 13852, + "endLine": 9793, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -59477,15 +58036,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource141", + "logicalId": "Resource100", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 13949, + "startLine": 9890, "startColumn": 7, - "endLine": 13949, + "endLine": 9890, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -59500,15 +58059,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource141", + "logicalId": "Resource100", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 13950, + "startLine": 9891, "startColumn": 7, - "endLine": 13950, + "endLine": 9891, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -59523,15 +58082,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource141", + "logicalId": "Resource100", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 13951, + "startLine": 9892, "startColumn": 7, - "endLine": 13951, + "endLine": 9892, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -59546,15 +58105,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource142", + "logicalId": "Resource101", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 14048, + "startLine": 9989, "startColumn": 7, - "endLine": 14048, + "endLine": 9989, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -59569,15 +58128,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource142", + "logicalId": "Resource101", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 14049, + "startLine": 9990, "startColumn": 7, - "endLine": 14049, + "endLine": 9990, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -59592,15 +58151,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource142", + "logicalId": "Resource101", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 14050, + "startLine": 9991, "startColumn": 7, - "endLine": 14050, + "endLine": 9991, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -59615,15 +58174,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource143", + "logicalId": "Resource102", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 14147, + "startLine": 10088, "startColumn": 7, - "endLine": 14147, + "endLine": 10088, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -59638,15 +58197,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource143", + "logicalId": "Resource102", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 14148, + "startLine": 10089, "startColumn": 7, - "endLine": 14148, + "endLine": 10089, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -59661,15 +58220,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource143", + "logicalId": "Resource102", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 14149, + "startLine": 10090, "startColumn": 7, - "endLine": 14149, + "endLine": 10090, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -59684,15 +58243,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource144", + "logicalId": "Resource103", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 14246, + "startLine": 10187, "startColumn": 7, - "endLine": 14246, + "endLine": 10187, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -59707,15 +58266,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource144", + "logicalId": "Resource103", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 14247, + "startLine": 10188, "startColumn": 7, - "endLine": 14247, + "endLine": 10188, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -59730,15 +58289,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource144", + "logicalId": "Resource103", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 14248, + "startLine": 10189, "startColumn": 7, - "endLine": 14248, + "endLine": 10189, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -59753,15 +58312,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource145", + "logicalId": "Resource104", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 14345, + "startLine": 10286, "startColumn": 7, - "endLine": 14345, + "endLine": 10286, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -59776,15 +58335,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource145", + "logicalId": "Resource104", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 14346, + "startLine": 10287, "startColumn": 7, - "endLine": 14346, + "endLine": 10287, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -59799,15 +58358,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource145", + "logicalId": "Resource104", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 14347, + "startLine": 10288, "startColumn": 7, - "endLine": 14347, + "endLine": 10288, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -59822,15 +58381,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource146", + "logicalId": "Resource105", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 14444, + "startLine": 10385, "startColumn": 7, - "endLine": 14444, + "endLine": 10385, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -59845,15 +58404,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource146", + "logicalId": "Resource105", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 14445, + "startLine": 10386, "startColumn": 7, - "endLine": 14445, + "endLine": 10386, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -59868,15 +58427,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource146", + "logicalId": "Resource105", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 14446, + "startLine": 10387, "startColumn": 7, - "endLine": 14446, + "endLine": 10387, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -59891,15 +58450,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource147", + "logicalId": "Resource106", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 14543, + "startLine": 10484, "startColumn": 7, - "endLine": 14543, + "endLine": 10484, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -59914,15 +58473,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource147", + "logicalId": "Resource106", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 14544, + "startLine": 10485, "startColumn": 7, - "endLine": 14544, + "endLine": 10485, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -59937,15 +58496,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource147", + "logicalId": "Resource106", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 14545, + "startLine": 10486, "startColumn": 7, - "endLine": 14545, + "endLine": 10486, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -59960,15 +58519,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource148", + "logicalId": "Resource107", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 14642, + "startLine": 10583, "startColumn": 7, - "endLine": 14642, + "endLine": 10583, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -59983,15 +58542,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource148", + "logicalId": "Resource107", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 14643, + "startLine": 10584, "startColumn": 7, - "endLine": 14643, + "endLine": 10584, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -60006,15 +58565,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource148", + "logicalId": "Resource107", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 14644, + "startLine": 10585, "startColumn": 7, - "endLine": 14644, + "endLine": 10585, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -60029,15 +58588,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource149", + "logicalId": "Resource108", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 14741, + "startLine": 10682, "startColumn": 7, - "endLine": 14741, + "endLine": 10682, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -60052,15 +58611,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource149", + "logicalId": "Resource108", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 14742, + "startLine": 10683, "startColumn": 7, - "endLine": 14742, + "endLine": 10683, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -60075,15 +58634,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource149", + "logicalId": "Resource108", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 14743, + "startLine": 10684, "startColumn": 7, - "endLine": 14743, + "endLine": 10684, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -60098,15 +58657,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource150", + "logicalId": "Resource109", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 14840, + "startLine": 10781, "startColumn": 7, - "endLine": 14840, + "endLine": 10781, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -60121,15 +58680,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource150", + "logicalId": "Resource109", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 14841, + "startLine": 10782, "startColumn": 7, - "endLine": 14841, + "endLine": 10782, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -60144,15 +58703,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource150", + "logicalId": "Resource109", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 14842, + "startLine": 10783, "startColumn": 7, - "endLine": 14842, + "endLine": 10783, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -60167,15 +58726,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource151", + "logicalId": "Resource110", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 14939, + "startLine": 10880, "startColumn": 7, - "endLine": 14939, + "endLine": 10880, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -60190,15 +58749,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource151", + "logicalId": "Resource110", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 14940, + "startLine": 10881, "startColumn": 7, - "endLine": 14940, + "endLine": 10881, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -60213,15 +58772,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource151", + "logicalId": "Resource110", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 14941, + "startLine": 10882, "startColumn": 7, - "endLine": 14941, + "endLine": 10882, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -60236,15 +58795,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource152", + "logicalId": "Resource111", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 15038, + "startLine": 10979, "startColumn": 7, - "endLine": 15038, + "endLine": 10979, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -60259,15 +58818,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource152", + "logicalId": "Resource111", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 15039, + "startLine": 10980, "startColumn": 7, - "endLine": 15039, + "endLine": 10980, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -60282,15 +58841,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource152", + "logicalId": "Resource111", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 15040, + "startLine": 10981, "startColumn": 7, - "endLine": 15040, + "endLine": 10981, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -60305,15 +58864,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource153", + "logicalId": "Resource112", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 15137, + "startLine": 11078, "startColumn": 7, - "endLine": 15137, + "endLine": 11078, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -60328,15 +58887,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource153", + "logicalId": "Resource112", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 15138, + "startLine": 11079, "startColumn": 7, - "endLine": 15138, + "endLine": 11079, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -60351,15 +58910,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource153", + "logicalId": "Resource112", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 15139, + "startLine": 11080, "startColumn": 7, - "endLine": 15139, + "endLine": 11080, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -60374,15 +58933,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource154", + "logicalId": "Resource113", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 15236, + "startLine": 11177, "startColumn": 7, - "endLine": 15236, + "endLine": 11177, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -60397,15 +58956,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource154", + "logicalId": "Resource113", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 15237, + "startLine": 11178, "startColumn": 7, - "endLine": 15237, + "endLine": 11178, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -60420,15 +58979,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource154", + "logicalId": "Resource113", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 15238, + "startLine": 11179, "startColumn": 7, - "endLine": 15238, + "endLine": 11179, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -60443,15 +59002,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource155", + "logicalId": "Resource114", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 15335, + "startLine": 11276, "startColumn": 7, - "endLine": 15335, + "endLine": 11276, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -60466,15 +59025,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource155", + "logicalId": "Resource114", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 15336, + "startLine": 11277, "startColumn": 7, - "endLine": 15336, + "endLine": 11277, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -60489,15 +59048,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource155", + "logicalId": "Resource114", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 15337, + "startLine": 11278, "startColumn": 7, - "endLine": 15337, + "endLine": 11278, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -60512,15 +59071,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource156", + "logicalId": "Resource115", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 15434, + "startLine": 11375, "startColumn": 7, - "endLine": 15434, + "endLine": 11375, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -60535,15 +59094,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource156", + "logicalId": "Resource115", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 15435, + "startLine": 11376, "startColumn": 7, - "endLine": 15435, + "endLine": 11376, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -60558,15 +59117,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource156", + "logicalId": "Resource115", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 15436, + "startLine": 11377, "startColumn": 7, - "endLine": 15436, + "endLine": 11377, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -60581,15 +59140,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource157", + "logicalId": "Resource116", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 15533, + "startLine": 11474, "startColumn": 7, - "endLine": 15533, + "endLine": 11474, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -60604,15 +59163,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource157", + "logicalId": "Resource116", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 15534, + "startLine": 11475, "startColumn": 7, - "endLine": 15534, + "endLine": 11475, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -60627,15 +59186,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource157", + "logicalId": "Resource116", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 15535, + "startLine": 11476, "startColumn": 7, - "endLine": 15535, + "endLine": 11476, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -60650,15 +59209,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource158", + "logicalId": "Resource117", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 15632, + "startLine": 11573, "startColumn": 7, - "endLine": 15632, + "endLine": 11573, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -60673,15 +59232,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource158", + "logicalId": "Resource117", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 15633, + "startLine": 11574, "startColumn": 7, - "endLine": 15633, + "endLine": 11574, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -60696,15 +59255,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource158", + "logicalId": "Resource117", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 15634, + "startLine": 11575, "startColumn": 7, - "endLine": 15634, + "endLine": 11575, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -60719,15 +59278,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource159", + "logicalId": "Resource118", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 15731, + "startLine": 11672, "startColumn": 7, - "endLine": 15731, + "endLine": 11672, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -60742,15 +59301,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource159", + "logicalId": "Resource118", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 15732, + "startLine": 11673, "startColumn": 7, - "endLine": 15732, + "endLine": 11673, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -60765,15 +59324,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource159", + "logicalId": "Resource118", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 15733, + "startLine": 11674, "startColumn": 7, - "endLine": 15733, + "endLine": 11674, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -60788,15 +59347,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource160", + "logicalId": "Resource119", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 15830, + "startLine": 11771, "startColumn": 7, - "endLine": 15830, + "endLine": 11771, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -60811,15 +59370,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource160", + "logicalId": "Resource119", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 15831, + "startLine": 11772, "startColumn": 7, - "endLine": 15831, + "endLine": 11772, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -60834,15 +59393,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource160", + "logicalId": "Resource119", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 15832, + "startLine": 11773, "startColumn": 7, - "endLine": 15832, + "endLine": 11773, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -60857,15 +59416,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource161", + "logicalId": "Resource120", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 15929, + "startLine": 11870, "startColumn": 7, - "endLine": 15929, + "endLine": 11870, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -60880,15 +59439,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource161", + "logicalId": "Resource120", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 15930, + "startLine": 11871, "startColumn": 7, - "endLine": 15930, + "endLine": 11871, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -60903,15 +59462,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource161", + "logicalId": "Resource120", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 15931, + "startLine": 11872, "startColumn": 7, - "endLine": 15931, + "endLine": 11872, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -60926,15 +59485,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource162", + "logicalId": "Resource121", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 16028, + "startLine": 11969, "startColumn": 7, - "endLine": 16028, + "endLine": 11969, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -60949,15 +59508,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource162", + "logicalId": "Resource121", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 16029, + "startLine": 11970, "startColumn": 7, - "endLine": 16029, + "endLine": 11970, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -60972,15 +59531,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource162", + "logicalId": "Resource121", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 16030, + "startLine": 11971, "startColumn": 7, - "endLine": 16030, + "endLine": 11971, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -60995,15 +59554,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource163", + "logicalId": "Resource122", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 16127, + "startLine": 12068, "startColumn": 7, - "endLine": 16127, + "endLine": 12068, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -61018,15 +59577,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource163", + "logicalId": "Resource122", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 16128, + "startLine": 12069, "startColumn": 7, - "endLine": 16128, + "endLine": 12069, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -61041,15 +59600,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource163", + "logicalId": "Resource122", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 16129, + "startLine": 12070, "startColumn": 7, - "endLine": 16129, + "endLine": 12070, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -61064,15 +59623,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource164", + "logicalId": "Resource123", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 16226, + "startLine": 12167, "startColumn": 7, - "endLine": 16226, + "endLine": 12167, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -61087,15 +59646,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource164", + "logicalId": "Resource123", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 16227, + "startLine": 12168, "startColumn": 7, - "endLine": 16227, + "endLine": 12168, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -61110,15 +59669,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource164", + "logicalId": "Resource123", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 16228, + "startLine": 12169, "startColumn": 7, - "endLine": 16228, + "endLine": 12169, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -61133,15 +59692,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource165", + "logicalId": "Resource124", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 16325, + "startLine": 12266, "startColumn": 7, - "endLine": 16325, + "endLine": 12266, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -61156,15 +59715,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource165", + "logicalId": "Resource124", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 16326, + "startLine": 12267, "startColumn": 7, - "endLine": 16326, + "endLine": 12267, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -61179,15 +59738,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource165", + "logicalId": "Resource124", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 16327, + "startLine": 12268, "startColumn": 7, - "endLine": 16327, + "endLine": 12268, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -61202,15 +59761,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource166", + "logicalId": "Resource125", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 16424, + "startLine": 12365, "startColumn": 7, - "endLine": 16424, + "endLine": 12365, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -61225,15 +59784,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource166", + "logicalId": "Resource125", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 16425, + "startLine": 12366, "startColumn": 7, - "endLine": 16425, + "endLine": 12366, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -61248,15 +59807,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource166", + "logicalId": "Resource125", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 16426, + "startLine": 12367, "startColumn": 7, - "endLine": 16426, + "endLine": 12367, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -61271,15 +59830,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource167", + "logicalId": "Resource126", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 16523, + "startLine": 12464, "startColumn": 7, - "endLine": 16523, + "endLine": 12464, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -61294,15 +59853,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource167", + "logicalId": "Resource126", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 16524, + "startLine": 12465, "startColumn": 7, - "endLine": 16524, + "endLine": 12465, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -61317,15 +59876,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource167", + "logicalId": "Resource126", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 16525, + "startLine": 12466, "startColumn": 7, - "endLine": 16525, + "endLine": 12466, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -61340,15 +59899,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource168", + "logicalId": "Resource127", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 16622, + "startLine": 12563, "startColumn": 7, - "endLine": 16622, + "endLine": 12563, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -61363,15 +59922,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource168", + "logicalId": "Resource127", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 16623, + "startLine": 12564, "startColumn": 7, - "endLine": 16623, + "endLine": 12564, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -61386,15 +59945,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource168", + "logicalId": "Resource127", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 16624, + "startLine": 12565, "startColumn": 7, - "endLine": 16624, + "endLine": 12565, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -61409,15 +59968,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource169", + "logicalId": "Resource128", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 16721, + "startLine": 12662, "startColumn": 7, - "endLine": 16721, + "endLine": 12662, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -61432,15 +59991,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource169", + "logicalId": "Resource128", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 16722, + "startLine": 12663, "startColumn": 7, - "endLine": 16722, + "endLine": 12663, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -61455,15 +60014,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource169", + "logicalId": "Resource128", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 16723, + "startLine": 12664, "startColumn": 7, - "endLine": 16723, + "endLine": 12664, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -61478,15 +60037,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource170", + "logicalId": "Resource129", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 16820, + "startLine": 12761, "startColumn": 7, - "endLine": 16820, + "endLine": 12761, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -61501,15 +60060,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource170", + "logicalId": "Resource129", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 16821, + "startLine": 12762, "startColumn": 7, - "endLine": 16821, + "endLine": 12762, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -61524,15 +60083,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource170", + "logicalId": "Resource129", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 16822, + "startLine": 12763, "startColumn": 7, - "endLine": 16822, + "endLine": 12763, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -61547,15 +60106,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource171", + "logicalId": "Resource130", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 16919, + "startLine": 12860, "startColumn": 7, - "endLine": 16919, + "endLine": 12860, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -61570,15 +60129,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource171", + "logicalId": "Resource130", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 16920, + "startLine": 12861, "startColumn": 7, - "endLine": 16920, + "endLine": 12861, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -61593,15 +60152,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource171", + "logicalId": "Resource130", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 16921, + "startLine": 12862, "startColumn": 7, - "endLine": 16921, + "endLine": 12862, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -61616,15 +60175,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource172", + "logicalId": "Resource131", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 17018, + "startLine": 12959, "startColumn": 7, - "endLine": 17018, + "endLine": 12959, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -61639,15 +60198,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource172", + "logicalId": "Resource131", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 17019, + "startLine": 12960, "startColumn": 7, - "endLine": 17019, + "endLine": 12960, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -61662,15 +60221,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource172", + "logicalId": "Resource131", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 17020, + "startLine": 12961, "startColumn": 7, - "endLine": 17020, + "endLine": 12961, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -61685,15 +60244,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource173", + "logicalId": "Resource132", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 17117, + "startLine": 13058, "startColumn": 7, - "endLine": 17117, + "endLine": 13058, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -61708,15 +60267,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource173", + "logicalId": "Resource132", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 17118, + "startLine": 13059, "startColumn": 7, - "endLine": 17118, + "endLine": 13059, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -61731,15 +60290,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource173", + "logicalId": "Resource132", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 17119, + "startLine": 13060, "startColumn": 7, - "endLine": 17119, + "endLine": 13060, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -61754,15 +60313,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource174", + "logicalId": "Resource133", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 17216, + "startLine": 13157, "startColumn": 7, - "endLine": 17216, + "endLine": 13157, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -61777,15 +60336,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource174", + "logicalId": "Resource133", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 17217, + "startLine": 13158, "startColumn": 7, - "endLine": 17217, + "endLine": 13158, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -61800,15 +60359,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource174", + "logicalId": "Resource133", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 17218, + "startLine": 13159, "startColumn": 7, - "endLine": 17218, + "endLine": 13159, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -61823,15 +60382,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource175", + "logicalId": "Resource134", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 17315, + "startLine": 13256, "startColumn": 7, - "endLine": 17315, + "endLine": 13256, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -61846,15 +60405,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource175", + "logicalId": "Resource134", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 17316, + "startLine": 13257, "startColumn": 7, - "endLine": 17316, + "endLine": 13257, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -61869,15 +60428,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource175", + "logicalId": "Resource134", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 17317, + "startLine": 13258, "startColumn": 7, - "endLine": 17317, + "endLine": 13258, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -61892,15 +60451,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource176", + "logicalId": "Resource135", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 17414, + "startLine": 13355, "startColumn": 7, - "endLine": 17414, + "endLine": 13355, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -61915,15 +60474,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource176", + "logicalId": "Resource135", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 17415, + "startLine": 13356, "startColumn": 7, - "endLine": 17415, + "endLine": 13356, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -61938,15 +60497,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource176", + "logicalId": "Resource135", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 17416, + "startLine": 13357, "startColumn": 7, - "endLine": 17416, + "endLine": 13357, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -61961,15 +60520,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource177", + "logicalId": "Resource136", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 17513, + "startLine": 13454, "startColumn": 7, - "endLine": 17513, + "endLine": 13454, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -61984,15 +60543,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource177", + "logicalId": "Resource136", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 17514, + "startLine": 13455, "startColumn": 7, - "endLine": 17514, + "endLine": 13455, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -62007,15 +60566,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource177", + "logicalId": "Resource136", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 17515, + "startLine": 13456, "startColumn": 7, - "endLine": 17515, + "endLine": 13456, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -62030,15 +60589,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource178", + "logicalId": "Resource137", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 17612, + "startLine": 13553, "startColumn": 7, - "endLine": 17612, + "endLine": 13553, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -62053,15 +60612,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource178", + "logicalId": "Resource137", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 17613, + "startLine": 13554, "startColumn": 7, - "endLine": 17613, + "endLine": 13554, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -62076,15 +60635,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource178", + "logicalId": "Resource137", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 17614, + "startLine": 13555, "startColumn": 7, - "endLine": 17614, + "endLine": 13555, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -62099,15 +60658,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource179", + "logicalId": "Resource138", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 17711, + "startLine": 13652, "startColumn": 7, - "endLine": 17711, + "endLine": 13652, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -62122,15 +60681,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource179", + "logicalId": "Resource138", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 17712, + "startLine": 13653, "startColumn": 7, - "endLine": 17712, + "endLine": 13653, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -62145,15 +60704,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource179", + "logicalId": "Resource138", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 17713, + "startLine": 13654, "startColumn": 7, - "endLine": 17713, + "endLine": 13654, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -62168,15 +60727,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource180", + "logicalId": "Resource139", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 17810, + "startLine": 13751, "startColumn": 7, - "endLine": 17810, + "endLine": 13751, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -62191,15 +60750,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource180", + "logicalId": "Resource139", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 17811, + "startLine": 13752, "startColumn": 7, - "endLine": 17811, + "endLine": 13752, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -62214,15 +60773,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource180", + "logicalId": "Resource139", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 17812, + "startLine": 13753, "startColumn": 7, - "endLine": 17812, + "endLine": 13753, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -62237,15 +60796,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource181", + "logicalId": "Resource140", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 17909, + "startLine": 13850, "startColumn": 7, - "endLine": 17909, + "endLine": 13850, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -62260,15 +60819,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource181", + "logicalId": "Resource140", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 17910, + "startLine": 13851, "startColumn": 7, - "endLine": 17910, + "endLine": 13851, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -62283,15 +60842,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource181", + "logicalId": "Resource140", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 17911, + "startLine": 13852, "startColumn": 7, - "endLine": 17911, + "endLine": 13852, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -62306,15 +60865,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource182", + "logicalId": "Resource141", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 18008, + "startLine": 13949, "startColumn": 7, - "endLine": 18008, + "endLine": 13949, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -62329,15 +60888,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource182", + "logicalId": "Resource141", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 18009, + "startLine": 13950, "startColumn": 7, - "endLine": 18009, + "endLine": 13950, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -62352,15 +60911,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource182", + "logicalId": "Resource141", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 18010, + "startLine": 13951, "startColumn": 7, - "endLine": 18010, + "endLine": 13951, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -62375,15 +60934,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource183", + "logicalId": "Resource142", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 18107, + "startLine": 14048, "startColumn": 7, - "endLine": 18107, + "endLine": 14048, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -62398,15 +60957,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource183", + "logicalId": "Resource142", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 18108, + "startLine": 14049, "startColumn": 7, - "endLine": 18108, + "endLine": 14049, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -62421,15 +60980,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource183", + "logicalId": "Resource142", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 18109, + "startLine": 14050, "startColumn": 7, - "endLine": 18109, + "endLine": 14050, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -62444,15 +61003,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource184", + "logicalId": "Resource143", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 18206, + "startLine": 14147, "startColumn": 7, - "endLine": 18206, + "endLine": 14147, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -62467,15 +61026,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource184", + "logicalId": "Resource143", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 18207, + "startLine": 14148, "startColumn": 7, - "endLine": 18207, + "endLine": 14148, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -62490,15 +61049,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource184", + "logicalId": "Resource143", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 18208, + "startLine": 14149, "startColumn": 7, - "endLine": 18208, + "endLine": 14149, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -62513,15 +61072,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource185", + "logicalId": "Resource144", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 18305, + "startLine": 14246, "startColumn": 7, - "endLine": 18305, + "endLine": 14246, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -62536,15 +61095,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource185", + "logicalId": "Resource144", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 18306, + "startLine": 14247, "startColumn": 7, - "endLine": 18306, + "endLine": 14247, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -62559,15 +61118,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource185", + "logicalId": "Resource144", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 18307, + "startLine": 14248, "startColumn": 7, - "endLine": 18307, + "endLine": 14248, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -62582,15 +61141,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource186", + "logicalId": "Resource145", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 18404, + "startLine": 14345, "startColumn": 7, - "endLine": 18404, + "endLine": 14345, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -62605,15 +61164,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource186", + "logicalId": "Resource145", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 18405, + "startLine": 14346, "startColumn": 7, - "endLine": 18405, + "endLine": 14346, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -62628,15 +61187,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource186", + "logicalId": "Resource145", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 18406, + "startLine": 14347, "startColumn": 7, - "endLine": 18406, + "endLine": 14347, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -62651,15 +61210,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource187", + "logicalId": "Resource146", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 18503, + "startLine": 14444, "startColumn": 7, - "endLine": 18503, + "endLine": 14444, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -62674,15 +61233,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource187", + "logicalId": "Resource146", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 18504, + "startLine": 14445, "startColumn": 7, - "endLine": 18504, + "endLine": 14445, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -62697,15 +61256,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource187", + "logicalId": "Resource146", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 18505, + "startLine": 14446, "startColumn": 7, - "endLine": 18505, + "endLine": 14446, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -62720,15 +61279,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource188", + "logicalId": "Resource147", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 18602, + "startLine": 14543, "startColumn": 7, - "endLine": 18602, + "endLine": 14543, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -62743,15 +61302,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource188", + "logicalId": "Resource147", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 18603, + "startLine": 14544, "startColumn": 7, - "endLine": 18603, + "endLine": 14544, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -62766,15 +61325,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource188", + "logicalId": "Resource147", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 18604, + "startLine": 14545, "startColumn": 7, - "endLine": 18604, + "endLine": 14545, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -62789,15 +61348,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource189", + "logicalId": "Resource148", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 18701, + "startLine": 14642, "startColumn": 7, - "endLine": 18701, + "endLine": 14642, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -62812,15 +61371,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource189", + "logicalId": "Resource148", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 18702, + "startLine": 14643, "startColumn": 7, - "endLine": 18702, + "endLine": 14643, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -62835,15 +61394,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource189", + "logicalId": "Resource148", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 18703, + "startLine": 14644, "startColumn": 7, - "endLine": 18703, + "endLine": 14644, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -62858,15 +61417,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource190", + "logicalId": "Resource149", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 18800, + "startLine": 14741, "startColumn": 7, - "endLine": 18800, + "endLine": 14741, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -62881,15 +61440,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource190", + "logicalId": "Resource149", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 18801, + "startLine": 14742, "startColumn": 7, - "endLine": 18801, + "endLine": 14742, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -62904,15 +61463,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource190", + "logicalId": "Resource149", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 18802, + "startLine": 14743, "startColumn": 7, - "endLine": 18802, + "endLine": 14743, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -62927,15 +61486,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource191", + "logicalId": "Resource150", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 18899, + "startLine": 14840, "startColumn": 7, - "endLine": 18899, + "endLine": 14840, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -62950,15 +61509,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource191", + "logicalId": "Resource150", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 18900, + "startLine": 14841, "startColumn": 7, - "endLine": 18900, + "endLine": 14841, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -62973,15 +61532,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource191", + "logicalId": "Resource150", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 18901, + "startLine": 14842, "startColumn": 7, - "endLine": 18901, + "endLine": 14842, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -62996,15 +61555,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource192", + "logicalId": "Resource151", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 18998, + "startLine": 14939, "startColumn": 7, - "endLine": 18998, + "endLine": 14939, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -63019,15 +61578,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource192", + "logicalId": "Resource151", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 18999, + "startLine": 14940, "startColumn": 7, - "endLine": 18999, + "endLine": 14940, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -63042,15 +61601,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource192", + "logicalId": "Resource151", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 19000, + "startLine": 14941, "startColumn": 7, - "endLine": 19000, + "endLine": 14941, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -63065,15 +61624,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource193", + "logicalId": "Resource152", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 19097, + "startLine": 15038, "startColumn": 7, - "endLine": 19097, + "endLine": 15038, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -63088,15 +61647,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource193", + "logicalId": "Resource152", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 19098, + "startLine": 15039, "startColumn": 7, - "endLine": 19098, + "endLine": 15039, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -63111,15 +61670,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource193", + "logicalId": "Resource152", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 19099, + "startLine": 15040, "startColumn": 7, - "endLine": 19099, + "endLine": 15040, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -63134,15 +61693,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource194", + "logicalId": "Resource153", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 19196, + "startLine": 15137, "startColumn": 7, - "endLine": 19196, + "endLine": 15137, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -63157,15 +61716,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource194", + "logicalId": "Resource153", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 19197, + "startLine": 15138, "startColumn": 7, - "endLine": 19197, + "endLine": 15138, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -63180,15 +61739,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource194", + "logicalId": "Resource153", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 19198, + "startLine": 15139, "startColumn": 7, - "endLine": 19198, + "endLine": 15139, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -63203,15 +61762,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource195", + "logicalId": "Resource154", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 19295, + "startLine": 15236, "startColumn": 7, - "endLine": 19295, + "endLine": 15236, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -63226,15 +61785,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource195", + "logicalId": "Resource154", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 19296, + "startLine": 15237, "startColumn": 7, - "endLine": 19296, + "endLine": 15237, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -63249,15 +61808,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource195", + "logicalId": "Resource154", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 19297, + "startLine": 15238, "startColumn": 7, - "endLine": 19297, + "endLine": 15238, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -63272,15 +61831,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource196", + "logicalId": "Resource155", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 19394, + "startLine": 15335, "startColumn": 7, - "endLine": 19394, + "endLine": 15335, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -63295,15 +61854,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource196", + "logicalId": "Resource155", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 19395, + "startLine": 15336, "startColumn": 7, - "endLine": 19395, + "endLine": 15336, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -63318,15 +61877,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource196", + "logicalId": "Resource155", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 19396, + "startLine": 15337, "startColumn": 7, - "endLine": 19396, + "endLine": 15337, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -63341,15 +61900,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource197", + "logicalId": "Resource156", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 19493, + "startLine": 15434, "startColumn": 7, - "endLine": 19493, + "endLine": 15434, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -63364,15 +61923,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource197", + "logicalId": "Resource156", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 19494, + "startLine": 15435, "startColumn": 7, - "endLine": 19494, + "endLine": 15435, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -63387,15 +61946,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource197", + "logicalId": "Resource156", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 19495, + "startLine": 15436, "startColumn": 7, - "endLine": 19495, + "endLine": 15436, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -63410,15 +61969,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource198", + "logicalId": "Resource157", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 19592, + "startLine": 15533, "startColumn": 7, - "endLine": 19592, + "endLine": 15533, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -63433,15 +61992,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource198", + "logicalId": "Resource157", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 19593, + "startLine": 15534, "startColumn": 7, - "endLine": 19593, + "endLine": 15534, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -63456,15 +62015,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource198", + "logicalId": "Resource157", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 19594, + "startLine": 15535, "startColumn": 7, - "endLine": 19594, + "endLine": 15535, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -63479,15 +62038,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource199", + "logicalId": "Resource158", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 19691, + "startLine": 15632, "startColumn": 7, - "endLine": 19691, + "endLine": 15632, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -63502,15 +62061,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource199", + "logicalId": "Resource158", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 19692, + "startLine": 15633, "startColumn": 7, - "endLine": 19692, + "endLine": 15633, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -63525,15 +62084,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource199", + "logicalId": "Resource158", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 19693, + "startLine": 15634, "startColumn": 7, - "endLine": 19693, + "endLine": 15634, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -63548,15 +62107,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource200", + "logicalId": "Resource159", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 19790, + "startLine": 15731, "startColumn": 7, - "endLine": 19790, + "endLine": 15731, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -63571,15 +62130,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource200", + "logicalId": "Resource159", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 19791, + "startLine": 15732, "startColumn": 7, - "endLine": 19791, + "endLine": 15732, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -63594,15 +62153,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource200", + "logicalId": "Resource159", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 19792, + "startLine": 15733, "startColumn": 7, - "endLine": 19792, + "endLine": 15733, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -63617,15 +62176,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource201", + "logicalId": "Resource160", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 19889, + "startLine": 15830, "startColumn": 7, - "endLine": 19889, + "endLine": 15830, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -63640,15 +62199,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource201", + "logicalId": "Resource160", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 19890, + "startLine": 15831, "startColumn": 7, - "endLine": 19890, + "endLine": 15831, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -63663,15 +62222,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource201", + "logicalId": "Resource160", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 19891, + "startLine": 15832, "startColumn": 7, - "endLine": 19891, + "endLine": 15832, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -63686,15 +62245,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource202", + "logicalId": "Resource161", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 19988, + "startLine": 15929, "startColumn": 7, - "endLine": 19988, + "endLine": 15929, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -63709,15 +62268,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource202", + "logicalId": "Resource161", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 19989, + "startLine": 15930, "startColumn": 7, - "endLine": 19989, + "endLine": 15930, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -63732,15 +62291,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource202", + "logicalId": "Resource161", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 19990, + "startLine": 15931, "startColumn": 7, - "endLine": 19990, + "endLine": 15931, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -63755,15 +62314,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource203", + "logicalId": "Resource162", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 20087, + "startLine": 16028, "startColumn": 7, - "endLine": 20087, + "endLine": 16028, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -63778,15 +62337,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource203", + "logicalId": "Resource162", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 20088, + "startLine": 16029, "startColumn": 7, - "endLine": 20088, + "endLine": 16029, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -63801,15 +62360,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource203", + "logicalId": "Resource162", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 20089, + "startLine": 16030, "startColumn": 7, - "endLine": 20089, + "endLine": 16030, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -63824,15 +62383,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource204", + "logicalId": "Resource163", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 20186, + "startLine": 16127, "startColumn": 7, - "endLine": 20186, + "endLine": 16127, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -63847,15 +62406,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource204", + "logicalId": "Resource163", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 20187, + "startLine": 16128, "startColumn": 7, - "endLine": 20187, + "endLine": 16128, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -63870,15 +62429,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource204", + "logicalId": "Resource163", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 20188, + "startLine": 16129, "startColumn": 7, - "endLine": 20188, + "endLine": 16129, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -63893,15 +62452,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource205", + "logicalId": "Resource164", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 20285, + "startLine": 16226, "startColumn": 7, - "endLine": 20285, + "endLine": 16226, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -63916,15 +62475,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource205", + "logicalId": "Resource164", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 20286, + "startLine": 16227, "startColumn": 7, - "endLine": 20286, + "endLine": 16227, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -63939,15 +62498,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource205", + "logicalId": "Resource164", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 20287, + "startLine": 16228, "startColumn": 7, - "endLine": 20287, + "endLine": 16228, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -63962,15 +62521,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource206", + "logicalId": "Resource165", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 20384, + "startLine": 16325, "startColumn": 7, - "endLine": 20384, + "endLine": 16325, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -63985,15 +62544,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource206", + "logicalId": "Resource165", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 20385, + "startLine": 16326, "startColumn": 7, - "endLine": 20385, + "endLine": 16326, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -64008,15 +62567,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource206", + "logicalId": "Resource165", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 20386, + "startLine": 16327, "startColumn": 7, - "endLine": 20386, + "endLine": 16327, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -64031,15 +62590,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource207", + "logicalId": "Resource166", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 20483, + "startLine": 16424, "startColumn": 7, - "endLine": 20483, + "endLine": 16424, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -64054,15 +62613,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource207", + "logicalId": "Resource166", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 20484, + "startLine": 16425, "startColumn": 7, - "endLine": 20484, + "endLine": 16425, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -64077,15 +62636,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource207", + "logicalId": "Resource166", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 20485, + "startLine": 16426, "startColumn": 7, - "endLine": 20485, + "endLine": 16426, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -64100,15 +62659,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource208", + "logicalId": "Resource167", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 20582, + "startLine": 16523, "startColumn": 7, - "endLine": 20582, + "endLine": 16523, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -64123,15 +62682,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource208", + "logicalId": "Resource167", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 20583, + "startLine": 16524, "startColumn": 7, - "endLine": 20583, + "endLine": 16524, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -64146,15 +62705,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource208", + "logicalId": "Resource167", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 20584, + "startLine": 16525, "startColumn": 7, - "endLine": 20584, + "endLine": 16525, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -64169,15 +62728,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource209", + "logicalId": "Resource168", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 20681, + "startLine": 16622, "startColumn": 7, - "endLine": 20681, + "endLine": 16622, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -64192,15 +62751,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource209", + "logicalId": "Resource168", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 20682, + "startLine": 16623, "startColumn": 7, - "endLine": 20682, + "endLine": 16623, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -64215,15 +62774,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource209", + "logicalId": "Resource168", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 20683, + "startLine": 16624, "startColumn": 7, - "endLine": 20683, + "endLine": 16624, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -64238,15 +62797,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource210", + "logicalId": "Resource169", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 20780, + "startLine": 16721, "startColumn": 7, - "endLine": 20780, + "endLine": 16721, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -64261,15 +62820,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource210", + "logicalId": "Resource169", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 20781, + "startLine": 16722, "startColumn": 7, - "endLine": 20781, + "endLine": 16722, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -64284,15 +62843,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource210", + "logicalId": "Resource169", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 20782, + "startLine": 16723, "startColumn": 7, - "endLine": 20782, + "endLine": 16723, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -64307,15 +62866,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource211", + "logicalId": "Resource170", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 20879, + "startLine": 16820, "startColumn": 7, - "endLine": 20879, + "endLine": 16820, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -64330,15 +62889,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource211", + "logicalId": "Resource170", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 20880, + "startLine": 16821, "startColumn": 7, - "endLine": 20880, + "endLine": 16821, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -64353,15 +62912,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource211", + "logicalId": "Resource170", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 20881, + "startLine": 16822, "startColumn": 7, - "endLine": 20881, + "endLine": 16822, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -64376,15 +62935,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource212", + "logicalId": "Resource171", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 20978, + "startLine": 16919, "startColumn": 7, - "endLine": 20978, + "endLine": 16919, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -64399,15 +62958,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource212", + "logicalId": "Resource171", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 20979, + "startLine": 16920, "startColumn": 7, - "endLine": 20979, + "endLine": 16920, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -64422,15 +62981,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource212", + "logicalId": "Resource171", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 20980, + "startLine": 16921, "startColumn": 7, - "endLine": 20980, + "endLine": 16921, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -64445,15 +63004,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource213", + "logicalId": "Resource172", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 21077, + "startLine": 17018, "startColumn": 7, - "endLine": 21077, + "endLine": 17018, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -64468,15 +63027,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource213", + "logicalId": "Resource172", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 21078, + "startLine": 17019, "startColumn": 7, - "endLine": 21078, + "endLine": 17019, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -64491,15 +63050,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource213", + "logicalId": "Resource172", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 21079, + "startLine": 17020, "startColumn": 7, - "endLine": 21079, + "endLine": 17020, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -64514,15 +63073,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource214", + "logicalId": "Resource173", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 21176, + "startLine": 17117, "startColumn": 7, - "endLine": 21176, + "endLine": 17117, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -64537,15 +63096,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource214", + "logicalId": "Resource173", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 21177, + "startLine": 17118, "startColumn": 7, - "endLine": 21177, + "endLine": 17118, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -64560,15 +63119,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource214", + "logicalId": "Resource173", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 21178, + "startLine": 17119, "startColumn": 7, - "endLine": 21178, + "endLine": 17119, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -64583,15 +63142,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource215", + "logicalId": "Resource174", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 21275, + "startLine": 17216, "startColumn": 7, - "endLine": 21275, + "endLine": 17216, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -64606,15 +63165,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource215", + "logicalId": "Resource174", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 21276, + "startLine": 17217, "startColumn": 7, - "endLine": 21276, + "endLine": 17217, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -64629,15 +63188,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource215", + "logicalId": "Resource174", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 21277, + "startLine": 17218, "startColumn": 7, - "endLine": 21277, + "endLine": 17218, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -64652,15 +63211,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource216", + "logicalId": "Resource175", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 21374, + "startLine": 17315, "startColumn": 7, - "endLine": 21374, + "endLine": 17315, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -64675,15 +63234,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource216", + "logicalId": "Resource175", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 21375, + "startLine": 17316, "startColumn": 7, - "endLine": 21375, + "endLine": 17316, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -64698,15 +63257,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource216", + "logicalId": "Resource175", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 21376, + "startLine": 17317, "startColumn": 7, - "endLine": 21376, + "endLine": 17317, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -64721,15 +63280,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource217", + "logicalId": "Resource176", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 21473, + "startLine": 17414, "startColumn": 7, - "endLine": 21473, + "endLine": 17414, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -64744,15 +63303,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource217", + "logicalId": "Resource176", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 21474, + "startLine": 17415, "startColumn": 7, - "endLine": 21474, + "endLine": 17415, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -64767,15 +63326,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource217", + "logicalId": "Resource176", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 21475, + "startLine": 17416, "startColumn": 7, - "endLine": 21475, + "endLine": 17416, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -64790,15 +63349,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource218", + "logicalId": "Resource177", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 21572, + "startLine": 17513, "startColumn": 7, - "endLine": 21572, + "endLine": 17513, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -64813,15 +63372,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource218", + "logicalId": "Resource177", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 21573, + "startLine": 17514, "startColumn": 7, - "endLine": 21573, + "endLine": 17514, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -64836,15 +63395,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource218", + "logicalId": "Resource177", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 21574, + "startLine": 17515, "startColumn": 7, - "endLine": 21574, + "endLine": 17515, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -64859,15 +63418,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource219", + "logicalId": "Resource178", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 21671, + "startLine": 17612, "startColumn": 7, - "endLine": 21671, + "endLine": 17612, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -64882,15 +63441,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource219", + "logicalId": "Resource178", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 21672, + "startLine": 17613, "startColumn": 7, - "endLine": 21672, + "endLine": 17613, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -64905,15 +63464,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource219", + "logicalId": "Resource178", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 21673, + "startLine": 17614, "startColumn": 7, - "endLine": 21673, + "endLine": 17614, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -64928,15 +63487,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource220", + "logicalId": "Resource179", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 21770, + "startLine": 17711, "startColumn": 7, - "endLine": 21770, + "endLine": 17711, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -64951,15 +63510,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource220", + "logicalId": "Resource179", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 21771, + "startLine": 17712, "startColumn": 7, - "endLine": 21771, + "endLine": 17712, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -64974,15 +63533,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource220", + "logicalId": "Resource179", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 21772, + "startLine": 17713, "startColumn": 7, - "endLine": 21772, + "endLine": 17713, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -64997,15 +63556,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource221", + "logicalId": "Resource180", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 21869, + "startLine": 17810, "startColumn": 7, - "endLine": 21869, + "endLine": 17810, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -65020,15 +63579,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource221", + "logicalId": "Resource180", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 21870, + "startLine": 17811, "startColumn": 7, - "endLine": 21870, + "endLine": 17811, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -65043,15 +63602,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource221", + "logicalId": "Resource180", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 21871, + "startLine": 17812, "startColumn": 7, - "endLine": 21871, + "endLine": 17812, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -65066,15 +63625,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource222", + "logicalId": "Resource181", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 21968, + "startLine": 17909, "startColumn": 7, - "endLine": 21968, + "endLine": 17909, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -65089,15 +63648,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource222", + "logicalId": "Resource181", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 21969, + "startLine": 17910, "startColumn": 7, - "endLine": 21969, + "endLine": 17910, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -65112,15 +63671,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource222", + "logicalId": "Resource181", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 21970, + "startLine": 17911, "startColumn": 7, - "endLine": 21970, + "endLine": 17911, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -65135,15 +63694,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource223", + "logicalId": "Resource182", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 22067, + "startLine": 18008, "startColumn": 7, - "endLine": 22067, + "endLine": 18008, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -65158,15 +63717,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource223", + "logicalId": "Resource182", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 22068, + "startLine": 18009, "startColumn": 7, - "endLine": 22068, + "endLine": 18009, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -65181,15 +63740,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource223", + "logicalId": "Resource182", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 22069, + "startLine": 18010, "startColumn": 7, - "endLine": 22069, + "endLine": 18010, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -65204,15 +63763,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource224", + "logicalId": "Resource183", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 22166, + "startLine": 18107, "startColumn": 7, - "endLine": 22166, + "endLine": 18107, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -65227,15 +63786,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource224", + "logicalId": "Resource183", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 22167, + "startLine": 18108, "startColumn": 7, - "endLine": 22167, + "endLine": 18108, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -65250,15 +63809,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource224", + "logicalId": "Resource183", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 22168, + "startLine": 18109, "startColumn": 7, - "endLine": 22168, + "endLine": 18109, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -65273,15 +63832,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource225", + "logicalId": "Resource184", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 22265, + "startLine": 18206, "startColumn": 7, - "endLine": 22265, + "endLine": 18206, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -65296,15 +63855,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource225", + "logicalId": "Resource184", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 22266, + "startLine": 18207, "startColumn": 7, - "endLine": 22266, + "endLine": 18207, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -65319,15 +63878,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource225", + "logicalId": "Resource184", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 22267, + "startLine": 18208, "startColumn": 7, - "endLine": 22267, + "endLine": 18208, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -65342,15 +63901,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource226", + "logicalId": "Resource185", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 22364, + "startLine": 18305, "startColumn": 7, - "endLine": 22364, + "endLine": 18305, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -65365,15 +63924,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource226", + "logicalId": "Resource185", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 22365, + "startLine": 18306, "startColumn": 7, - "endLine": 22365, + "endLine": 18306, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -65388,15 +63947,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource226", + "logicalId": "Resource185", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 22366, + "startLine": 18307, "startColumn": 7, - "endLine": 22366, + "endLine": 18307, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -65411,15 +63970,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource227", + "logicalId": "Resource186", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 22463, + "startLine": 18404, "startColumn": 7, - "endLine": 22463, + "endLine": 18404, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -65434,15 +63993,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource227", + "logicalId": "Resource186", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 22464, + "startLine": 18405, "startColumn": 7, - "endLine": 22464, + "endLine": 18405, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -65457,15 +64016,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource227", + "logicalId": "Resource186", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 22465, + "startLine": 18406, "startColumn": 7, - "endLine": 22465, + "endLine": 18406, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -65480,15 +64039,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource228", + "logicalId": "Resource187", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 22562, + "startLine": 18503, "startColumn": 7, - "endLine": 22562, + "endLine": 18503, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -65503,15 +64062,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource228", + "logicalId": "Resource187", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 22563, + "startLine": 18504, "startColumn": 7, - "endLine": 22563, + "endLine": 18504, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -65526,15 +64085,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource228", + "logicalId": "Resource187", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 22564, + "startLine": 18505, "startColumn": 7, - "endLine": 22564, + "endLine": 18505, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -65549,15 +64108,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource229", + "logicalId": "Resource188", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 22661, + "startLine": 18602, "startColumn": 7, - "endLine": 22661, + "endLine": 18602, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -65572,15 +64131,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource229", + "logicalId": "Resource188", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 22662, + "startLine": 18603, "startColumn": 7, - "endLine": 22662, + "endLine": 18603, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -65595,15 +64154,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource229", + "logicalId": "Resource188", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 22663, + "startLine": 18604, "startColumn": 7, - "endLine": 22663, + "endLine": 18604, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -65618,15 +64177,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource230", + "logicalId": "Resource189", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 22760, + "startLine": 18701, "startColumn": 7, - "endLine": 22760, + "endLine": 18701, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -65641,15 +64200,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource230", + "logicalId": "Resource189", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 22761, + "startLine": 18702, "startColumn": 7, - "endLine": 22761, + "endLine": 18702, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -65664,15 +64223,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource230", + "logicalId": "Resource189", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 22762, + "startLine": 18703, "startColumn": 7, - "endLine": 22762, + "endLine": 18703, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -65687,15 +64246,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource231", + "logicalId": "Resource190", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 22859, + "startLine": 18800, "startColumn": 7, - "endLine": 22859, + "endLine": 18800, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -65710,15 +64269,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource231", + "logicalId": "Resource190", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 22860, + "startLine": 18801, "startColumn": 7, - "endLine": 22860, + "endLine": 18801, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -65733,15 +64292,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource231", + "logicalId": "Resource190", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 22861, + "startLine": 18802, "startColumn": 7, - "endLine": 22861, + "endLine": 18802, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -65756,15 +64315,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource232", + "logicalId": "Resource191", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 22958, + "startLine": 18899, "startColumn": 7, - "endLine": 22958, + "endLine": 18899, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -65779,15 +64338,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource232", + "logicalId": "Resource191", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 22959, + "startLine": 18900, "startColumn": 7, - "endLine": 22959, + "endLine": 18900, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -65802,15 +64361,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource232", + "logicalId": "Resource191", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 22960, + "startLine": 18901, "startColumn": 7, - "endLine": 22960, + "endLine": 18901, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -65825,15 +64384,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource233", + "logicalId": "Resource192", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 23057, + "startLine": 18998, "startColumn": 7, - "endLine": 23057, + "endLine": 18998, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -65848,15 +64407,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource233", + "logicalId": "Resource192", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 23058, + "startLine": 18999, "startColumn": 7, - "endLine": 23058, + "endLine": 18999, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -65871,15 +64430,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource233", + "logicalId": "Resource192", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 23059, + "startLine": 19000, "startColumn": 7, - "endLine": 23059, + "endLine": 19000, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -65894,15 +64453,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource234", + "logicalId": "Resource193", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 23156, + "startLine": 19097, "startColumn": 7, - "endLine": 23156, + "endLine": 19097, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -65917,15 +64476,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource234", + "logicalId": "Resource193", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 23157, + "startLine": 19098, "startColumn": 7, - "endLine": 23157, + "endLine": 19098, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -65940,15 +64499,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource234", + "logicalId": "Resource193", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 23158, + "startLine": 19099, "startColumn": 7, - "endLine": 23158, + "endLine": 19099, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -65963,15 +64522,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource235", + "logicalId": "Resource194", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 23255, + "startLine": 19196, "startColumn": 7, - "endLine": 23255, + "endLine": 19196, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -65986,15 +64545,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource235", + "logicalId": "Resource194", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 23256, + "startLine": 19197, "startColumn": 7, - "endLine": 23256, + "endLine": 19197, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -66009,15 +64568,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource235", + "logicalId": "Resource194", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 23257, + "startLine": 19198, "startColumn": 7, - "endLine": 23257, + "endLine": 19198, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -66032,15 +64591,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource236", + "logicalId": "Resource195", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 23354, + "startLine": 19295, "startColumn": 7, - "endLine": 23354, + "endLine": 19295, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -66055,15 +64614,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource236", + "logicalId": "Resource195", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 23355, + "startLine": 19296, "startColumn": 7, - "endLine": 23355, + "endLine": 19296, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -66078,15 +64637,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource236", + "logicalId": "Resource195", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 23356, + "startLine": 19297, "startColumn": 7, - "endLine": 23356, + "endLine": 19297, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -66101,15 +64660,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource237", + "logicalId": "Resource196", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 23453, + "startLine": 19394, "startColumn": 7, - "endLine": 23453, + "endLine": 19394, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -66124,15 +64683,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource237", + "logicalId": "Resource196", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 23454, + "startLine": 19395, "startColumn": 7, - "endLine": 23454, + "endLine": 19395, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -66147,15 +64706,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource237", + "logicalId": "Resource196", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 23455, + "startLine": 19396, "startColumn": 7, - "endLine": 23455, + "endLine": 19396, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -66170,15 +64729,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource238", + "logicalId": "Resource197", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 23552, + "startLine": 19493, "startColumn": 7, - "endLine": 23552, + "endLine": 19493, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -66193,15 +64752,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource238", + "logicalId": "Resource197", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 23553, + "startLine": 19494, "startColumn": 7, - "endLine": 23553, + "endLine": 19494, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -66216,15 +64775,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource238", + "logicalId": "Resource197", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 23554, + "startLine": 19495, "startColumn": 7, - "endLine": 23554, + "endLine": 19495, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -66239,15 +64798,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource239", + "logicalId": "Resource198", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 23651, + "startLine": 19592, "startColumn": 7, - "endLine": 23651, + "endLine": 19592, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -66262,15 +64821,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource239", + "logicalId": "Resource198", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 23652, + "startLine": 19593, "startColumn": 7, - "endLine": 23652, + "endLine": 19593, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -66285,15 +64844,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource239", + "logicalId": "Resource198", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 23653, + "startLine": 19594, "startColumn": 7, - "endLine": 23653, + "endLine": 19594, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -66308,15 +64867,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource240", + "logicalId": "Resource199", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 23750, + "startLine": 19691, "startColumn": 7, - "endLine": 23750, + "endLine": 19691, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -66331,15 +64890,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource240", + "logicalId": "Resource199", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 23751, + "startLine": 19692, "startColumn": 7, - "endLine": 23751, + "endLine": 19692, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -66354,15 +64913,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource240", + "logicalId": "Resource199", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 23752, + "startLine": 19693, "startColumn": 7, - "endLine": 23752, + "endLine": 19693, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -66377,15 +64936,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource241", + "logicalId": "Resource200", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 23849, + "startLine": 19790, "startColumn": 7, - "endLine": 23849, + "endLine": 19790, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -66400,15 +64959,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource241", + "logicalId": "Resource200", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 23850, + "startLine": 19791, "startColumn": 7, - "endLine": 23850, + "endLine": 19791, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -66423,15 +64982,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource241", + "logicalId": "Resource200", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 23851, + "startLine": 19792, "startColumn": 7, - "endLine": 23851, + "endLine": 19792, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -66446,15 +65005,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource242", + "logicalId": "Resource201", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 23948, + "startLine": 19889, "startColumn": 7, - "endLine": 23948, + "endLine": 19889, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -66469,15 +65028,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource242", + "logicalId": "Resource201", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 23949, + "startLine": 19890, "startColumn": 7, - "endLine": 23949, + "endLine": 19890, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -66492,15 +65051,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource242", + "logicalId": "Resource201", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 23950, + "startLine": 19891, "startColumn": 7, - "endLine": 23950, + "endLine": 19891, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -66515,15 +65074,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource243", + "logicalId": "Resource202", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 24047, + "startLine": 19988, "startColumn": 7, - "endLine": 24047, + "endLine": 19988, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -66538,15 +65097,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource243", + "logicalId": "Resource202", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 24048, + "startLine": 19989, "startColumn": 7, - "endLine": 24048, + "endLine": 19989, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -66561,15 +65120,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource243", + "logicalId": "Resource202", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 24049, + "startLine": 19990, "startColumn": 7, - "endLine": 24049, + "endLine": 19990, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -66584,15 +65143,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource244", + "logicalId": "Resource203", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 24146, + "startLine": 20087, "startColumn": 7, - "endLine": 24146, + "endLine": 20087, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -66607,15 +65166,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource244", + "logicalId": "Resource203", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 24147, + "startLine": 20088, "startColumn": 7, - "endLine": 24147, + "endLine": 20088, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -66630,15 +65189,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource244", + "logicalId": "Resource203", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 24148, + "startLine": 20089, "startColumn": 7, - "endLine": 24148, + "endLine": 20089, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -66653,15 +65212,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource245", + "logicalId": "Resource204", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 24245, + "startLine": 20186, "startColumn": 7, - "endLine": 24245, + "endLine": 20186, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -66676,15 +65235,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource245", + "logicalId": "Resource204", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 24246, + "startLine": 20187, "startColumn": 7, - "endLine": 24246, + "endLine": 20187, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -66699,15 +65258,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource245", + "logicalId": "Resource204", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 24247, + "startLine": 20188, "startColumn": 7, - "endLine": 24247, + "endLine": 20188, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -66722,15 +65281,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource246", + "logicalId": "Resource205", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 24344, + "startLine": 20285, "startColumn": 7, - "endLine": 24344, + "endLine": 20285, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -66745,15 +65304,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource246", + "logicalId": "Resource205", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 24345, + "startLine": 20286, "startColumn": 7, - "endLine": 24345, + "endLine": 20286, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -66768,15 +65327,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource246", + "logicalId": "Resource205", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 24346, + "startLine": 20287, "startColumn": 7, - "endLine": 24346, + "endLine": 20287, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -66791,15 +65350,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource247", + "logicalId": "Resource206", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 24443, + "startLine": 20384, "startColumn": 7, - "endLine": 24443, + "endLine": 20384, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -66814,15 +65373,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource247", + "logicalId": "Resource206", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 24444, + "startLine": 20385, "startColumn": 7, - "endLine": 24444, + "endLine": 20385, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -66837,15 +65396,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource247", + "logicalId": "Resource206", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 24445, + "startLine": 20386, "startColumn": 7, - "endLine": 24445, + "endLine": 20386, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -66860,15 +65419,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource248", + "logicalId": "Resource207", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 24542, + "startLine": 20483, "startColumn": 7, - "endLine": 24542, + "endLine": 20483, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -66883,15 +65442,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource248", + "logicalId": "Resource207", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 24543, + "startLine": 20484, "startColumn": 7, - "endLine": 24543, + "endLine": 20484, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -66906,15 +65465,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource248", + "logicalId": "Resource207", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 24544, + "startLine": 20485, "startColumn": 7, - "endLine": 24544, + "endLine": 20485, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -66929,15 +65488,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource249", + "logicalId": "Resource208", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 24641, + "startLine": 20582, "startColumn": 7, - "endLine": 24641, + "endLine": 20582, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -66952,15 +65511,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource249", + "logicalId": "Resource208", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 24642, + "startLine": 20583, "startColumn": 7, - "endLine": 24642, + "endLine": 20583, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -66975,15 +65534,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource249", + "logicalId": "Resource208", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 24643, + "startLine": 20584, "startColumn": 7, - "endLine": 24643, + "endLine": 20584, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -66998,15 +65557,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource250", + "logicalId": "Resource209", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 24740, + "startLine": 20681, "startColumn": 7, - "endLine": 24740, + "endLine": 20681, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -67021,15 +65580,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource250", + "logicalId": "Resource209", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 24741, + "startLine": 20682, "startColumn": 7, - "endLine": 24741, + "endLine": 20682, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -67044,15 +65603,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource250", + "logicalId": "Resource209", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 24742, + "startLine": 20683, "startColumn": 7, - "endLine": 24742, + "endLine": 20683, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -67067,15 +65626,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource251", + "logicalId": "Resource210", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 24839, + "startLine": 20780, "startColumn": 7, - "endLine": 24839, + "endLine": 20780, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -67090,15 +65649,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource251", + "logicalId": "Resource210", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 24840, + "startLine": 20781, "startColumn": 7, - "endLine": 24840, + "endLine": 20781, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -67113,15 +65672,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource251", + "logicalId": "Resource210", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 24841, + "startLine": 20782, "startColumn": 7, - "endLine": 24841, + "endLine": 20782, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -67136,15 +65695,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource252", + "logicalId": "Resource211", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 24938, + "startLine": 20879, "startColumn": 7, - "endLine": 24938, + "endLine": 20879, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -67159,15 +65718,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource252", + "logicalId": "Resource211", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 24939, + "startLine": 20880, "startColumn": 7, - "endLine": 24939, + "endLine": 20880, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -67182,15 +65741,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource252", + "logicalId": "Resource211", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 24940, + "startLine": 20881, "startColumn": 7, - "endLine": 24940, + "endLine": 20881, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -67205,15 +65764,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource253", + "logicalId": "Resource212", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 25037, + "startLine": 20978, "startColumn": 7, - "endLine": 25037, + "endLine": 20978, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -67228,15 +65787,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource253", + "logicalId": "Resource212", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 25038, + "startLine": 20979, "startColumn": 7, - "endLine": 25038, + "endLine": 20979, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -67251,15 +65810,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource253", + "logicalId": "Resource212", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 25039, + "startLine": 20980, "startColumn": 7, - "endLine": 25039, + "endLine": 20980, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -67274,15 +65833,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource254", + "logicalId": "Resource213", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 25136, + "startLine": 21077, "startColumn": 7, - "endLine": 25136, + "endLine": 21077, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -67297,15 +65856,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource254", + "logicalId": "Resource213", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 25137, + "startLine": 21078, "startColumn": 7, - "endLine": 25137, + "endLine": 21078, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -67320,15 +65879,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource254", + "logicalId": "Resource213", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 25138, + "startLine": 21079, "startColumn": 7, - "endLine": 25138, + "endLine": 21079, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -67343,15 +65902,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource255", + "logicalId": "Resource214", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 25235, + "startLine": 21176, "startColumn": 7, - "endLine": 25235, + "endLine": 21176, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -67366,15 +65925,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource255", + "logicalId": "Resource214", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 25236, + "startLine": 21177, "startColumn": 7, - "endLine": 25236, + "endLine": 21177, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -67389,15 +65948,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource255", + "logicalId": "Resource214", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 25237, + "startLine": 21178, "startColumn": 7, - "endLine": 25237, + "endLine": 21178, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -67412,15 +65971,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource256", + "logicalId": "Resource215", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 25334, + "startLine": 21275, "startColumn": 7, - "endLine": 25334, + "endLine": 21275, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -67435,15 +65994,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource256", + "logicalId": "Resource215", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 25335, + "startLine": 21276, "startColumn": 7, - "endLine": 25335, + "endLine": 21276, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -67458,15 +66017,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource256", + "logicalId": "Resource215", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 25336, + "startLine": 21277, "startColumn": 7, - "endLine": 25336, + "endLine": 21277, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -67481,15 +66040,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource257", + "logicalId": "Resource216", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 25433, + "startLine": 21374, "startColumn": 7, - "endLine": 25433, + "endLine": 21374, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -67504,15 +66063,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource257", + "logicalId": "Resource216", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 25434, + "startLine": 21375, "startColumn": 7, - "endLine": 25434, + "endLine": 21375, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -67527,15 +66086,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource257", + "logicalId": "Resource216", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 25435, + "startLine": 21376, "startColumn": 7, - "endLine": 25435, + "endLine": 21376, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -67550,15 +66109,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource258", + "logicalId": "Resource217", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 25532, + "startLine": 21473, "startColumn": 7, - "endLine": 25532, + "endLine": 21473, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -67573,15 +66132,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource258", + "logicalId": "Resource217", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 25533, + "startLine": 21474, "startColumn": 7, - "endLine": 25533, + "endLine": 21474, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -67596,15 +66155,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource258", + "logicalId": "Resource217", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 25534, + "startLine": 21475, "startColumn": 7, - "endLine": 25534, + "endLine": 21475, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -67619,15 +66178,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource259", + "logicalId": "Resource218", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 25631, + "startLine": 21572, "startColumn": 7, - "endLine": 25631, + "endLine": 21572, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -67642,15 +66201,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource259", + "logicalId": "Resource218", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 25632, + "startLine": 21573, "startColumn": 7, - "endLine": 25632, + "endLine": 21573, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -67665,15 +66224,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource259", + "logicalId": "Resource218", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 25633, + "startLine": 21574, "startColumn": 7, - "endLine": 25633, + "endLine": 21574, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -67688,15 +66247,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource260", + "logicalId": "Resource219", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 25730, + "startLine": 21671, "startColumn": 7, - "endLine": 25730, + "endLine": 21671, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -67711,15 +66270,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource260", + "logicalId": "Resource219", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 25731, + "startLine": 21672, "startColumn": 7, - "endLine": 25731, + "endLine": 21672, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -67734,15 +66293,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource260", + "logicalId": "Resource219", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 25732, + "startLine": 21673, "startColumn": 7, - "endLine": 25732, + "endLine": 21673, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -67757,15 +66316,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource261", + "logicalId": "Resource220", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 25829, + "startLine": 21770, "startColumn": 7, - "endLine": 25829, + "endLine": 21770, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -67780,15 +66339,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource261", + "logicalId": "Resource220", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 25830, + "startLine": 21771, "startColumn": 7, - "endLine": 25830, + "endLine": 21771, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -67803,15 +66362,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource261", + "logicalId": "Resource220", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 25831, + "startLine": 21772, "startColumn": 7, - "endLine": 25831, + "endLine": 21772, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -67826,15 +66385,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource262", + "logicalId": "Resource221", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 25928, + "startLine": 21869, "startColumn": 7, - "endLine": 25928, + "endLine": 21869, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -67849,15 +66408,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource262", + "logicalId": "Resource221", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 25929, + "startLine": 21870, "startColumn": 7, - "endLine": 25929, + "endLine": 21870, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -67872,15 +66431,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource262", + "logicalId": "Resource221", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 25930, + "startLine": 21871, "startColumn": 7, - "endLine": 25930, + "endLine": 21871, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -67895,15 +66454,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource263", + "logicalId": "Resource222", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 26027, + "startLine": 21968, "startColumn": 7, - "endLine": 26027, + "endLine": 21968, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -67918,15 +66477,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource263", + "logicalId": "Resource222", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 26028, + "startLine": 21969, "startColumn": 7, - "endLine": 26028, + "endLine": 21969, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -67941,15 +66500,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource263", + "logicalId": "Resource222", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 26029, + "startLine": 21970, "startColumn": 7, - "endLine": 26029, + "endLine": 21970, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -67964,15 +66523,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource264", + "logicalId": "Resource223", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 26126, + "startLine": 22067, "startColumn": 7, - "endLine": 26126, + "endLine": 22067, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -67987,15 +66546,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource264", + "logicalId": "Resource223", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 26127, + "startLine": 22068, "startColumn": 7, - "endLine": 26127, + "endLine": 22068, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -68010,15 +66569,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource264", + "logicalId": "Resource223", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 26128, + "startLine": 22069, "startColumn": 7, - "endLine": 26128, + "endLine": 22069, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -68033,15 +66592,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource265", + "logicalId": "Resource224", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 26225, + "startLine": 22166, "startColumn": 7, - "endLine": 26225, + "endLine": 22166, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -68056,15 +66615,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource265", + "logicalId": "Resource224", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 26226, + "startLine": 22167, "startColumn": 7, - "endLine": 26226, + "endLine": 22167, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -68079,15 +66638,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource265", + "logicalId": "Resource224", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 26227, + "startLine": 22168, "startColumn": 7, - "endLine": 26227, + "endLine": 22168, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -68102,15 +66661,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource266", + "logicalId": "Resource225", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 26324, + "startLine": 22265, "startColumn": 7, - "endLine": 26324, + "endLine": 22265, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -68125,15 +66684,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource266", + "logicalId": "Resource225", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 26325, + "startLine": 22266, "startColumn": 7, - "endLine": 26325, + "endLine": 22266, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -68148,15 +66707,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource266", + "logicalId": "Resource225", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 26326, + "startLine": 22267, "startColumn": 7, - "endLine": 26326, + "endLine": 22267, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -68171,15 +66730,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource267", + "logicalId": "Resource226", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 26423, + "startLine": 22364, "startColumn": 7, - "endLine": 26423, + "endLine": 22364, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -68194,15 +66753,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource267", + "logicalId": "Resource226", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 26424, + "startLine": 22365, "startColumn": 7, - "endLine": 26424, + "endLine": 22365, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -68217,15 +66776,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource267", + "logicalId": "Resource226", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 26425, + "startLine": 22366, "startColumn": 7, - "endLine": 26425, + "endLine": 22366, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -68240,15 +66799,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource268", + "logicalId": "Resource227", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 26522, + "startLine": 22463, "startColumn": 7, - "endLine": 26522, + "endLine": 22463, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -68263,15 +66822,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource268", + "logicalId": "Resource227", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 26523, + "startLine": 22464, "startColumn": 7, - "endLine": 26523, + "endLine": 22464, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -68286,15 +66845,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource268", + "logicalId": "Resource227", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 26524, + "startLine": 22465, "startColumn": 7, - "endLine": 26524, + "endLine": 22465, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -68309,15 +66868,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource269", + "logicalId": "Resource228", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 26621, + "startLine": 22562, "startColumn": 7, - "endLine": 26621, + "endLine": 22562, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -68332,15 +66891,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource269", + "logicalId": "Resource228", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 26622, + "startLine": 22563, "startColumn": 7, - "endLine": 26622, + "endLine": 22563, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -68355,15 +66914,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource269", + "logicalId": "Resource228", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 26623, + "startLine": 22564, "startColumn": 7, - "endLine": 26623, + "endLine": 22564, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -68378,15 +66937,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource270", + "logicalId": "Resource229", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 26720, + "startLine": 22661, "startColumn": 7, - "endLine": 26720, + "endLine": 22661, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -68401,15 +66960,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource270", + "logicalId": "Resource229", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 26721, + "startLine": 22662, "startColumn": 7, - "endLine": 26721, + "endLine": 22662, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -68424,15 +66983,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource270", + "logicalId": "Resource229", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 26722, + "startLine": 22663, "startColumn": 7, - "endLine": 26722, + "endLine": 22663, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -68447,15 +67006,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource271", + "logicalId": "Resource230", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 26819, + "startLine": 22760, "startColumn": 7, - "endLine": 26819, + "endLine": 22760, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -68470,15 +67029,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource271", + "logicalId": "Resource230", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 26820, + "startLine": 22761, "startColumn": 7, - "endLine": 26820, + "endLine": 22761, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -68493,15 +67052,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource271", + "logicalId": "Resource230", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 26821, + "startLine": 22762, "startColumn": 7, - "endLine": 26821, + "endLine": 22762, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -68516,15 +67075,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource272", + "logicalId": "Resource231", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 26918, + "startLine": 22859, "startColumn": 7, - "endLine": 26918, + "endLine": 22859, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -68539,15 +67098,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource272", + "logicalId": "Resource231", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 26919, + "startLine": 22860, "startColumn": 7, - "endLine": 26919, + "endLine": 22860, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -68562,15 +67121,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource272", + "logicalId": "Resource231", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 26920, + "startLine": 22861, "startColumn": 7, - "endLine": 26920, + "endLine": 22861, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -68585,15 +67144,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource273", + "logicalId": "Resource232", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 27017, + "startLine": 22958, "startColumn": 7, - "endLine": 27017, + "endLine": 22958, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -68608,15 +67167,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource273", + "logicalId": "Resource232", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 27018, + "startLine": 22959, "startColumn": 7, - "endLine": 27018, + "endLine": 22959, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -68631,15 +67190,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource273", + "logicalId": "Resource232", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 27019, + "startLine": 22960, "startColumn": 7, - "endLine": 27019, + "endLine": 22960, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -68654,15 +67213,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource274", + "logicalId": "Resource233", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 27116, + "startLine": 23057, "startColumn": 7, - "endLine": 27116, + "endLine": 23057, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -68677,15 +67236,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource274", + "logicalId": "Resource233", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 27117, + "startLine": 23058, "startColumn": 7, - "endLine": 27117, + "endLine": 23058, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -68700,15 +67259,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource274", + "logicalId": "Resource233", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 27118, + "startLine": 23059, "startColumn": 7, - "endLine": 27118, + "endLine": 23059, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -68723,15 +67282,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource275", + "logicalId": "Resource234", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 27215, + "startLine": 23156, "startColumn": 7, - "endLine": 27215, + "endLine": 23156, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -68746,15 +67305,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource275", + "logicalId": "Resource234", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 27216, + "startLine": 23157, "startColumn": 7, - "endLine": 27216, + "endLine": 23157, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -68769,15 +67328,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource275", + "logicalId": "Resource234", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 27217, + "startLine": 23158, "startColumn": 7, - "endLine": 27217, + "endLine": 23158, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -68792,15 +67351,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource276", + "logicalId": "Resource235", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 27314, + "startLine": 23255, "startColumn": 7, - "endLine": 27314, + "endLine": 23255, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -68815,15 +67374,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource276", + "logicalId": "Resource235", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 27315, + "startLine": 23256, "startColumn": 7, - "endLine": 27315, + "endLine": 23256, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -68838,15 +67397,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource276", + "logicalId": "Resource235", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 27316, + "startLine": 23257, "startColumn": 7, - "endLine": 27316, + "endLine": 23257, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -68861,15 +67420,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource277", + "logicalId": "Resource236", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 27413, + "startLine": 23354, "startColumn": 7, - "endLine": 27413, + "endLine": 23354, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -68884,15 +67443,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource277", + "logicalId": "Resource236", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 27414, + "startLine": 23355, "startColumn": 7, - "endLine": 27414, + "endLine": 23355, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -68907,15 +67466,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource277", + "logicalId": "Resource236", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 27415, + "startLine": 23356, "startColumn": 7, - "endLine": 27415, + "endLine": 23356, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -68930,15 +67489,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource278", + "logicalId": "Resource237", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 27512, + "startLine": 23453, "startColumn": 7, - "endLine": 27512, + "endLine": 23453, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -68953,15 +67512,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource278", + "logicalId": "Resource237", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 27513, + "startLine": 23454, "startColumn": 7, - "endLine": 27513, + "endLine": 23454, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -68976,15 +67535,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource278", + "logicalId": "Resource237", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 27514, + "startLine": 23455, "startColumn": 7, - "endLine": 27514, + "endLine": 23455, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -68999,15 +67558,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource279", + "logicalId": "Resource238", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 27611, + "startLine": 23552, "startColumn": 7, - "endLine": 27611, + "endLine": 23552, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -69022,15 +67581,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource279", + "logicalId": "Resource238", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 27612, + "startLine": 23553, "startColumn": 7, - "endLine": 27612, + "endLine": 23553, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -69045,15 +67604,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource279", + "logicalId": "Resource238", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 27613, + "startLine": 23554, "startColumn": 7, - "endLine": 27613, + "endLine": 23554, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -69068,15 +67627,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource280", + "logicalId": "Resource239", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 27710, + "startLine": 23651, "startColumn": 7, - "endLine": 27710, + "endLine": 23651, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -69091,15 +67650,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource280", + "logicalId": "Resource239", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 27711, + "startLine": 23652, "startColumn": 7, - "endLine": 27711, + "endLine": 23652, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -69114,15 +67673,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource280", + "logicalId": "Resource239", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 27712, + "startLine": 23653, "startColumn": 7, - "endLine": 27712, + "endLine": 23653, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -69137,15 +67696,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource281", + "logicalId": "Resource240", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 27809, + "startLine": 23750, "startColumn": 7, - "endLine": 27809, + "endLine": 23750, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -69160,15 +67719,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource281", + "logicalId": "Resource240", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 27810, + "startLine": 23751, "startColumn": 7, - "endLine": 27810, + "endLine": 23751, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -69183,15 +67742,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource281", + "logicalId": "Resource240", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 27811, + "startLine": 23752, "startColumn": 7, - "endLine": 27811, + "endLine": 23752, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -69206,15 +67765,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource282", + "logicalId": "Resource241", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 27908, + "startLine": 23849, "startColumn": 7, - "endLine": 27908, + "endLine": 23849, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -69229,15 +67788,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource282", + "logicalId": "Resource241", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 27909, + "startLine": 23850, "startColumn": 7, - "endLine": 27909, + "endLine": 23850, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -69252,15 +67811,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource282", + "logicalId": "Resource241", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 27910, + "startLine": 23851, "startColumn": 7, - "endLine": 27910, + "endLine": 23851, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -69275,15 +67834,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource283", + "logicalId": "Resource242", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 28007, + "startLine": 23948, "startColumn": 7, - "endLine": 28007, + "endLine": 23948, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -69298,15 +67857,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource283", + "logicalId": "Resource242", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 28008, + "startLine": 23949, "startColumn": 7, - "endLine": 28008, + "endLine": 23949, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -69321,15 +67880,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource283", + "logicalId": "Resource242", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 28009, + "startLine": 23950, "startColumn": 7, - "endLine": 28009, + "endLine": 23950, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -69344,15 +67903,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource284", + "logicalId": "Resource243", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 28106, + "startLine": 24047, "startColumn": 7, - "endLine": 28106, + "endLine": 24047, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -69367,15 +67926,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource284", + "logicalId": "Resource243", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 28107, + "startLine": 24048, "startColumn": 7, - "endLine": 28107, + "endLine": 24048, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -69390,15 +67949,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource284", + "logicalId": "Resource243", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 28108, + "startLine": 24049, "startColumn": 7, - "endLine": 28108, + "endLine": 24049, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -69413,15 +67972,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource285", + "logicalId": "Resource244", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 28205, + "startLine": 24146, "startColumn": 7, - "endLine": 28205, + "endLine": 24146, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -69436,15 +67995,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource285", + "logicalId": "Resource244", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 28206, + "startLine": 24147, "startColumn": 7, - "endLine": 28206, + "endLine": 24147, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -69459,15 +68018,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource285", + "logicalId": "Resource244", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 28207, + "startLine": 24148, "startColumn": 7, - "endLine": 28207, + "endLine": 24148, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -69482,15 +68041,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource286", + "logicalId": "Resource245", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 28304, + "startLine": 24245, "startColumn": 7, - "endLine": 28304, + "endLine": 24245, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -69505,15 +68064,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource286", + "logicalId": "Resource245", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 28305, + "startLine": 24246, "startColumn": 7, - "endLine": 28305, + "endLine": 24246, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -69528,15 +68087,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource286", + "logicalId": "Resource245", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 28306, + "startLine": 24247, "startColumn": 7, - "endLine": 28306, + "endLine": 24247, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -69551,15 +68110,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource287", + "logicalId": "Resource246", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 28403, + "startLine": 24344, "startColumn": 7, - "endLine": 28403, + "endLine": 24344, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -69574,15 +68133,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource287", + "logicalId": "Resource246", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 28404, + "startLine": 24345, "startColumn": 7, - "endLine": 28404, + "endLine": 24345, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -69597,15 +68156,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource287", + "logicalId": "Resource246", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 28405, + "startLine": 24346, "startColumn": 7, - "endLine": 28405, + "endLine": 24346, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -69620,15 +68179,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource288", + "logicalId": "Resource247", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 28502, + "startLine": 24443, "startColumn": 7, - "endLine": 28502, + "endLine": 24443, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -69643,15 +68202,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource288", + "logicalId": "Resource247", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 28503, + "startLine": 24444, "startColumn": 7, - "endLine": 28503, + "endLine": 24444, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -69666,15 +68225,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource288", + "logicalId": "Resource247", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 28504, + "startLine": 24445, "startColumn": 7, - "endLine": 28504, + "endLine": 24445, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -69689,15 +68248,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource289", + "logicalId": "Resource248", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 28601, + "startLine": 24542, "startColumn": 7, - "endLine": 28601, + "endLine": 24542, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -69712,15 +68271,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource289", + "logicalId": "Resource248", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 28602, + "startLine": 24543, "startColumn": 7, - "endLine": 28602, + "endLine": 24543, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -69735,15 +68294,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource289", + "logicalId": "Resource248", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 28603, + "startLine": 24544, "startColumn": 7, - "endLine": 28603, + "endLine": 24544, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -69758,15 +68317,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource290", + "logicalId": "Resource249", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 28700, + "startLine": 24641, "startColumn": 7, - "endLine": 28700, + "endLine": 24641, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -69781,15 +68340,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource290", + "logicalId": "Resource249", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 28701, + "startLine": 24642, "startColumn": 7, - "endLine": 28701, + "endLine": 24642, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -69804,15 +68363,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource290", + "logicalId": "Resource249", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 28702, + "startLine": 24643, "startColumn": 7, - "endLine": 28702, + "endLine": 24643, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -69827,15 +68386,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource291", + "logicalId": "Resource250", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 28799, + "startLine": 24740, "startColumn": 7, - "endLine": 28799, + "endLine": 24740, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -69850,15 +68409,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource291", + "logicalId": "Resource250", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 28800, + "startLine": 24741, "startColumn": 7, - "endLine": 28800, + "endLine": 24741, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -69873,15 +68432,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource291", + "logicalId": "Resource250", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 28801, + "startLine": 24742, "startColumn": 7, - "endLine": 28801, + "endLine": 24742, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -69896,15 +68455,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource292", + "logicalId": "Resource251", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 28898, + "startLine": 24839, "startColumn": 7, - "endLine": 28898, + "endLine": 24839, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -69919,15 +68478,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource292", + "logicalId": "Resource251", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 28899, + "startLine": 24840, "startColumn": 7, - "endLine": 28899, + "endLine": 24840, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -69942,15 +68501,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource292", + "logicalId": "Resource251", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 28900, + "startLine": 24841, "startColumn": 7, - "endLine": 28900, + "endLine": 24841, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -69965,15 +68524,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource293", + "logicalId": "Resource252", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 28997, + "startLine": 24938, "startColumn": 7, - "endLine": 28997, + "endLine": 24938, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -69988,15 +68547,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource293", + "logicalId": "Resource252", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 28998, + "startLine": 24939, "startColumn": 7, - "endLine": 28998, + "endLine": 24939, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -70011,15 +68570,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource293", + "logicalId": "Resource252", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 28999, + "startLine": 24940, "startColumn": 7, - "endLine": 28999, + "endLine": 24940, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -70034,15 +68593,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource294", + "logicalId": "Resource253", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 29096, + "startLine": 25037, "startColumn": 7, - "endLine": 29096, + "endLine": 25037, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -70057,15 +68616,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource294", + "logicalId": "Resource253", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 29097, + "startLine": 25038, "startColumn": 7, - "endLine": 29097, + "endLine": 25038, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -70080,15 +68639,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource294", + "logicalId": "Resource253", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 29098, + "startLine": 25039, "startColumn": 7, - "endLine": 29098, + "endLine": 25039, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -70103,15 +68662,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource295", + "logicalId": "Resource254", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 29195, + "startLine": 25136, "startColumn": 7, - "endLine": 29195, + "endLine": 25136, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -70126,15 +68685,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource295", + "logicalId": "Resource254", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 29196, + "startLine": 25137, "startColumn": 7, - "endLine": 29196, + "endLine": 25137, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -70149,15 +68708,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource295", + "logicalId": "Resource254", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 29197, + "startLine": 25138, "startColumn": 7, - "endLine": 29197, + "endLine": 25138, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -70172,15 +68731,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource296", + "logicalId": "Resource255", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 29294, + "startLine": 25235, "startColumn": 7, - "endLine": 29294, + "endLine": 25235, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -70195,15 +68754,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource296", + "logicalId": "Resource255", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 29295, + "startLine": 25236, "startColumn": 7, - "endLine": 29295, + "endLine": 25236, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -70218,15 +68777,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource296", + "logicalId": "Resource255", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 29296, + "startLine": 25237, "startColumn": 7, - "endLine": 29296, + "endLine": 25237, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -70241,15 +68800,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource297", + "logicalId": "Resource256", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 29393, + "startLine": 25334, "startColumn": 7, - "endLine": 29393, + "endLine": 25334, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -70264,15 +68823,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource297", + "logicalId": "Resource256", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 29394, + "startLine": 25335, "startColumn": 7, - "endLine": 29394, + "endLine": 25335, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -70287,15 +68846,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource297", + "logicalId": "Resource256", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 29395, + "startLine": 25336, "startColumn": 7, - "endLine": 29395, + "endLine": 25336, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -70310,15 +68869,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource298", + "logicalId": "Resource257", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 29492, + "startLine": 25433, "startColumn": 7, - "endLine": 29492, + "endLine": 25433, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -70333,15 +68892,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource298", + "logicalId": "Resource257", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 29493, + "startLine": 25434, "startColumn": 7, - "endLine": 29493, + "endLine": 25434, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -70356,15 +68915,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource298", + "logicalId": "Resource257", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 29494, + "startLine": 25435, "startColumn": 7, - "endLine": 29494, + "endLine": 25435, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -70379,15 +68938,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource299", + "logicalId": "Resource258", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 29591, + "startLine": 25532, "startColumn": 7, - "endLine": 29591, + "endLine": 25532, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -70402,15 +68961,15 @@ "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource299", + "logicalId": "Resource258", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 29592, + "startLine": 25533, "startColumn": 7, - "endLine": 29592, + "endLine": 25533, "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -70425,15 +68984,15 @@ "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource299", + "logicalId": "Resource258", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 29593, + "startLine": 25534, "startColumn": 7, - "endLine": 29593, + "endLine": 25534, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -70442,158 +69001,23 @@ "lifecycle": "conditional-create-only" } }, - { - "ruleId": "I9003", - "severity": "INFO", - "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", - "source": "ENGINE", - "category": "Best Practice", - "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", - "phase": "LINT" - } - ] - }, - "bad/mappings/name.yaml": { - "filePath": "bad/mappings/name.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 0, - "counts": { - "fatal": 1, - "errors": 1, - "warnings": 1, - "informational": 0, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "F0001", - "severity": "FATAL", - "message": "Resources section must exist and be non-empty", - "source": "SCHEMA", - "category": "Structure", - "startLine": 10, - "startColumn": 1, - "endLine": 10, - "endColumn": 10, - "ruleDescription": "Resources section must exist and be non-empty", - "phase": "SCHEMA" - }, - { - "ruleId": "E7001", - "severity": "ERROR", - "message": "Mapping name 'Bad.Name' does not match format '^[a-zA-Z0-9]+$'", - "source": "CFN_LINT", - "entity": { - "logicalId": "Bad.Name", - "entityType": "Mapping" - }, - "propertyPath": "Mappings/Bad.Name", - "category": "Structure", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 11, - "ruleDescription": "Mappings are appropriately configured", - "phase": "LINT" - }, - { - "ruleId": "W7001", - "severity": "WARN", - "message": "Mapping 'Bad.Name' is not referenced by any Fn::FindInMap", - "source": "CFN_LINT", - "entity": { - "logicalId": "Bad.Name", - "entityType": "Mapping" - }, - "propertyPath": "Mappings/Bad.Name", - "category": "Best Practice", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 11, - "ruleDescription": "Check if Mappings are Used", - "phase": "LINT" - } - ] - }, - "bad/mappings/used.yaml": { - "filePath": "bad/mappings/used.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 1, - "informational": 3, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "E1151", - "severity": "ERROR", - "message": "'vpc-123456' does not match format 'AWS::EC2::VPC.Id'", - "source": "CFN_LINT", - "entity": { - "logicalId": "mySubnet", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.VpcId", - "category": "Intrinsic Function", - "startLine": 18, - "startColumn": 7, - "endLine": 18, - "endColumn": 12, - "ruleDescription": "Validate VPC id format", - "phase": "SCHEMA", - "context": { - "actualValue": "vpc-123456" - } - }, - { - "ruleId": "W7001", - "severity": "WARN", - "message": "Mapping 'Environment' is not referenced by any Fn::FindInMap", - "source": "CFN_LINT", - "entity": { - "logicalId": "Environment", - "entityType": "Mapping" - }, - "propertyPath": "Mappings/Environment", - "category": "Best Practice", - "startLine": 4, - "startColumn": 3, - "endLine": 4, - "endColumn": 14, - "ruleDescription": "Check if Mappings are Used", - "phase": "LINT" - }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "mySubnet", + "logicalId": "Resource259", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 18, + "startLine": 25631, "startColumn": 7, - "endLine": 18, - "endColumn": 12, + "endLine": 25631, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -70603,1058 +69027,875 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "mySubnet", + "logicalId": "Resource259", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 20, + "startLine": 25632, "startColumn": 7, - "endLine": 20, - "endColumn": 16, + "endLine": 25632, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'mySubnet' of type 'AWS::EC2::Subnet' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "mySubnet", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 17, - "startColumn": 5, - "endLine": 17, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "bad/module_with_tags.yaml": { - "filePath": "bad/module_with_tags.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 0, - "informational": 0, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "E5001", - "severity": "ERROR", - "message": "Tags is not permitted within Module resource 'Mod'", - "source": "CFN_LINT", - "entity": { - "logicalId": "Mod", - "entityType": "Resource", - "resourceType": "MyCompany::Testing::MODULE" - }, - "propertyPath": "Properties.Tags", - "category": "Structure", - "startLine": 6, - "startColumn": 7, - "endLine": 6, - "endColumn": 11, - "ruleDescription": "Check that Modules resources are valid", - "phase": "LINT" - } - ] - }, - "bad/modules/bad_has_create_policy.yaml": { - "filePath": "bad/modules/bad_has_create_policy.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 2, - "warnings": 0, - "informational": 0, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "E3055", - "severity": "ERROR", - "message": "CreationPolicy is not supported on resource type 'My::Organization::Custom::MODULE'", - "source": "CFN_LINT", - "entity": { - "logicalId": "MyModule", - "entityType": "Resource", - "resourceType": "My::Organization::Custom::MODULE" - }, - "propertyPath": "CreationPolicy", - "suggestedFix": "Remove CreationPolicy or change resource type to one of: AWS::AppStream::Fleet, AWS::AutoScaling::AutoScalingGroup, AWS::CloudFormation::WaitCondition, AWS::EC2::Instance", - "category": "Resource", - "startLine": 6, - "startColumn": 5, - "endLine": 6, - "endColumn": 19, - "ruleDescription": "Check CreationPolicy values for Resources", - "phase": "LINT" - }, - { - "ruleId": "E5001", - "severity": "ERROR", - "message": "CreationPolicy is not permitted within Module resource 'MyModule'", - "source": "CFN_LINT", - "entity": { - "logicalId": "MyModule", - "entityType": "Resource", - "resourceType": "My::Organization::Custom::MODULE" - }, - "propertyPath": "CreationPolicy", - "category": "Structure", - "startLine": 6, - "startColumn": 5, - "endLine": 6, - "endColumn": 19, - "ruleDescription": "Check that Modules resources are valid", - "phase": "LINT" - } - ] - }, - "bad/modules/bad_has_tags.yaml": { - "filePath": "bad/modules/bad_has_tags.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 0, - "informational": 0, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "E5001", - "severity": "ERROR", - "message": "Tags is not permitted within Module resource 'IamRoleModule'", - "source": "CFN_LINT", - "entity": { - "logicalId": "IamRoleModule", - "entityType": "Resource", - "resourceType": "Some::IAM::Role::MODULE" - }, - "propertyPath": "Properties.Tags", - "category": "Structure", - "startLine": 5, - "startColumn": 7, - "endLine": 5, - "endColumn": 11, - "ruleDescription": "Check that Modules resources are valid", - "phase": "LINT" - } - ] - }, - "bad/modules/bad_has_update_policy.yaml": { - "filePath": "bad/modules/bad_has_update_policy.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 2, - "warnings": 0, - "informational": 0, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "E3016", - "severity": "ERROR", - "message": "UpdatePolicy is not supported on resource type 'My::Organization::Custom::MODULE'", - "source": "CFN_LINT", - "entity": { - "logicalId": "MyModule", - "entityType": "Resource", - "resourceType": "My::Organization::Custom::MODULE" - }, - "propertyPath": "UpdatePolicy", - "suggestedFix": "Remove UpdatePolicy or change resource type to one of: AWS::AppStream::Fleet, AWS::AutoScaling::AutoScalingGroup, AWS::ElastiCache::ReplicationGroup, AWS::Elasticsearch::Domain, AWS::Lambda::Alias, AWS::OpenSearchService::Domain", - "category": "Resource", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 17, - "ruleDescription": "Check UpdatePolicy values for Resources", - "phase": "LINT" - }, - { - "ruleId": "E5001", - "severity": "ERROR", - "message": "UpdatePolicy is not permitted within Module resource 'MyModule'", - "source": "CFN_LINT", - "entity": { - "logicalId": "MyModule", - "entityType": "Resource", - "resourceType": "My::Organization::Custom::MODULE" - }, - "propertyPath": "UpdatePolicy", - "category": "Structure", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 17, - "ruleDescription": "Check that Modules resources are valid", - "phase": "LINT" - } - ] - }, - "bad/modules/bad_uses_module_metadata.yaml": { - "filePath": "bad/modules/bad_uses_module_metadata.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 0, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [] - }, - "bad/noecho.yaml": { - "filePath": "bad/noecho.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 2, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 2, - "informational": 2, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ + "lifecycle": "conditional-create-only" + } + }, { - "ruleId": "W2010", - "severity": "WARN", - "message": "Don't use 'NoEcho' parameter 'NoEchoParam' in resource metadata", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "SNSTopicWithSecretNameInRef", + "logicalId": "Resource259", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.NoEchoParamInMetadata", - "suggestedFix": "Move the parameter reference out of Metadata or remove NoEcho", - "category": "Security", - "startLine": 13, + "propertyPath": "Properties.UserData", + "category": "Best Practice", + "startLine": 25633, "startColumn": 7, - "endLine": 13, - "endColumn": 28, - "ruleDescription": "NoEcho parameters are not masked when used in Metadata and Outputs", - "phase": "LINT" + "endLine": 25633, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "W2010", - "severity": "WARN", - "message": "Don't use 'NoEcho' parameter 'NoEchoParam' in resource metadata", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "SNSTopicWithSecretNameInSub", + "logicalId": "Resource260", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Metadata.NoEchoParamInMetadata", - "suggestedFix": "Move the parameter reference out of Metadata or remove NoEcho", - "category": "Security", - "startLine": 19, + "propertyPath": "Properties.ImageId", + "category": "Best Practice", + "startLine": 25730, "startColumn": 7, - "endLine": 19, - "endColumn": 28, - "ruleDescription": "NoEcho parameters are not masked when used in Metadata and Outputs", - "phase": "LINT" + "endLine": 25730, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'SNSTopicWithSecretNameInRef' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SNSTopicWithSecretNameInRef", + "logicalId": "Resource260", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 10, - "startColumn": 5, - "endLine": 10, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 25731, + "startColumn": 7, + "endLine": 25731, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'SNSTopicWithSecretNameInSub' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SNSTopicWithSecretNameInSub", + "logicalId": "Resource260", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 16, - "startColumn": 5, - "endLine": 16, + "startLine": 25732, + "startColumn": 7, + "endLine": 25732, "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "bad/not_cloudformation.yaml": { - "filePath": "bad/not_cloudformation.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 0, - "counts": { - "fatal": 2, - "errors": 0, - "warnings": 0, - "informational": 0, - "debug": 0 + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "F0001", - "severity": "FATAL", - "message": "Resources section must exist and be non-empty", - "source": "SCHEMA", - "category": "Structure", - "ruleDescription": "Resources section must exist and be non-empty", - "phase": "SCHEMA" + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "Resource261", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Properties.ImageId", + "category": "Best Practice", + "startLine": 25829, + "startColumn": 7, + "endLine": 25829, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "F0005", - "severity": "FATAL", - "message": "'NotEven' is not a valid top-level template section", - "source": "SCHEMA", - "propertyPath": "NotEven", - "category": "Structure", - "startLine": 2, - "startColumn": 1, - "endLine": 2, - "endColumn": 8, - "ruleDescription": "Top-level keys must be valid section names", - "phase": "SCHEMA" - } - ] - }, - "bad/opensearch_instance_type.yaml": { - "filePath": "bad/opensearch_instance_type.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 2, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 0, - "informational": 7, - "debug": 0 + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "Resource261", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Properties.InstanceType", + "category": "Best Practice", + "startLine": 25830, + "startColumn": 7, + "endLine": 25830, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "E3653", - "severity": "ERROR", - "message": "'fake.invalid.search' is not valid in any region", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "BadDomain", + "logicalId": "Resource261", "entityType": "Resource", - "resourceType": "AWS::OpenSearchService::Domain" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.ClusterConfig.InstanceType", - "category": "Resource", - "startLine": 8, - "startColumn": 9, - "endLine": 8, - "endColumn": 21, - "ruleDescription": "Validate OpenSearch domain cluster instance type", - "phase": "LINT" + "propertyPath": "Properties.UserData", + "category": "Best Practice", + "startLine": 25831, + "startColumn": 7, + "endLine": 25831, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "BadDomain", + "logicalId": "Resource262", "entityType": "Resource", - "resourceType": "AWS::OpenSearchService::Domain" + "resourceType": "AWS::EC2::Instance" }, + "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 4, - "startColumn": 3, - "endLine": 4, - "endColumn": 12, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 25928, + "startColumn": 7, + "endLine": 25928, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "BadDomain", + "logicalId": "Resource262", "entityType": "Resource", - "resourceType": "AWS::OpenSearchService::Domain" + "resourceType": "AWS::EC2::Instance" }, + "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 4, - "startColumn": 3, - "endLine": 4, - "endColumn": 12, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 25929, + "startColumn": 7, + "endLine": 25929, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ValidDomain", + "logicalId": "Resource262", "entityType": "Resource", - "resourceType": "AWS::OpenSearchService::Domain" + "resourceType": "AWS::EC2::Instance" }, + "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 9, - "startColumn": 3, - "endLine": 9, - "endColumn": 14, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 25930, + "startColumn": 7, + "endLine": 25930, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ValidDomain", + "logicalId": "Resource263", "entityType": "Resource", - "resourceType": "AWS::OpenSearchService::Domain" + "resourceType": "AWS::EC2::Instance" }, + "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 9, - "startColumn": 3, - "endLine": 9, + "startLine": 26027, + "startColumn": 7, + "endLine": 26027, "endColumn": 14, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9003", + "ruleId": "I9001", "severity": "INFO", - "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", + "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", + "entity": { + "logicalId": "Resource263", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", - "phase": "LINT" + "startLine": 26028, + "startColumn": 7, + "endLine": 26028, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'BadDomain' of type 'AWS::OpenSearchService::Domain' supports Tags but none are configured", + "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "BadDomain", + "logicalId": "Resource263", "entityType": "Resource", - "resourceType": "AWS::OpenSearchService::Domain" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 6, - "startColumn": 5, - "endLine": 6, + "startLine": 26029, + "startColumn": 7, + "endLine": 26029, "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'ValidDomain' of type 'AWS::OpenSearchService::Domain' supports Tags but none are configured", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ValidDomain", + "logicalId": "Resource264", "entityType": "Resource", - "resourceType": "AWS::OpenSearchService::Domain" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 11, - "startColumn": 5, - "endLine": 11, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "bad/output_invalid_references.yaml": { - "filePath": "bad/output_invalid_references.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 2, - "errors": 0, - "warnings": 0, - "informational": 1, - "debug": 0 + "startLine": 26126, + "startColumn": 7, + "endLine": 26126, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "F6101", - "severity": "FATAL", - "message": "'NotARealAttribute' is not one of ['Arn', 'DomainName', 'DualStackDomainName', 'MetadataConfiguration.AnnotationTableConfiguration.TableArn', 'MetadataConfiguration.AnnotationTableConfiguration.TableName', 'MetadataConfiguration.Destination', 'MetadataConfiguration.InventoryTableConfiguration.TableArn', 'MetadataConfiguration.InventoryTableConfiguration.TableName', 'MetadataConfiguration.JournalTableConfiguration.TableArn', 'MetadataConfiguration.JournalTableConfiguration.TableName', 'MetadataTableConfiguration.S3TablesDestination.TableArn', 'MetadataTableConfiguration.S3TablesDestination.TableNamespace', 'RegionalDomainName', 'WebsiteURL']", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "InvalidAttribute", - "entityType": "Output" + "logicalId": "Resource264", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Outputs/InvalidAttribute/Value.Fn::GetAtt.1", - "category": "Structure", - "startLine": 6, - "startColumn": 3, - "endLine": 6, + "propertyPath": "Properties.InstanceType", + "category": "Best Practice", + "startLine": 26127, + "startColumn": 7, + "endLine": 26127, "endColumn": 19, - "ruleDescription": "Output value must be a string", - "phase": "SCHEMA" + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "F6101", - "severity": "FATAL", - "message": "Fn::Sub variable '${MissingTarget}' does not reference a valid resource, parameter, or pseudo-parameter", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "UnresolvedSubVariable", - "entityType": "Output" + "logicalId": "Resource264", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Outputs/UnresolvedSubVariable/Value.Fn::Sub", - "category": "Structure", - "startLine": 8, - "startColumn": 3, - "endLine": 8, - "endColumn": 24, - "ruleDescription": "Output value must be a string", - "phase": "SCHEMA" + "propertyPath": "Properties.UserData", + "category": "Best Practice", + "startLine": 26128, + "startColumn": 7, + "endLine": 26128, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Bucket", + "logicalId": "Resource265", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 9, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "bad/output_invalid_targets.yaml": { - "filePath": "bad/output_invalid_targets.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 5, - "errors": 0, - "warnings": 0, - "informational": 1, - "debug": 0 + "startLine": 26225, + "startColumn": 7, + "endLine": 26225, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "F6101", - "severity": "FATAL", - "message": "Ref 'DoesNotExist' does not reference a valid resource, parameter, or pseudo-parameter", - "source": "SCHEMA", - "propertyPath": "Outputs.MissingRef.Value.Ref", - "category": "Structure", - "startLine": 5, - "startColumn": 16, - "endLine": 5, - "endColumn": 21, - "ruleDescription": "Output value must be a string", - "phase": "PARSE" + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "Resource265", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Properties.InstanceType", + "category": "Best Practice", + "startLine": 26226, + "startColumn": 7, + "endLine": 26226, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "F6101", - "severity": "FATAL", - "message": "GetAtt 'DoesNotExist.Arn' references a resource that does not exist", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "MissingGetAtt", - "entityType": "Output" + "logicalId": "Resource265", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Outputs/MissingGetAtt/Value.Fn::GetAtt.0", - "category": "Structure", - "startLine": 6, - "startColumn": 3, - "endLine": 6, - "endColumn": 16, - "ruleDescription": "Output value must be a string", - "phase": "SCHEMA" + "propertyPath": "Properties.UserData", + "category": "Best Practice", + "startLine": 26227, + "startColumn": 7, + "endLine": 26227, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "F6101", - "severity": "FATAL", - "message": "Fn::Sub variable '${DoesNotExist}' does not reference a valid resource, parameter, or pseudo-parameter", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "MissingSubRef", - "entityType": "Output" + "logicalId": "Resource266", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Outputs/MissingSubRef/Value.Fn::Sub", - "category": "Structure", - "startLine": 7, - "startColumn": 3, - "endLine": 7, - "endColumn": 16, - "ruleDescription": "Output value must be a string", - "phase": "SCHEMA" + "propertyPath": "Properties.ImageId", + "category": "Best Practice", + "startLine": 26324, + "startColumn": 7, + "endLine": 26324, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "F6101", - "severity": "FATAL", - "message": "Fn::Sub variable '${DoesNotExist.Arn}' does not reference a valid resource, parameter, or pseudo-parameter", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "MissingSubGetAtt", - "entityType": "Output" + "logicalId": "Resource266", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Outputs/MissingSubGetAtt/Value.Fn::Sub", - "category": "Structure", - "startLine": 8, - "startColumn": 3, - "endLine": 8, + "propertyPath": "Properties.InstanceType", + "category": "Best Practice", + "startLine": 26325, + "startColumn": 7, + "endLine": 26325, "endColumn": 19, - "ruleDescription": "Output value must be a string", - "phase": "SCHEMA" + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "F6101", - "severity": "FATAL", - "message": "'DoesNotExist' is not one of ['Arn', 'DomainName', 'DualStackDomainName', 'MetadataConfiguration.AnnotationTableConfiguration.TableArn', 'MetadataConfiguration.AnnotationTableConfiguration.TableName', 'MetadataConfiguration.Destination', 'MetadataConfiguration.InventoryTableConfiguration.TableArn', 'MetadataConfiguration.InventoryTableConfiguration.TableName', 'MetadataConfiguration.JournalTableConfiguration.TableArn', 'MetadataConfiguration.JournalTableConfiguration.TableName', 'MetadataTableConfiguration.S3TablesDestination.TableArn', 'MetadataTableConfiguration.S3TablesDestination.TableNamespace', 'RegionalDomainName', 'WebsiteURL']", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "InvalidExistingAttribute", - "entityType": "Output" + "logicalId": "Resource266", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Outputs/InvalidExistingAttribute/Value.Fn::GetAtt.1", - "category": "Structure", - "startLine": 9, - "startColumn": 3, - "endLine": 9, - "endColumn": 27, - "ruleDescription": "Output value must be a string", - "phase": "SCHEMA" + "propertyPath": "Properties.UserData", + "category": "Best Practice", + "startLine": 26326, + "startColumn": 7, + "endLine": 26326, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Bucket", + "logicalId": "Resource267", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 9, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "bad/output_value_not_string.yaml": { - "filePath": "bad/output_value_not_string.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 7, - "errors": 0, - "warnings": 0, - "informational": 4, - "debug": 0 + "startLine": 26423, + "startColumn": 7, + "endLine": 26423, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "F6101", - "severity": "FATAL", - "message": "Output 'ValueIsList' value must be a string, not a list", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ValueIsList", - "entityType": "Output" + "logicalId": "Resource267", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Outputs/ValueIsList/Value", - "category": "Structure", - "startLine": 17, - "startColumn": 5, - "endLine": 17, - "endColumn": 10, - "ruleDescription": "Output value must be a string", - "phase": "PARSE" + "propertyPath": "Properties.InstanceType", + "category": "Best Practice", + "startLine": 26424, + "startColumn": 7, + "endLine": 26424, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "F6101", - "severity": "FATAL", - "message": "Output 'ValueIsObject' value must be a string, not an object", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ValueIsObject", - "entityType": "Output" + "logicalId": "Resource267", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Outputs/ValueIsObject/Value", - "category": "Structure", - "startLine": 21, - "startColumn": 5, - "endLine": 21, - "endColumn": 10, - "ruleDescription": "Output value must be a string", - "phase": "PARSE" + "propertyPath": "Properties.UserData", + "category": "Best Practice", + "startLine": 26425, + "startColumn": 7, + "endLine": 26425, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "F6101", - "severity": "FATAL", - "message": "Output 'ValueIsGetAZs' value must be a string, not a list", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ValueIsGetAZs", - "entityType": "Output" + "logicalId": "Resource268", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Outputs/ValueIsGetAZs/Value", - "category": "Structure", - "startLine": 24, - "startColumn": 5, - "endLine": 24, - "endColumn": 10, - "ruleDescription": "Output value must be a string", - "phase": "PARSE" + "propertyPath": "Properties.ImageId", + "category": "Best Practice", + "startLine": 26522, + "startColumn": 7, + "endLine": 26522, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "F6101", - "severity": "FATAL", - "message": "Output 'ValueIsSplit' value must be a string, not a list", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ValueIsSplit", - "entityType": "Output" + "logicalId": "Resource268", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Outputs/ValueIsSplit/Value", - "category": "Structure", - "startLine": 26, - "startColumn": 5, - "endLine": 26, - "endColumn": 10, - "ruleDescription": "Output value must be a string", - "phase": "PARSE" + "propertyPath": "Properties.InstanceType", + "category": "Best Practice", + "startLine": 26523, + "startColumn": 7, + "endLine": 26523, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "F6101", - "severity": "FATAL", - "message": "Output 'ValueIsCidr' value must be a string, not a list", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ValueIsCidr", - "entityType": "Output" + "logicalId": "Resource268", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Outputs/ValueIsCidr/Value", - "category": "Structure", - "startLine": 28, - "startColumn": 5, - "endLine": 28, - "endColumn": 10, - "ruleDescription": "Output value must be a string", - "phase": "PARSE" + "propertyPath": "Properties.UserData", + "category": "Best Practice", + "startLine": 26524, + "startColumn": 7, + "endLine": 26524, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "F6101", - "severity": "FATAL", - "message": "Output 'ConditionalListBranch' value must be a string, not a list", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ConditionalListBranch", - "entityType": "Output" + "logicalId": "Resource269", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Outputs/ConditionalListBranch/Value/Fn::If/1", - "category": "Structure", - "startLine": 30, - "startColumn": 25, - "endLine": 30, - "endColumn": 26, - "ruleDescription": "Output value must be a string", - "phase": "PARSE" + "propertyPath": "Properties.ImageId", + "category": "Best Practice", + "startLine": 26621, + "startColumn": 7, + "endLine": 26621, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "F6101", - "severity": "FATAL", - "message": "Output 'ConditionalListBranch' value must be a string, not a list", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ConditionalListBranch", - "entityType": "Output" + "logicalId": "Resource269", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Outputs/ConditionalListBranch/Value/Fn::If/2", - "category": "Structure", - "startLine": 30, - "startColumn": 35, - "endLine": 30, - "endColumn": 36, - "ruleDescription": "Output value must be a string", - "phase": "PARSE" + "propertyPath": "Properties.InstanceType", + "category": "Best Practice", + "startLine": 26622, + "startColumn": 7, + "endLine": 26622, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Queue", + "logicalId": "Resource269", "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" + "resourceType": "AWS::EC2::Instance" }, + "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 13, - "startColumn": 3, - "endLine": 13, - "endColumn": 8, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 26623, + "startColumn": 7, + "endLine": 26623, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Queue", + "logicalId": "Resource270", "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" + "resourceType": "AWS::EC2::Instance" }, + "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 13, - "startColumn": 3, - "endLine": 13, - "endColumn": 8, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 26720, + "startColumn": 7, + "endLine": 26720, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3013", + "ruleId": "I9001", "severity": "INFO", - "message": "'MessageRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", + "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Queue", + "logicalId": "Resource270", "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties", + "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 13, - "startColumn": 3, - "endLine": 13, - "endColumn": 8, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", - "phase": "LINT" + "startLine": 26721, + "startColumn": 7, + "endLine": 26721, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'Queue' of type 'AWS::SQS::Queue' supports Tags but none are configured", + "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Queue", + "logicalId": "Resource270", "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 13, - "startColumn": 3, - "endLine": 13, - "endColumn": 8, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "bad/override/complete.yaml": { - "filePath": "bad/override/complete.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 5, - "counts": { - "fatal": 1, - "errors": 1, - "warnings": 1, - "informational": 7, - "debug": 0 + "startLine": 26722, + "startColumn": 7, + "endLine": 26722, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "F3003", - "severity": "FATAL", - "message": "'SpotFleetRequestConfigData' is a required property", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "mySpotFleet", + "logicalId": "Resource271", "entityType": "Resource", - "resourceType": "AWS::EC2::SpotFleet" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties", - "suggestedFix": "Add the required property 'SpotFleetRequestConfigData'", - "category": "Schema", - "startLine": 20, - "startColumn": 3, - "endLine": 20, + "propertyPath": "Properties.ImageId", + "category": "Best Practice", + "startLine": 26819, + "startColumn": 7, + "endLine": 26819, "endColumn": 14, - "ruleDescription": "Required property missing", - "phase": "SCHEMA" + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-123456' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "untaggedInstance", + "logicalId": "Resource271", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 14, + "propertyPath": "Properties.InstanceType", + "category": "Best Practice", + "startLine": 26820, "startColumn": 7, - "endLine": 14, - "endColumn": 14, + "endLine": 26820, + "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "actualValue": "ami-123456" + "lifecycle": "conditional-create-only" } }, { - "ruleId": "W3045", - "severity": "WARN", - "message": "AccessControl property is deprecated. Use bucket policies instead", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "myS3Bucket", + "logicalId": "Resource271", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.AccessControl", - "suggestedFix": "Remove AccessControl and use an AWS::S3::BucketPolicy resource", - "category": "Deprecation", - "startLine": 10, + "propertyPath": "Properties.UserData", + "category": "Best Practice", + "startLine": 26821, "startColumn": 7, - "endLine": 10, - "endColumn": 20, - "ruleDescription": "Controlling access to an S3 bucket should be done with bucket policies", - "phase": "LINT", + "endLine": 26821, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", "context": { - "actualValue": "Private" + "lifecycle": "conditional-create-only" } }, { @@ -71663,15 +69904,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "untaggedInstance", + "logicalId": "Resource272", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 14, + "startLine": 26918, "startColumn": 7, - "endLine": 14, + "endLine": 26918, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -71683,277 +69924,273 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "VPC", + "logicalId": "Resource272", "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 18, - "startColumn": 9, - "endLine": 18, - "endColumn": 18, + "startLine": 26919, + "startColumn": 7, + "endLine": 26919, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'myS3Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "myS3Bucket", + "logicalId": "Resource272", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 8, - "startColumn": 5, - "endLine": 8, + "startLine": 26920, + "startColumn": 7, + "endLine": 26920, "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'untaggedInstance' of type 'AWS::EC2::Instance' supports Tags but none are configured", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "untaggedInstance", + "logicalId": "Resource273", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 13, - "startColumn": 5, - "endLine": 13, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 27017, + "startColumn": 7, + "endLine": 27017, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'VPC' of type 'AWS::EC2::VPC' supports Tags but none are configured", + "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "VPC", + "logicalId": "Resource273", "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 17, + "startLine": 27018, "startColumn": 7, - "endLine": 17, - "endColumn": 17, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "endLine": 27018, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'mySpotFleet' of type 'AWS::EC2::SpotFleet' supports Tags but none are configured", + "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "mySpotFleet", + "logicalId": "Resource273", "entityType": "Resource", - "resourceType": "AWS::EC2::SpotFleet" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 20, - "startColumn": 3, - "endLine": 20, - "endColumn": 14, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 27019, + "startColumn": 7, + "endLine": 27019, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'mySnsTopic' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "mySnsTopic", + "logicalId": "Resource274", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 23, - "startColumn": 3, - "endLine": 23, - "endColumn": 13, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "bad/override/exclude.yaml": { - "filePath": "bad/override/exclude.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 3, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 3, - "debug": 0 + "startLine": 27116, + "startColumn": 7, + "endLine": 27116, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'myGameLift' of type 'AWS::GameLift::Alias' supports Tags but none are configured", + "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "myGameLift", + "logicalId": "Resource274", "entityType": "Resource", - "resourceType": "AWS::GameLift::Alias" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 8, - "startColumn": 5, - "endLine": 8, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 27117, + "startColumn": 7, + "endLine": 27117, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'myS3Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "myS3Bucket", + "logicalId": "Resource274", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 14, - "startColumn": 3, - "endLine": 14, - "endColumn": 13, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 27118, + "startColumn": 7, + "endLine": 27118, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'mySnsTopic' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "mySnsTopic", + "logicalId": "Resource275", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 16, - "startColumn": 3, - "endLine": 16, - "endColumn": 13, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "bad/override/include.yaml": { - "filePath": "bad/override/include.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 4, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 2, - "informational": 6, - "debug": 0 + "startLine": 27215, + "startColumn": 7, + "endLine": 27215, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "W2511", - "severity": "WARN", - "message": "IAM Policy Version should be updated to '2012-10-17'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "myS3BucketPolicy", + "logicalId": "Resource275", "entityType": "Resource", - "resourceType": "AWS::S3::BucketPolicy" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.PolicyDocument.Version", - "suggestedFix": "Update the policy document Version to '2012-10-17'", - "category": "Security", - "startLine": 20, - "startColumn": 9, - "endLine": 20, - "endColumn": 16, - "ruleDescription": "Check IAM Resource Policies syntax", - "phase": "LINT" + "propertyPath": "Properties.InstanceType", + "category": "Best Practice", + "startLine": 27216, + "startColumn": 7, + "endLine": 27216, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "W3011", - "severity": "WARN", - "message": "Both 'UpdateReplacePolicy' and 'DeletionPolicy' are needed to protect resource from deletion", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "myS3BucketPolicy", + "logicalId": "Resource275", "entityType": "Resource", - "resourceType": "AWS::S3::BucketPolicy" + "resourceType": "AWS::EC2::Instance" }, + "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 13, - "startColumn": 3, - "endLine": 13, - "endColumn": 19, - "ruleDescription": "Check resources with UpdateReplacePolicy/DeletionPolicy have both", - "phase": "LINT" + "startLine": 27217, + "startColumn": 7, + "endLine": 27217, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "myVpc1", + "logicalId": "Resource276", "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 9, + "startLine": 27314, "startColumn": 7, - "endLine": 9, - "endColumn": 16, + "endLine": 27314, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -71963,19 +70200,20 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'InstanceTenancy' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "myVpc1", + "logicalId": "Resource276", "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.InstanceTenancy", + "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 10, + "startLine": 27315, "startColumn": 7, - "endLine": 10, - "endColumn": 22, + "endLine": 27315, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -71985,1391 +70223,1633 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Bucket' is create-only; updating it will cause resource replacement", + "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "myS3BucketPolicy", + "logicalId": "Resource276", "entityType": "Resource", - "resourceType": "AWS::S3::BucketPolicy" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Bucket", + "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 17, + "startLine": 27316, "startColumn": 7, - "endLine": 17, - "endColumn": 13, + "endLine": 27316, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'myS3Bucket'" + "lifecycle": "conditional-create-only" } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'myVpc1' of type 'AWS::EC2::VPC' supports Tags but none are configured", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "myVpc1", + "logicalId": "Resource277", "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 8, - "startColumn": 5, - "endLine": 8, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 27413, + "startColumn": 7, + "endLine": 27413, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'myS3Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "myS3Bucket", + "logicalId": "Resource277", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 11, - "startColumn": 3, - "endLine": 11, - "endColumn": 13, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 27414, + "startColumn": 7, + "endLine": 27414, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'mySnsTopic' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "mySnsTopic", + "logicalId": "Resource277", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 27, - "startColumn": 3, - "endLine": 27, - "endColumn": 13, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "bad/override/required.yaml": { - "filePath": "bad/override/required.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 1, - "informational": 1, - "debug": 0 + "startLine": 27415, + "startColumn": 7, + "endLine": 27415, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "W3045", - "severity": "WARN", - "message": "AccessControl property is deprecated. Use bucket policies instead", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "myS3Bucket", + "logicalId": "Resource278", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.AccessControl", - "suggestedFix": "Remove AccessControl and use an AWS::S3::BucketPolicy resource", - "category": "Deprecation", - "startLine": 10, + "propertyPath": "Properties.ImageId", + "category": "Best Practice", + "startLine": 27512, "startColumn": 7, - "endLine": 10, - "endColumn": 20, - "ruleDescription": "Controlling access to an S3 bucket should be done with bucket policies", - "phase": "LINT", + "endLine": 27512, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", "context": { - "actualValue": "Private" + "lifecycle": "create-only" } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'myS3Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "myS3Bucket", + "logicalId": "Resource278", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 8, - "startColumn": 5, - "endLine": 8, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "bad/param_constraints.yaml": { - "filePath": "bad/param_constraints.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 5, - "errors": 0, - "warnings": 5, - "informational": 1, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "F2015", - "severity": "FATAL", - "message": "Parameter 'PatternParam' Default '123-bad' does not match AllowedPattern '^[a-z]+$'", - "source": "SCHEMA", - "entity": { - "logicalId": "PatternParam", - "entityType": "Parameter" - }, - "propertyPath": "Parameters/PatternParam/Default", - "category": "Parameter", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 12, - "ruleDescription": "Default value is within parameter constraints", - "phase": "SCHEMA" + "startLine": 27513, + "startColumn": 7, + "endLine": 27513, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "F2015", - "severity": "FATAL", - "message": "Parameter 'ShortParam' Default length 2 is less than MinLength 5", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ShortParam", - "entityType": "Parameter" + "logicalId": "Resource278", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Parameters/ShortParam/Default", - "category": "Parameter", - "startLine": 9, - "startColumn": 5, - "endLine": 9, - "endColumn": 12, - "ruleDescription": "Default value is within parameter constraints", - "phase": "SCHEMA" + "propertyPath": "Properties.UserData", + "category": "Best Practice", + "startLine": 27514, + "startColumn": 7, + "endLine": 27514, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "F2015", - "severity": "FATAL", - "message": "Parameter 'LongParam' Default length 34 exceeds MaxLength 10", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "LongParam", - "entityType": "Parameter" + "logicalId": "Resource279", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Parameters/LongParam/Default", - "category": "Parameter", - "startLine": 13, - "startColumn": 5, - "endLine": 13, - "endColumn": 12, - "ruleDescription": "Default value is within parameter constraints", - "phase": "SCHEMA" + "propertyPath": "Properties.ImageId", + "category": "Best Practice", + "startLine": 27611, + "startColumn": 7, + "endLine": 27611, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "F2015", - "severity": "FATAL", - "message": "Parameter 'SmallNumber' Default 3 is less than MinValue 10", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "SmallNumber", - "entityType": "Parameter" + "logicalId": "Resource279", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Parameters/SmallNumber/Default", - "category": "Parameter", - "startLine": 17, - "startColumn": 5, - "endLine": 17, - "endColumn": 12, - "ruleDescription": "Default value is within parameter constraints", - "phase": "SCHEMA" + "propertyPath": "Properties.InstanceType", + "category": "Best Practice", + "startLine": 27612, + "startColumn": 7, + "endLine": 27612, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "F2015", - "severity": "FATAL", - "message": "Parameter 'BigNumber' Default 200 exceeds MaxValue 100", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "BigNumber", - "entityType": "Parameter" + "logicalId": "Resource279", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Parameters/BigNumber/Default", - "category": "Parameter", - "startLine": 21, - "startColumn": 5, - "endLine": 21, - "endColumn": 12, - "ruleDescription": "Default value is within parameter constraints", - "phase": "SCHEMA" + "propertyPath": "Properties.UserData", + "category": "Best Practice", + "startLine": 27613, + "startColumn": 7, + "endLine": 27613, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'PatternParam' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "PatternParam", - "entityType": "Parameter" + "logicalId": "Resource280", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Parameters/PatternParam", + "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 15, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "startLine": 27710, + "startColumn": 7, + "endLine": 27710, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'ShortParam' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ShortParam", - "entityType": "Parameter" + "logicalId": "Resource280", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Parameters/ShortParam", + "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 7, - "startColumn": 3, - "endLine": 7, - "endColumn": 13, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "startLine": 27711, + "startColumn": 7, + "endLine": 27711, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'LongParam' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "LongParam", - "entityType": "Parameter" + "logicalId": "Resource280", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Parameters/LongParam", + "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 11, - "startColumn": 3, - "endLine": 11, - "endColumn": 12, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "startLine": 27712, + "startColumn": 7, + "endLine": 27712, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'SmallNumber' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "SmallNumber", - "entityType": "Parameter" + "logicalId": "Resource281", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Parameters/SmallNumber", + "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 15, - "startColumn": 3, - "endLine": 15, + "startLine": 27809, + "startColumn": 7, + "endLine": 27809, "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'BigNumber' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "BigNumber", - "entityType": "Parameter" + "logicalId": "Resource281", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Parameters/BigNumber", + "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 19, - "startColumn": 3, - "endLine": 19, - "endColumn": 12, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "startLine": 27810, + "startColumn": 7, + "endLine": 27810, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Bucket", + "logicalId": "Resource281", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 24, - "startColumn": 3, - "endLine": 24, - "endColumn": 9, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "bad/param_number_default.yaml": { - "filePath": "bad/param_number_default.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 4, - "errors": 0, - "warnings": 1, - "informational": 0, - "debug": 0 + "startLine": 27811, + "startColumn": 7, + "endLine": 27811, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "F0015", - "severity": "FATAL", - "message": "Parameter 'Port' Default 'not-a-number' is not a valid number", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Port", - "entityType": "Parameter" + "logicalId": "Resource282", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Parameters/Port/Default", - "category": "Parameter", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 12, - "ruleDescription": "Default value must match parameter Type", - "phase": "SCHEMA" + "propertyPath": "Properties.ImageId", + "category": "Best Practice", + "startLine": 27908, + "startColumn": 7, + "endLine": 27908, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "F0016", - "severity": "FATAL", - "message": "Parameter 'Port' AllowedValues entry 'abc' is not a valid number", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Port", - "entityType": "Parameter" + "logicalId": "Resource282", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Parameters/Port/AllowedValues", - "category": "Parameter", - "startLine": 6, - "startColumn": 5, - "endLine": 6, - "endColumn": 18, - "ruleDescription": "AllowedValues entries must match parameter Type", - "phase": "SCHEMA" + "propertyPath": "Properties.InstanceType", + "category": "Best Practice", + "startLine": 27909, + "startColumn": 7, + "endLine": 27909, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "F0016", - "severity": "FATAL", - "message": "Parameter 'Port' AllowedValues entry 'def' is not a valid number", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Port", - "entityType": "Parameter" + "logicalId": "Resource282", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Parameters/Port/AllowedValues", - "category": "Parameter", - "startLine": 6, - "startColumn": 5, - "endLine": 6, - "endColumn": 18, - "ruleDescription": "AllowedValues entries must match parameter Type", - "phase": "SCHEMA" + "propertyPath": "Properties.UserData", + "category": "Best Practice", + "startLine": 27910, + "startColumn": 7, + "endLine": 27910, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "F2012", - "severity": "FATAL", - "message": "Parameter 'Port' Default 'not-a-number' is not in AllowedValues ['abc', 'def']", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Port", - "entityType": "Parameter" + "logicalId": "Resource283", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Parameters/Port/Default", - "category": "Parameter", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 12, - "ruleDescription": "Parameter Default must be in AllowedValues", - "phase": "SCHEMA" + "propertyPath": "Properties.ImageId", + "category": "Best Practice", + "startLine": 28007, + "startColumn": 7, + "endLine": 28007, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Port' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Port", - "entityType": "Parameter" + "logicalId": "Resource283", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Parameters/Port", + "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 7, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" - } - ] - }, - "bad/parameters/F2012_cdl_default_split.yaml": { - "filePath": "bad/parameters/F2012_cdl_default_split.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 8, - "errors": 0, - "warnings": 5, - "informational": 0, - "debug": 0 + "startLine": 28008, + "startColumn": 7, + "endLine": 28008, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "F2012", - "severity": "FATAL", - "message": "Parameter 'CDLSingleElementNotAllowed' Default 'three' is not in AllowedValues ['one', 'two']", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "CDLSingleElementNotAllowed", - "entityType": "Parameter" + "logicalId": "Resource283", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Parameters/CDLSingleElementNotAllowed/Default", - "category": "Parameter", - "startLine": 7, - "startColumn": 5, - "endLine": 7, - "endColumn": 12, - "ruleDescription": "Parameter Default must be in AllowedValues", - "phase": "SCHEMA" + "propertyPath": "Properties.UserData", + "category": "Best Practice", + "startLine": 28009, + "startColumn": 7, + "endLine": 28009, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "F2012", - "severity": "FATAL", - "message": "Parameter 'CDLMultipleElementsNotAllowed' Default 'four' is not in AllowedValues ['one', 'two']", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "CDLMultipleElementsNotAllowed", - "entityType": "Parameter" + "logicalId": "Resource284", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Parameters/CDLMultipleElementsNotAllowed/Default", - "category": "Parameter", - "startLine": 13, - "startColumn": 5, - "endLine": 13, - "endColumn": 12, - "ruleDescription": "Parameter Default must be in AllowedValues", - "phase": "SCHEMA" + "propertyPath": "Properties.ImageId", + "category": "Best Practice", + "startLine": 28106, + "startColumn": 7, + "endLine": 28106, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "F2012", - "severity": "FATAL", - "message": "Parameter 'CDLMultipleElementsNotAllowed' Default 'three' is not in AllowedValues ['one', 'two']", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "CDLMultipleElementsNotAllowed", - "entityType": "Parameter" + "logicalId": "Resource284", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Parameters/CDLMultipleElementsNotAllowed/Default", - "category": "Parameter", - "startLine": 13, - "startColumn": 5, - "endLine": 13, - "endColumn": 12, - "ruleDescription": "Parameter Default must be in AllowedValues", - "phase": "SCHEMA" + "propertyPath": "Properties.InstanceType", + "category": "Best Practice", + "startLine": 28107, + "startColumn": 7, + "endLine": 28107, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "F2012", - "severity": "FATAL", - "message": "Parameter 'CDLCommaInAllowedValueDoesNotMatchSplit' Default 'four' is not in AllowedValues ['one', 'two', 'three,four']", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "CDLCommaInAllowedValueDoesNotMatchSplit", - "entityType": "Parameter" + "logicalId": "Resource284", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Parameters/CDLCommaInAllowedValueDoesNotMatchSplit/Default", - "category": "Parameter", - "startLine": 20, - "startColumn": 5, - "endLine": 20, - "endColumn": 12, - "ruleDescription": "Parameter Default must be in AllowedValues", - "phase": "SCHEMA" + "propertyPath": "Properties.UserData", + "category": "Best Practice", + "startLine": 28108, + "startColumn": 7, + "endLine": 28108, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "F2012", - "severity": "FATAL", - "message": "Parameter 'CDLCommaInAllowedValueDoesNotMatchSplit' Default 'three' is not in AllowedValues ['one', 'two', 'three,four']", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "CDLCommaInAllowedValueDoesNotMatchSplit", - "entityType": "Parameter" + "logicalId": "Resource285", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Parameters/CDLCommaInAllowedValueDoesNotMatchSplit/Default", - "category": "Parameter", - "startLine": 20, - "startColumn": 5, - "endLine": 20, - "endColumn": 12, - "ruleDescription": "Parameter Default must be in AllowedValues", - "phase": "SCHEMA" + "propertyPath": "Properties.ImageId", + "category": "Best Practice", + "startLine": 28205, + "startColumn": 7, + "endLine": 28205, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "F2012", - "severity": "FATAL", - "message": "Parameter 'CDLWhitespaceTrimsToInvalid' Default 'bad' is not in AllowedValues ['one', 'two']", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "CDLWhitespaceTrimsToInvalid", - "entityType": "Parameter" + "logicalId": "Resource285", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Parameters/CDLWhitespaceTrimsToInvalid/Default", - "category": "Parameter", - "startLine": 28, - "startColumn": 5, - "endLine": 28, - "endColumn": 12, - "ruleDescription": "Parameter Default must be in AllowedValues", - "phase": "SCHEMA" + "propertyPath": "Properties.InstanceType", + "category": "Best Practice", + "startLine": 28206, + "startColumn": 7, + "endLine": 28206, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "F2012", - "severity": "FATAL", - "message": "Parameter 'CDLListStringType' Default 'bad' is not in AllowedValues ['good', 'better']", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "CDLListStringType", - "entityType": "Parameter" + "logicalId": "Resource285", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Parameters/CDLListStringType/Default", - "category": "Parameter", - "startLine": 35, - "startColumn": 5, - "endLine": 35, - "endColumn": 12, - "ruleDescription": "Parameter Default must be in AllowedValues", - "phase": "SCHEMA" + "propertyPath": "Properties.UserData", + "category": "Best Practice", + "startLine": 28207, + "startColumn": 7, + "endLine": 28207, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "F2012", - "severity": "FATAL", - "message": "Parameter 'CDLListStringType' Default 'worse' is not in AllowedValues ['good', 'better']", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "CDLListStringType", - "entityType": "Parameter" + "logicalId": "Resource286", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Parameters/CDLListStringType/Default", - "category": "Parameter", - "startLine": 35, - "startColumn": 5, - "endLine": 35, - "endColumn": 12, - "ruleDescription": "Parameter Default must be in AllowedValues", - "phase": "SCHEMA" + "propertyPath": "Properties.ImageId", + "category": "Best Practice", + "startLine": 28304, + "startColumn": 7, + "endLine": 28304, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'CDLSingleElementNotAllowed' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "CDLSingleElementNotAllowed", - "entityType": "Parameter" + "logicalId": "Resource286", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Parameters/CDLSingleElementNotAllowed", + "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 5, - "startColumn": 3, - "endLine": 5, - "endColumn": 29, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "startLine": 28305, + "startColumn": 7, + "endLine": 28305, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'CDLMultipleElementsNotAllowed' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "CDLMultipleElementsNotAllowed", - "entityType": "Parameter" + "logicalId": "Resource286", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Parameters/CDLMultipleElementsNotAllowed", + "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 11, - "startColumn": 3, - "endLine": 11, - "endColumn": 32, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "startLine": 28306, + "startColumn": 7, + "endLine": 28306, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'CDLCommaInAllowedValueDoesNotMatchSplit' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "CDLCommaInAllowedValueDoesNotMatchSplit", - "entityType": "Parameter" + "logicalId": "Resource287", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Parameters/CDLCommaInAllowedValueDoesNotMatchSplit", + "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 17, - "startColumn": 3, - "endLine": 17, - "endColumn": 42, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "startLine": 28403, + "startColumn": 7, + "endLine": 28403, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'CDLWhitespaceTrimsToInvalid' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "CDLWhitespaceTrimsToInvalid", - "entityType": "Parameter" + "logicalId": "Resource287", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Parameters/CDLWhitespaceTrimsToInvalid", + "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 25, - "startColumn": 3, - "endLine": 25, - "endColumn": 30, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "startLine": 28404, + "startColumn": 7, + "endLine": 28404, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'CDLListStringType' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "CDLListStringType", - "entityType": "Parameter" + "logicalId": "Resource287", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Parameters/CDLListStringType", + "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 32, - "startColumn": 3, - "endLine": 32, - "endColumn": 20, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" - } - ] - }, - "bad/parameters/configuration.yaml": { - "filePath": "bad/parameters/configuration.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 2, - "errors": 14, - "warnings": 16, - "informational": 3, - "debug": 0 + "startLine": 28405, + "startColumn": 7, + "endLine": 28405, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "F2002", - "severity": "FATAL", - "message": "Parameter 'myParameter' has invalid Type 'NotString'", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "myParameter", - "entityType": "Parameter" + "logicalId": "Resource288", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Parameters/myParameter/Type", - "category": "Parameter", - "startLine": 22, - "startColumn": 5, - "endLine": 22, - "endColumn": 9, - "ruleDescription": "Parameter Type must be valid", - "phase": "SCHEMA" + "propertyPath": "Properties.ImageId", + "category": "Best Practice", + "startLine": 28502, + "startColumn": 7, + "endLine": 28502, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "F2002", - "severity": "FATAL", - "message": "Parameter 'mySsmParam' has invalid Type 'AWS::SSM::Parameter::Value'", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "mySsmParam", - "entityType": "Parameter" + "logicalId": "Resource288", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Parameters/mySsmParam/Type", - "category": "Parameter", - "startLine": 30, - "startColumn": 5, - "endLine": 30, - "endColumn": 9, - "ruleDescription": "Parameter Type must be valid", - "phase": "SCHEMA" + "propertyPath": "Properties.InstanceType", + "category": "Best Practice", + "startLine": 28503, + "startColumn": 7, + "endLine": 28503, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "E2001", - "severity": "ERROR", - "message": "Parameter 'allowedValuesNotAList': AllowedValues must be an array", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "allowedValuesNotAList", - "entityType": "Parameter" + "logicalId": "Resource288", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Parameters/allowedValuesNotAList/AllowedValues", - "category": "Parameter", - "startLine": 6, - "startColumn": 5, - "endLine": 6, - "endColumn": 18, - "ruleDescription": "Parameters have appropriate properties", - "phase": "PARSE" + "propertyPath": "Properties.UserData", + "category": "Best Practice", + "startLine": 28504, + "startColumn": 7, + "endLine": 28504, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "E2001", - "severity": "ERROR", - "message": "Parameter 'minValueIsNotNumber': MinValue must be a number", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "minValueIsNotNumber", - "entityType": "Parameter" + "logicalId": "Resource289", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Parameters/minValueIsNotNumber/MinValue", - "category": "Parameter", - "startLine": 13, - "startColumn": 5, - "endLine": 13, - "endColumn": 13, - "ruleDescription": "Parameters have appropriate properties", - "phase": "PARSE" + "propertyPath": "Properties.ImageId", + "category": "Best Practice", + "startLine": 28601, + "startColumn": 7, + "endLine": 28601, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "E2001", - "severity": "ERROR", - "message": "Parameter 'notBooleanEcho': NoEcho must be a boolean", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "notBooleanEcho", - "entityType": "Parameter" + "logicalId": "Resource289", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Parameters/notBooleanEcho/NoEcho", - "category": "Parameter", - "startLine": 19, - "startColumn": 5, - "endLine": 19, - "endColumn": 11, - "ruleDescription": "Parameters have appropriate properties", - "phase": "PARSE" + "propertyPath": "Properties.InstanceType", + "category": "Best Practice", + "startLine": 28602, + "startColumn": 7, + "endLine": 28602, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "E2001", - "severity": "ERROR", - "message": "Parameter 'myInvalidParameter': 'Type' is a required property", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "myInvalidParameter", - "entityType": "Parameter" + "logicalId": "Resource289", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Parameters/myInvalidParameter", - "category": "Parameter", - "startLine": 25, - "startColumn": 3, - "endLine": 25, - "endColumn": 21, - "ruleDescription": "Parameters have appropriate properties", - "phase": "PARSE" + "propertyPath": "Properties.UserData", + "category": "Best Practice", + "startLine": 28603, + "startColumn": 7, + "endLine": 28603, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "E2001", - "severity": "ERROR", - "message": "Parameter 'myInvalidParameter': 'NotType' is not one of ['AllowedPattern', 'AllowedValues', 'ConstraintDescription', 'Default', 'Description', 'MaxLength', 'MinLength', 'MaxValue', 'MinValue', 'NoEcho', 'Type']", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "myInvalidParameter", - "entityType": "Parameter" + "logicalId": "Resource290", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Parameters/myInvalidParameter/NotType", - "category": "Parameter", - "startLine": 27, - "startColumn": 5, - "endLine": 27, - "endColumn": 12, - "ruleDescription": "Parameters have appropriate properties", - "phase": "PARSE" + "propertyPath": "Properties.ImageId", + "category": "Best Practice", + "startLine": 28700, + "startColumn": 7, + "endLine": 28700, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "E2001", - "severity": "ERROR", - "message": "Parameter 'NullParameter': None is not of type 'object'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "NullParameter", - "entityType": "Parameter" + "logicalId": "Resource290", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Parameters/NullParameter", - "category": "Parameter", - "startLine": 34, - "startColumn": 3, - "endLine": 34, - "endColumn": 16, - "ruleDescription": "Parameters have appropriate properties", - "phase": "PARSE" + "propertyPath": "Properties.InstanceType", + "category": "Best Practice", + "startLine": 28701, + "startColumn": 7, + "endLine": 28701, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "E2001", - "severity": "ERROR", - "message": "Parameter 'NullParamType': Type must not be null", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "NullParamType", - "entityType": "Parameter" + "logicalId": "Resource290", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Parameters/NullParamType/Type", - "category": "Parameter", - "startLine": 36, - "startColumn": 5, - "endLine": 36, - "endColumn": 9, - "ruleDescription": "Parameters have appropriate properties", - "phase": "PARSE" + "propertyPath": "Properties.UserData", + "category": "Best Practice", + "startLine": 28702, + "startColumn": 7, + "endLine": 28702, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "E2001", - "severity": "ERROR", - "message": "Parameter 'NullParamDefault': Default must not be null", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "NullParamDefault", - "entityType": "Parameter" + "logicalId": "Resource291", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Parameters/NullParamDefault/Default", - "category": "Parameter", - "startLine": 39, - "startColumn": 5, - "endLine": 39, - "endColumn": 12, - "ruleDescription": "Parameters have appropriate properties", - "phase": "PARSE" + "propertyPath": "Properties.ImageId", + "category": "Best Practice", + "startLine": 28799, + "startColumn": 7, + "endLine": 28799, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, - { - "ruleId": "E2001", - "severity": "ERROR", - "message": "Parameter 'NullParamDescription': Description must not be null", - "source": "CFN_LINT", + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "NullParamDescription", - "entityType": "Parameter" + "logicalId": "Resource291", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Parameters/NullParamDescription/Description", - "category": "Parameter", - "startLine": 42, - "startColumn": 5, - "endLine": 42, - "endColumn": 16, - "ruleDescription": "Parameters have appropriate properties", - "phase": "PARSE" + "propertyPath": "Properties.InstanceType", + "category": "Best Practice", + "startLine": 28800, + "startColumn": 7, + "endLine": 28800, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "E2001", - "severity": "ERROR", - "message": "Parameter 'NullParamMaxValue': MaxValue must not be null", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "NullParamMaxValue", - "entityType": "Parameter" + "logicalId": "Resource291", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Parameters/NullParamMaxValue/MaxValue", - "category": "Parameter", - "startLine": 45, - "startColumn": 5, - "endLine": 45, - "endColumn": 13, - "ruleDescription": "Parameters have appropriate properties", - "phase": "PARSE" + "propertyPath": "Properties.UserData", + "category": "Best Practice", + "startLine": 28801, + "startColumn": 7, + "endLine": 28801, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "E2001", - "severity": "ERROR", - "message": "Parameter 'NullParamMinValue': MinValue must not be null", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "NullParamMinValue", - "entityType": "Parameter" + "logicalId": "Resource292", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Parameters/NullParamMinValue/MinValue", - "category": "Parameter", - "startLine": 48, - "startColumn": 5, - "endLine": 48, - "endColumn": 13, - "ruleDescription": "Parameters have appropriate properties", - "phase": "PARSE" + "propertyPath": "Properties.ImageId", + "category": "Best Practice", + "startLine": 28898, + "startColumn": 7, + "endLine": 28898, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "E2001", - "severity": "ERROR", - "message": "Parameter 'NullParamMaxLength': MaxLength must not be null", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "NullParamMaxLength", - "entityType": "Parameter" + "logicalId": "Resource292", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Parameters/NullParamMaxLength/MaxLength", - "category": "Parameter", - "startLine": 51, - "startColumn": 5, - "endLine": 51, - "endColumn": 14, - "ruleDescription": "Parameters have appropriate properties", - "phase": "PARSE" + "propertyPath": "Properties.InstanceType", + "category": "Best Practice", + "startLine": 28899, + "startColumn": 7, + "endLine": 28899, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "E2001", - "severity": "ERROR", - "message": "Parameter 'NullParamMinLength': MinLength must not be null", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "NullParamMinLength", - "entityType": "Parameter" + "logicalId": "Resource292", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Parameters/NullParamMinLength/MinLength", - "category": "Parameter", - "startLine": 54, - "startColumn": 5, - "endLine": 54, - "endColumn": 14, - "ruleDescription": "Parameters have appropriate properties", - "phase": "PARSE" + "propertyPath": "Properties.UserData", + "category": "Best Practice", + "startLine": 28900, + "startColumn": 7, + "endLine": 28900, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "E2001", - "severity": "ERROR", - "message": "Parameter 'NullParamNoEcho': NoEcho must not be null", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "NullParamNoEcho", - "entityType": "Parameter" + "logicalId": "Resource293", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Parameters/NullParamNoEcho/NoEcho", - "category": "Parameter", - "startLine": 57, - "startColumn": 5, - "endLine": 57, - "endColumn": 11, - "ruleDescription": "Parameters have appropriate properties", - "phase": "PARSE" + "propertyPath": "Properties.ImageId", + "category": "Best Practice", + "startLine": 28997, + "startColumn": 7, + "endLine": 28997, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'allowedValuesNotAList' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "allowedValuesNotAList", - "entityType": "Parameter" + "logicalId": "Resource293", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Parameters/allowedValuesNotAList", + "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 4, - "startColumn": 3, - "endLine": 4, - "endColumn": 24, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "startLine": 28998, + "startColumn": 7, + "endLine": 28998, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'allowedValuesAListofBadTypes' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "allowedValuesAListofBadTypes", - "entityType": "Parameter" + "logicalId": "Resource293", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Parameters/allowedValuesAListofBadTypes", + "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 7, - "startColumn": 3, - "endLine": 7, - "endColumn": 31, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "startLine": 28999, + "startColumn": 7, + "endLine": 28999, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'minValueIsNotNumber' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "minValueIsNotNumber", - "entityType": "Parameter" + "logicalId": "Resource294", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Parameters/minValueIsNotNumber", + "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 11, - "startColumn": 3, - "endLine": 11, - "endColumn": 22, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "startLine": 29096, + "startColumn": 7, + "endLine": 29096, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'maxLengthIsNotString' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "maxLengthIsNotString", - "entityType": "Parameter" + "logicalId": "Resource294", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Parameters/maxLengthIsNotString", + "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 14, - "startColumn": 3, - "endLine": 14, - "endColumn": 23, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "startLine": 29097, + "startColumn": 7, + "endLine": 29097, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'notBooleanEcho' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "notBooleanEcho", - "entityType": "Parameter" + "logicalId": "Resource294", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Parameters/notBooleanEcho", + "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 17, - "startColumn": 3, - "endLine": 17, - "endColumn": 17, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "startLine": 29098, + "startColumn": 7, + "endLine": 29098, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'myParameter' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "myParameter", - "entityType": "Parameter" + "logicalId": "Resource295", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Parameters/myParameter", + "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 20, - "startColumn": 3, - "endLine": 20, + "startLine": 29195, + "startColumn": 7, + "endLine": 29195, "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'myInvalidParameter' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "myInvalidParameter", - "entityType": "Parameter" + "logicalId": "Resource295", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Parameters/myInvalidParameter", + "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 25, - "startColumn": 3, - "endLine": 25, - "endColumn": 21, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "startLine": 29196, + "startColumn": 7, + "endLine": 29196, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'mySsmParam' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "mySsmParam", - "entityType": "Parameter" + "logicalId": "Resource295", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Parameters/mySsmParam", + "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 28, - "startColumn": 3, - "endLine": 28, - "endColumn": 13, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "startLine": 29197, + "startColumn": 7, + "endLine": 29197, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'NullParamType' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "NullParamType", - "entityType": "Parameter" + "logicalId": "Resource296", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Parameters/NullParamType", + "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 35, - "startColumn": 3, - "endLine": 35, - "endColumn": 16, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "startLine": 29294, + "startColumn": 7, + "endLine": 29294, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'NullParamDefault' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "NullParamDefault", - "entityType": "Parameter" + "logicalId": "Resource296", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Parameters/NullParamDefault", + "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 37, - "startColumn": 3, - "endLine": 37, + "startLine": 29295, + "startColumn": 7, + "endLine": 29295, "endColumn": 19, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "Resource296", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Properties.UserData", + "category": "Best Practice", + "startLine": 29296, + "startColumn": 7, + "endLine": 29296, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'NullParamDescription' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "NullParamDescription", - "entityType": "Parameter" + "logicalId": "Resource297", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Parameters/NullParamDescription", + "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 40, - "startColumn": 3, - "endLine": 40, - "endColumn": 23, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "startLine": 29393, + "startColumn": 7, + "endLine": 29393, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'NullParamMaxValue' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "NullParamMaxValue", - "entityType": "Parameter" + "logicalId": "Resource297", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Parameters/NullParamMaxValue", + "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 43, - "startColumn": 3, - "endLine": 43, - "endColumn": 20, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "startLine": 29394, + "startColumn": 7, + "endLine": 29394, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'NullParamMinValue' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "NullParamMinValue", - "entityType": "Parameter" + "logicalId": "Resource297", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Parameters/NullParamMinValue", + "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 46, - "startColumn": 3, - "endLine": 46, - "endColumn": 20, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "startLine": 29395, + "startColumn": 7, + "endLine": 29395, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'NullParamMaxLength' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "NullParamMaxLength", - "entityType": "Parameter" + "logicalId": "Resource298", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Parameters/NullParamMaxLength", + "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 49, - "startColumn": 3, - "endLine": 49, - "endColumn": 21, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "startLine": 29492, + "startColumn": 7, + "endLine": 29492, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'NullParamMinLength' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "NullParamMinLength", - "entityType": "Parameter" + "logicalId": "Resource298", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Parameters/NullParamMinLength", + "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 52, - "startColumn": 3, - "endLine": 52, - "endColumn": 21, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "startLine": 29493, + "startColumn": 7, + "endLine": 29493, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'NullParamNoEcho' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "NullParamNoEcho", - "entityType": "Parameter" + "logicalId": "Resource298", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Parameters/NullParamNoEcho", + "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 55, - "startColumn": 3, - "endLine": 55, - "endColumn": 18, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "startLine": 29494, + "startColumn": 7, + "endLine": 29494, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "IamPipeline", + "logicalId": "Resource299", "entityType": "Resource", - "resourceType": "AWS::CloudFormation::Stack" + "resourceType": "AWS::EC2::Instance" }, + "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 60, - "startColumn": 3, - "endLine": 60, + "startLine": 29591, + "startColumn": 7, + "endLine": 29591, "endColumn": 14, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "IamPipeline", + "logicalId": "Resource299", "entityType": "Resource", - "resourceType": "AWS::CloudFormation::Stack" + "resourceType": "AWS::EC2::Instance" }, + "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 60, - "startColumn": 3, - "endLine": 60, - "endColumn": 14, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 29592, + "startColumn": 7, + "endLine": 29592, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'IamPipeline' of type 'AWS::CloudFormation::Stack' supports Tags but none are configured", + "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "IamPipeline", + "logicalId": "Resource299", "entityType": "Resource", - "resourceType": "AWS::CloudFormation::Stack" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 62, - "startColumn": 5, - "endLine": 62, + "startLine": 29593, + "startColumn": 7, + "endLine": 29593, "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } + }, + { + "ruleId": "I9003", + "severity": "INFO", + "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", + "source": "ENGINE", + "category": "Best Practice", + "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", "phase": "LINT" } ] }, - "bad/parameters/default.yaml": { - "filePath": "bad/parameters/default.yaml", + "bad/mappings/name.yaml": { + "filePath": "bad/mappings/name.yaml", "status": "OK", "metadata": { "resourcesScanned": 0, "counts": { - "fatal": 11, - "errors": 3, - "warnings": 9, + "fatal": 1, + "errors": 1, + "warnings": 1, "informational": 0, "debug": 0 }, @@ -73384,421 +71864,493 @@ "message": "Resources section must exist and be non-empty", "source": "SCHEMA", "category": "Structure", - "startLine": 61, + "startLine": 10, "startColumn": 1, - "endLine": 61, + "endLine": 10, "endColumn": 10, "ruleDescription": "Resources section must exist and be non-empty", "phase": "SCHEMA" }, { - "ruleId": "F2012", - "severity": "FATAL", - "message": "Parameter 'myAllowedValue' Default 'us-east-1a' is not in AllowedValues ['us-east-1b', 'us-east-1c', 'us-east-1d']", - "source": "SCHEMA", - "entity": { - "logicalId": "myAllowedValue", - "entityType": "Parameter" - }, - "propertyPath": "Parameters/myAllowedValue/Default", - "category": "Parameter", - "startLine": 18, - "startColumn": 5, - "endLine": 18, - "endColumn": 12, - "ruleDescription": "Parameter Default must be in AllowedValues", - "phase": "SCHEMA" - }, - { - "ruleId": "F2012", - "severity": "FATAL", - "message": "Parameter 'CDLAllowedValues' Default 'three' is not in AllowedValues ['one', 'two', 'three,four']", - "source": "SCHEMA", - "entity": { - "logicalId": "CDLAllowedValues", - "entityType": "Parameter" - }, - "propertyPath": "Parameters/CDLAllowedValues/Default", - "category": "Parameter", - "startLine": 47, - "startColumn": 5, - "endLine": 47, - "endColumn": 12, - "ruleDescription": "Parameter Default must be in AllowedValues", - "phase": "SCHEMA" - }, - { - "ruleId": "F2012", - "severity": "FATAL", - "message": "Parameter 'CDLAllowedValuesWithSpaces' Default 'four' is not in AllowedValues ['one', 'two', 'three, four']", - "source": "SCHEMA", - "entity": { - "logicalId": "CDLAllowedValuesWithSpaces", - "entityType": "Parameter" - }, - "propertyPath": "Parameters/CDLAllowedValuesWithSpaces/Default", - "category": "Parameter", - "startLine": 56, - "startColumn": 5, - "endLine": 56, - "endColumn": 12, - "ruleDescription": "Parameter Default must be in AllowedValues", - "phase": "SCHEMA" - }, - { - "ruleId": "F2012", - "severity": "FATAL", - "message": "Parameter 'CDLAllowedValuesWithSpaces' Default 'three' is not in AllowedValues ['one', 'two', 'three, four']", - "source": "SCHEMA", - "entity": { - "logicalId": "CDLAllowedValuesWithSpaces", - "entityType": "Parameter" - }, - "propertyPath": "Parameters/CDLAllowedValuesWithSpaces/Default", - "category": "Parameter", - "startLine": 56, - "startColumn": 5, - "endLine": 56, - "endColumn": 12, - "ruleDescription": "Parameter Default must be in AllowedValues", - "phase": "SCHEMA" - }, - { - "ruleId": "F2015", - "severity": "FATAL", - "message": "Parameter 'myAllowedPattern' Default 'vpc!@#$' does not match AllowedPattern '^[a-zA-Z0-9]*$'", - "source": "SCHEMA", - "entity": { - "logicalId": "myAllowedPattern", - "entityType": "Parameter" - }, - "propertyPath": "Parameters/myAllowedPattern/Default", - "category": "Parameter", - "startLine": 6, - "startColumn": 5, - "endLine": 6, - "endColumn": 12, - "ruleDescription": "Default value is within parameter constraints", - "phase": "SCHEMA" - }, - { - "ruleId": "F2015", - "severity": "FATAL", - "message": "Parameter 'myMinValue' Default 0 is less than MinValue 1", - "source": "SCHEMA", + "ruleId": "E7001", + "severity": "ERROR", + "message": "Mapping name 'Bad.Name' does not match format '^[a-zA-Z0-9]+$'", + "source": "CFN_LINT", "entity": { - "logicalId": "myMinValue", - "entityType": "Parameter" + "logicalId": "Bad.Name", + "entityType": "Mapping" }, - "propertyPath": "Parameters/myMinValue/Default", - "category": "Parameter", - "startLine": 10, - "startColumn": 5, - "endLine": 10, - "endColumn": 12, - "ruleDescription": "Default value is within parameter constraints", - "phase": "SCHEMA" + "propertyPath": "Mappings/Bad.Name", + "category": "Structure", + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 11, + "ruleDescription": "Mappings are appropriately configured", + "phase": "LINT" }, { - "ruleId": "F2015", - "severity": "FATAL", - "message": "Parameter 'myMaxValue' Default 1 exceeds MaxValue 0", - "source": "SCHEMA", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Bad.Name' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "myMaxValue", - "entityType": "Parameter" + "logicalId": "Bad.Name", + "entityType": "Mapping" }, - "propertyPath": "Parameters/myMaxValue/Default", - "category": "Parameter", - "startLine": 14, - "startColumn": 5, - "endLine": 14, - "endColumn": 12, - "ruleDescription": "Default value is within parameter constraints", - "phase": "SCHEMA" + "propertyPath": "Mappings/Bad.Name", + "category": "Best Practice", + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 11, + "ruleDescription": "Check if Mappings are Used", + "phase": "LINT" + } + ] + }, + "bad/mappings/used.yaml": { + "filePath": "bad/mappings/used.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 1, + "warnings": 1, + "informational": 3, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "F2015", - "severity": "FATAL", - "message": "Parameter 'myMinLength' Default length 3 is less than MinLength 5", - "source": "SCHEMA", + "ruleId": "E1151", + "severity": "ERROR", + "message": "'vpc-123456' does not match format 'AWS::EC2::VPC.Id'", + "source": "CFN_LINT", "entity": { - "logicalId": "myMinLength", - "entityType": "Parameter" + "logicalId": "mySubnet", + "entityType": "Resource", + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Parameters/myMinLength/Default", - "category": "Parameter", - "startLine": 25, - "startColumn": 5, - "endLine": 25, + "propertyPath": "Properties.VpcId", + "category": "Intrinsic Function", + "startLine": 18, + "startColumn": 7, + "endLine": 18, "endColumn": 12, - "ruleDescription": "Default value is within parameter constraints", - "phase": "SCHEMA" + "ruleDescription": "Validate VPC id format", + "phase": "SCHEMA", + "context": { + "actualValue": "vpc-123456" + } }, { - "ruleId": "F2015", - "severity": "FATAL", - "message": "Parameter 'myMaxLength' Default length 3 exceeds MaxLength 1", - "source": "SCHEMA", + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'Environment' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "myMaxLength", - "entityType": "Parameter" - }, - "propertyPath": "Parameters/myMaxLength/Default", - "category": "Parameter", - "startLine": 29, - "startColumn": 5, - "endLine": 29, - "endColumn": 12, - "ruleDescription": "Default value is within parameter constraints", - "phase": "SCHEMA" + "logicalId": "Environment", + "entityType": "Mapping" + }, + "propertyPath": "Mappings/Environment", + "category": "Best Practice", + "startLine": 4, + "startColumn": 3, + "endLine": 4, + "endColumn": 14, + "ruleDescription": "Check if Mappings are Used", + "phase": "LINT" }, { - "ruleId": "F2015", - "severity": "FATAL", - "message": "Parameter 'CDLAllowedPattern' Default does not match AllowedPattern '[a-z]*$'", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "CDLAllowedPattern", - "entityType": "Parameter" + "logicalId": "mySubnet", + "entityType": "Resource", + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Parameters/CDLAllowedPattern/Default", - "category": "Parameter", - "startLine": 42, - "startColumn": 5, - "endLine": 42, + "propertyPath": "Properties.VpcId", + "category": "Best Practice", + "startLine": 18, + "startColumn": 7, + "endLine": 18, "endColumn": 12, - "ruleDescription": "Default value is within parameter constraints", - "phase": "SCHEMA" + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "E2001", - "severity": "ERROR", - "message": "Parameter 'MyEmptyDefault': Default must be a string", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "MyEmptyDefault", - "entityType": "Parameter" + "logicalId": "mySubnet", + "entityType": "Resource", + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Parameters/MyEmptyDefault/Default", - "category": "Parameter", - "startLine": 33, - "startColumn": 5, - "endLine": 33, - "endColumn": 12, - "ruleDescription": "Parameters have appropriate properties", - "phase": "PARSE" + "propertyPath": "Properties.CidrBlock", + "category": "Best Practice", + "startLine": 20, + "startColumn": 7, + "endLine": 20, + "endColumn": 16, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "E2001", - "severity": "ERROR", - "message": "Parameter 'MyRefDefault': Type must be a string", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'mySubnet' of type 'AWS::EC2::Subnet' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "MyRefDefault", - "entityType": "Parameter" + "logicalId": "mySubnet", + "entityType": "Resource", + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Parameters/MyRefDefault/Type", - "category": "Parameter", - "startLine": 35, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 17, "startColumn": 5, - "endLine": 35, - "endColumn": 9, - "ruleDescription": "Parameters have appropriate properties", - "phase": "PARSE" + "endLine": 17, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "bad/module_with_tags.yaml": { + "filePath": "bad/module_with_tags.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 1, + "warnings": 0, + "informational": 0, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "E2001", + "ruleId": "E5001", "severity": "ERROR", - "message": "Parameter 'MyRefDefault': Default must be a string", + "message": "Tags is not permitted within Module resource 'Mod'", "source": "CFN_LINT", "entity": { - "logicalId": "MyRefDefault", - "entityType": "Parameter" + "logicalId": "Mod", + "entityType": "Resource", + "resourceType": "MyCompany::Testing::MODULE" }, - "propertyPath": "Parameters/MyRefDefault/Default", - "category": "Parameter", - "startLine": 36, - "startColumn": 5, - "endLine": 36, - "endColumn": 12, - "ruleDescription": "Parameters have appropriate properties", - "phase": "PARSE" + "propertyPath": "Properties.Tags", + "category": "Structure", + "startLine": 6, + "startColumn": 7, + "endLine": 6, + "endColumn": 11, + "ruleDescription": "Check that Modules resources are valid", + "phase": "LINT" + } + ] + }, + "bad/modules/bad_has_create_policy.yaml": { + "filePath": "bad/modules/bad_has_create_policy.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 2, + "warnings": 0, + "informational": 0, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'myAllowedPattern' is not referenced anywhere in the template", + "ruleId": "E3055", + "severity": "ERROR", + "message": "CreationPolicy is not supported on resource type 'My::Organization::Custom::MODULE'", "source": "CFN_LINT", "entity": { - "logicalId": "myAllowedPattern", - "entityType": "Parameter" + "logicalId": "MyModule", + "entityType": "Resource", + "resourceType": "My::Organization::Custom::MODULE" }, - "propertyPath": "Parameters/myAllowedPattern", - "category": "Best Practice", - "startLine": 4, - "startColumn": 3, - "endLine": 4, + "propertyPath": "CreationPolicy", + "suggestedFix": "Remove CreationPolicy or change resource type to one of: AWS::AppStream::Fleet, AWS::AutoScaling::AutoScalingGroup, AWS::CloudFormation::WaitCondition, AWS::EC2::Instance", + "category": "Resource", + "startLine": 6, + "startColumn": 5, + "endLine": 6, "endColumn": 19, - "ruleDescription": "Check if Parameters are Used", + "ruleDescription": "Check CreationPolicy values for Resources", "phase": "LINT" }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'myMinValue' is not referenced anywhere in the template", + "ruleId": "E5001", + "severity": "ERROR", + "message": "CreationPolicy is not permitted within Module resource 'MyModule'", "source": "CFN_LINT", "entity": { - "logicalId": "myMinValue", - "entityType": "Parameter" + "logicalId": "MyModule", + "entityType": "Resource", + "resourceType": "My::Organization::Custom::MODULE" }, - "propertyPath": "Parameters/myMinValue", - "category": "Best Practice", - "startLine": 8, - "startColumn": 3, - "endLine": 8, - "endColumn": 13, - "ruleDescription": "Check if Parameters are Used", + "propertyPath": "CreationPolicy", + "category": "Structure", + "startLine": 6, + "startColumn": 5, + "endLine": 6, + "endColumn": 19, + "ruleDescription": "Check that Modules resources are valid", "phase": "LINT" + } + ] + }, + "bad/modules/bad_has_tags.yaml": { + "filePath": "bad/modules/bad_has_tags.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 1, + "warnings": 0, + "informational": 0, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'myMaxValue' is not referenced anywhere in the template", + "ruleId": "E5001", + "severity": "ERROR", + "message": "Tags is not permitted within Module resource 'IamRoleModule'", "source": "CFN_LINT", "entity": { - "logicalId": "myMaxValue", - "entityType": "Parameter" + "logicalId": "IamRoleModule", + "entityType": "Resource", + "resourceType": "Some::IAM::Role::MODULE" }, - "propertyPath": "Parameters/myMaxValue", - "category": "Best Practice", - "startLine": 12, - "startColumn": 3, - "endLine": 12, - "endColumn": 13, - "ruleDescription": "Check if Parameters are Used", + "propertyPath": "Properties.Tags", + "category": "Structure", + "startLine": 5, + "startColumn": 7, + "endLine": 5, + "endColumn": 11, + "ruleDescription": "Check that Modules resources are valid", "phase": "LINT" + } + ] + }, + "bad/modules/bad_has_update_policy.yaml": { + "filePath": "bad/modules/bad_has_update_policy.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 2, + "warnings": 0, + "informational": 0, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'myAllowedValue' is not referenced anywhere in the template", + "ruleId": "E3016", + "severity": "ERROR", + "message": "UpdatePolicy is not supported on resource type 'My::Organization::Custom::MODULE'", "source": "CFN_LINT", "entity": { - "logicalId": "myAllowedValue", - "entityType": "Parameter" + "logicalId": "MyModule", + "entityType": "Resource", + "resourceType": "My::Organization::Custom::MODULE" }, - "propertyPath": "Parameters/myAllowedValue", - "category": "Best Practice", - "startLine": 16, - "startColumn": 3, - "endLine": 16, + "propertyPath": "UpdatePolicy", + "suggestedFix": "Remove UpdatePolicy or change resource type to one of: AWS::AppStream::Fleet, AWS::AutoScaling::AutoScalingGroup, AWS::ElastiCache::ReplicationGroup, AWS::Elasticsearch::Domain, AWS::Lambda::Alias, AWS::OpenSearchService::Domain", + "category": "Resource", + "startLine": 5, + "startColumn": 5, + "endLine": 5, "endColumn": 17, - "ruleDescription": "Check if Parameters are Used", + "ruleDescription": "Check UpdatePolicy values for Resources", "phase": "LINT" }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'MyEmptyDefault' is not referenced anywhere in the template", + "ruleId": "E5001", + "severity": "ERROR", + "message": "UpdatePolicy is not permitted within Module resource 'MyModule'", "source": "CFN_LINT", "entity": { - "logicalId": "MyEmptyDefault", - "entityType": "Parameter" + "logicalId": "MyModule", + "entityType": "Resource", + "resourceType": "My::Organization::Custom::MODULE" }, - "propertyPath": "Parameters/MyEmptyDefault", - "category": "Best Practice", - "startLine": 31, - "startColumn": 3, - "endLine": 31, + "propertyPath": "UpdatePolicy", + "category": "Structure", + "startLine": 5, + "startColumn": 5, + "endLine": 5, "endColumn": 17, - "ruleDescription": "Check if Parameters are Used", + "ruleDescription": "Check that Modules resources are valid", "phase": "LINT" + } + ] + }, + "bad/modules/bad_uses_module_metadata.yaml": { + "filePath": "bad/modules/bad_uses_module_metadata.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 0, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [] + }, + "bad/noecho.yaml": { + "filePath": "bad/noecho.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 2, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 2, + "informational": 2, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "W2001", + "ruleId": "W2010", "severity": "WARN", - "message": "Parameter 'MyRefDefault' is not referenced anywhere in the template", + "message": "Don't use 'NoEcho' parameter 'NoEchoParam' in resource metadata", "source": "CFN_LINT", "entity": { - "logicalId": "MyRefDefault", - "entityType": "Parameter" + "logicalId": "SNSTopicWithSecretNameInRef", + "entityType": "Resource", + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Parameters/MyRefDefault", - "category": "Best Practice", - "startLine": 34, - "startColumn": 3, - "endLine": 34, - "endColumn": 15, - "ruleDescription": "Check if Parameters are Used", + "propertyPath": "Metadata.NoEchoParamInMetadata", + "suggestedFix": "Move the parameter reference out of Metadata or remove NoEcho", + "category": "Security", + "startLine": 13, + "startColumn": 7, + "endLine": 13, + "endColumn": 28, + "ruleDescription": "NoEcho parameters are not masked when used in Metadata and Outputs", "phase": "LINT" }, { - "ruleId": "W2001", + "ruleId": "W2010", "severity": "WARN", - "message": "Parameter 'CDLAllowedPattern' is not referenced anywhere in the template", + "message": "Don't use 'NoEcho' parameter 'NoEchoParam' in resource metadata", "source": "CFN_LINT", "entity": { - "logicalId": "CDLAllowedPattern", - "entityType": "Parameter" + "logicalId": "SNSTopicWithSecretNameInSub", + "entityType": "Resource", + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Parameters/CDLAllowedPattern", - "category": "Best Practice", - "startLine": 37, - "startColumn": 3, - "endLine": 37, - "endColumn": 20, - "ruleDescription": "Check if Parameters are Used", + "propertyPath": "Metadata.NoEchoParamInMetadata", + "suggestedFix": "Move the parameter reference out of Metadata or remove NoEcho", + "category": "Security", + "startLine": 19, + "startColumn": 7, + "endLine": 19, + "endColumn": 28, + "ruleDescription": "NoEcho parameters are not masked when used in Metadata and Outputs", "phase": "LINT" }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'CDLAllowedValues' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'SNSTopicWithSecretNameInRef' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "CDLAllowedValues", - "entityType": "Parameter" + "logicalId": "SNSTopicWithSecretNameInRef", + "entityType": "Resource", + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Parameters/CDLAllowedValues", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 43, - "startColumn": 3, - "endLine": 43, - "endColumn": 19, - "ruleDescription": "Check if Parameters are Used", + "startLine": 10, + "startColumn": 5, + "endLine": 10, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'CDLAllowedValuesWithSpaces' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'SNSTopicWithSecretNameInSub' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "CDLAllowedValuesWithSpaces", - "entityType": "Parameter" + "logicalId": "SNSTopicWithSecretNameInSub", + "entityType": "Resource", + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Parameters/CDLAllowedValuesWithSpaces", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 52, - "startColumn": 3, - "endLine": 52, - "endColumn": 29, - "ruleDescription": "Check if Parameters are Used", + "startLine": 16, + "startColumn": 5, + "endLine": 16, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "bad/pipeline_no_source_first_stage.yaml": { - "filePath": "bad/pipeline_no_source_first_stage.yaml", + "bad/not_cloudformation.yaml": { + "filePath": "bad/not_cloudformation.yaml", "status": "OK", "metadata": { - "resourcesScanned": 1, + "resourcesScanned": 0, "counts": { "fatal": 2, - "errors": 1, - "warnings": 2, - "informational": 2, + "errors": 0, + "warnings": 0, + "informational": 0, "debug": 0 }, "suppressed": 0, @@ -73807,163 +72359,199 @@ }, "diagnostics": [ { - "ruleId": "F3014", + "ruleId": "F0001", "severity": "FATAL", - "message": "Exactly one of ['ArtifactStore', 'ArtifactStores'] must be specified", + "message": "Resources section must exist and be non-empty", + "source": "SCHEMA", + "category": "Structure", + "ruleDescription": "Resources section must exist and be non-empty", + "phase": "SCHEMA" + }, + { + "ruleId": "F0005", + "severity": "FATAL", + "message": "'NotEven' is not a valid top-level template section", "source": "SCHEMA", + "propertyPath": "NotEven", + "category": "Structure", + "startLine": 2, + "startColumn": 1, + "endLine": 2, + "endColumn": 8, + "ruleDescription": "Top-level keys must be valid section names", + "phase": "SCHEMA" + } + ] + }, + "bad/opensearch_instance_type.yaml": { + "filePath": "bad/opensearch_instance_type.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 2, + "counts": { + "fatal": 0, + "errors": 1, + "warnings": 0, + "informational": 7, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "E3653", + "severity": "ERROR", + "message": "'fake.invalid.search' is not valid in any region", + "source": "CFN_LINT", "entity": { - "logicalId": "Pipeline", + "logicalId": "BadDomain", "entityType": "Resource", - "resourceType": "AWS::CodePipeline::Pipeline" + "resourceType": "AWS::OpenSearchService::Domain" }, - "propertyPath": "Properties", - "category": "Schema", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-codepipeline", - "ruleDescription": "Exactly one of properties required (requiredXor)", - "phase": "SCHEMA" + "propertyPath": "Properties.ClusterConfig.InstanceType", + "category": "Resource", + "startLine": 8, + "startColumn": 9, + "endLine": 8, + "endColumn": 21, + "ruleDescription": "Validate OpenSearch domain cluster instance type", + "phase": "LINT" }, { - "ruleId": "F3032", - "severity": "FATAL", - "message": "expected minimum item count: 2, found: 1", - "source": "SCHEMA", + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "Pipeline", + "logicalId": "BadDomain", "entityType": "Resource", - "resourceType": "AWS::CodePipeline::Pipeline" + "resourceType": "AWS::OpenSearchService::Domain" }, - "propertyPath": "Properties.Stages", - "category": "Schema", - "startLine": 8, - "startColumn": 7, - "endLine": 8, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-codepipeline", - "ruleDescription": "Array item count out of bounds", - "phase": "SCHEMA", - "context": { - "extra": { - "actual_count": 1, - "min_items": 2 - } - } + "category": "Best Practice", + "startLine": 4, + "startColumn": 3, + "endLine": 4, + "endColumn": 12, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "E3700", - "severity": "ERROR", - "message": "First stage of a pipeline must contain at least one Source action", + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "Pipeline", + "logicalId": "BadDomain", "entityType": "Resource", - "resourceType": "AWS::CodePipeline::Pipeline" + "resourceType": "AWS::OpenSearchService::Domain" }, - "propertyPath": "Properties.Stages[0]", - "suggestedFix": "Add an action with ActionTypeId.Category=Source to the first stage", - "category": "Resource", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "Validate CodePipeline Source actions are only in the first stage", + "category": "Best Practice", + "startLine": 4, + "startColumn": 3, + "endLine": 4, + "endColumn": 12, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "W9002", - "severity": "WARN", - "message": "Property 'RoleArn' has a hardcoded ARN - use Ref, GetAtt, or a parameter instead", - "source": "ENGINE", + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "Pipeline", + "logicalId": "ValidDomain", "entityType": "Resource", - "resourceType": "AWS::CodePipeline::Pipeline" + "resourceType": "AWS::OpenSearchService::Domain" }, - "propertyPath": "Properties.RoleArn", "category": "Best Practice", - "startLine": 7, - "startColumn": 7, - "endLine": 7, + "startLine": 9, + "startColumn": 3, + "endLine": 9, "endColumn": 14, - "ruleDescription": "Hardcoded ARN property", + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "W9013", - "severity": "WARN", - "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", - "source": "ENGINE", + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "Pipeline", + "logicalId": "ValidDomain", "entityType": "Resource", - "resourceType": "AWS::CodePipeline::Pipeline" + "resourceType": "AWS::OpenSearchService::Domain" }, - "category": "Security", - "startLine": 3, + "category": "Best Practice", + "startLine": 9, "startColumn": 3, - "endLine": 3, - "endColumn": 11, - "ruleDescription": "Hardcoded account ID in ARN", + "endLine": 9, + "endColumn": 14, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9003", "severity": "INFO", - "message": "Property 'Name' is create-only; updating it will cause resource replacement", + "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", + "source": "ENGINE", + "category": "Best Practice", + "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'BadDomain' of type 'AWS::OpenSearchService::Domain' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Pipeline", + "logicalId": "BadDomain", "entityType": "Resource", - "resourceType": "AWS::CodePipeline::Pipeline" + "resourceType": "AWS::OpenSearchService::Domain" }, - "propertyPath": "Properties.Name", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", "startLine": 6, - "startColumn": 7, + "startColumn": 5, "endLine": 6, - "endColumn": 11, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-codepipeline", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Pipeline' of type 'AWS::CodePipeline::Pipeline' supports Tags but none are configured", + "message": "Resource 'ValidDomain' of type 'AWS::OpenSearchService::Domain' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Pipeline", + "logicalId": "ValidDomain", "entityType": "Resource", - "resourceType": "AWS::CodePipeline::Pipeline" + "resourceType": "AWS::OpenSearchService::Domain" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 5, + "startLine": 11, "startColumn": 5, - "endLine": 5, + "endLine": 11, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "bad/previous_gen_instance.yaml": { - "filePath": "bad/previous_gen_instance.yaml", + "bad/output_invalid_references.yaml": { + "filePath": "bad/output_invalid_references.yaml", "status": "OK", "metadata": { "resourcesScanned": 1, "counts": { - "fatal": 0, + "fatal": 2, "errors": 0, - "warnings": 1, - "informational": 5, + "warnings": 0, + "informational": 1, "debug": 0 }, "suppressed": 0, @@ -73972,131 +72560,198 @@ }, "diagnostics": [ { - "ruleId": "W9010", - "severity": "WARN", - "message": "Hardcoded AMI ID - use a parameter or mapping for portability", - "source": "ENGINE", + "ruleId": "F6101", + "severity": "FATAL", + "message": "'NotARealAttribute' is not one of ['Arn', 'DomainName', 'DualStackDomainName', 'MetadataConfiguration.AnnotationTableConfiguration.TableArn', 'MetadataConfiguration.AnnotationTableConfiguration.TableName', 'MetadataConfiguration.Destination', 'MetadataConfiguration.InventoryTableConfiguration.TableArn', 'MetadataConfiguration.InventoryTableConfiguration.TableName', 'MetadataConfiguration.JournalTableConfiguration.TableArn', 'MetadataConfiguration.JournalTableConfiguration.TableName', 'MetadataTableConfiguration.S3TablesDestination.TableArn', 'MetadataTableConfiguration.S3TablesDestination.TableNamespace', 'RegionalDomainName', 'WebsiteURL']", + "source": "SCHEMA", "entity": { - "logicalId": "Instance", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "logicalId": "InvalidAttribute", + "entityType": "Output" }, - "propertyPath": "Properties.ImageId", - "category": "Security", - "startLine": 7, - "startColumn": 7, - "endLine": 7, - "endColumn": 14, - "ruleDescription": "Hardcoded AMI ID", - "phase": "LINT" + "propertyPath": "Outputs/InvalidAttribute/Value.Fn::GetAtt.1", + "category": "Structure", + "startLine": 6, + "startColumn": 3, + "endLine": 6, + "endColumn": 19, + "ruleDescription": "Output value must be a string", + "phase": "SCHEMA" }, { - "ruleId": "I3100", - "severity": "INFO", - "message": "Previous generation instance type 'm1.small' - consider upgrading", - "source": "CFN_LINT", + "ruleId": "F6101", + "severity": "FATAL", + "message": "Fn::Sub variable '${MissingTarget}' does not reference a valid resource, parameter, or pseudo-parameter", + "source": "SCHEMA", "entity": { - "logicalId": "Instance", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "logicalId": "UnresolvedSubVariable", + "entityType": "Output" }, - "propertyPath": "Properties.InstanceType", - "suggestedFix": "Upgrade to a current generation instance type", - "category": "Best Practice", - "startLine": 6, - "startColumn": 7, - "endLine": 6, - "endColumn": 19, - "ruleDescription": "Checks for legacy instance type generations", - "phase": "LINT" + "propertyPath": "Outputs/UnresolvedSubVariable/Value.Fn::Sub", + "category": "Structure", + "startLine": 8, + "startColumn": 3, + "endLine": 8, + "endColumn": 24, + "ruleDescription": "Output value must be a string", + "phase": "SCHEMA" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", + "message": "Resource 'Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Instance", + "logicalId": "Bucket", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.InstanceType", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 9, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "bad/output_invalid_targets.yaml": { + "filePath": "bad/output_invalid_targets.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 5, + "errors": 0, + "warnings": 0, + "informational": 1, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "F6101", + "severity": "FATAL", + "message": "Ref 'DoesNotExist' does not reference a valid resource, parameter, or pseudo-parameter", + "source": "SCHEMA", + "propertyPath": "Outputs.MissingRef.Value.Ref", + "category": "Structure", + "startLine": 5, + "startColumn": 16, + "endLine": 5, + "endColumn": 21, + "ruleDescription": "Output value must be a string", + "phase": "PARSE" + }, + { + "ruleId": "F6101", + "severity": "FATAL", + "message": "GetAtt 'DoesNotExist.Arn' references a resource that does not exist", + "source": "SCHEMA", + "entity": { + "logicalId": "MissingGetAtt", + "entityType": "Output" + }, + "propertyPath": "Outputs/MissingGetAtt/Value.Fn::GetAtt.0", + "category": "Structure", "startLine": 6, - "startColumn": 7, + "startColumn": 3, "endLine": 6, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "endColumn": 16, + "ruleDescription": "Output value must be a string", + "phase": "SCHEMA" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "F6101", + "severity": "FATAL", + "message": "Fn::Sub variable '${DoesNotExist}' does not reference a valid resource, parameter, or pseudo-parameter", + "source": "SCHEMA", "entity": { - "logicalId": "Instance", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "logicalId": "MissingSubRef", + "entityType": "Output" }, - "propertyPath": "Properties.ImageId", - "category": "Best Practice", + "propertyPath": "Outputs/MissingSubRef/Value.Fn::Sub", + "category": "Structure", "startLine": 7, - "startColumn": 7, + "startColumn": 3, "endLine": 7, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "endColumn": 16, + "ruleDescription": "Output value must be a string", + "phase": "SCHEMA" }, { - "ruleId": "I9003", - "severity": "INFO", - "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", - "source": "ENGINE", - "category": "Best Practice", - "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", - "phase": "LINT" + "ruleId": "F6101", + "severity": "FATAL", + "message": "Fn::Sub variable '${DoesNotExist.Arn}' does not reference a valid resource, parameter, or pseudo-parameter", + "source": "SCHEMA", + "entity": { + "logicalId": "MissingSubGetAtt", + "entityType": "Output" + }, + "propertyPath": "Outputs/MissingSubGetAtt/Value.Fn::Sub", + "category": "Structure", + "startLine": 8, + "startColumn": 3, + "endLine": 8, + "endColumn": 19, + "ruleDescription": "Output value must be a string", + "phase": "SCHEMA" + }, + { + "ruleId": "F6101", + "severity": "FATAL", + "message": "'DoesNotExist' is not one of ['Arn', 'DomainName', 'DualStackDomainName', 'MetadataConfiguration.AnnotationTableConfiguration.TableArn', 'MetadataConfiguration.AnnotationTableConfiguration.TableName', 'MetadataConfiguration.Destination', 'MetadataConfiguration.InventoryTableConfiguration.TableArn', 'MetadataConfiguration.InventoryTableConfiguration.TableName', 'MetadataConfiguration.JournalTableConfiguration.TableArn', 'MetadataConfiguration.JournalTableConfiguration.TableName', 'MetadataTableConfiguration.S3TablesDestination.TableArn', 'MetadataTableConfiguration.S3TablesDestination.TableNamespace', 'RegionalDomainName', 'WebsiteURL']", + "source": "SCHEMA", + "entity": { + "logicalId": "InvalidExistingAttribute", + "entityType": "Output" + }, + "propertyPath": "Outputs/InvalidExistingAttribute/Value.Fn::GetAtt.1", + "category": "Structure", + "startLine": 9, + "startColumn": 3, + "endLine": 9, + "endColumn": 27, + "ruleDescription": "Output value must be a string", + "phase": "SCHEMA" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Instance' of type 'AWS::EC2::Instance' supports Tags but none are configured", + "message": "Resource 'Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Instance", + "logicalId": "Bucket", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::S3::Bucket" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 9, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "bad/previous_generation_instances.yaml": { - "filePath": "bad/previous_generation_instances.yaml", + "bad/output_value_not_string.yaml": { + "filePath": "bad/output_value_not_string.yaml", "status": "OK", "metadata": { - "resourcesScanned": 6, + "resourcesScanned": 1, "counts": { - "fatal": 1, - "errors": 2, + "fatal": 7, + "errors": 0, "warnings": 0, - "informational": 23, + "informational": 4, "debug": 0 }, "suppressed": 0, @@ -74105,139 +72760,130 @@ }, "diagnostics": [ { - "ruleId": "F3003", + "ruleId": "F6101", "severity": "FATAL", - "message": "'AvailabilityZone' is a required property", + "message": "Output 'ValueIsList' value must be a string, not a list", "source": "SCHEMA", "entity": { - "logicalId": "Host", - "entityType": "Resource", - "resourceType": "AWS::EC2::Host" + "logicalId": "ValueIsList", + "entityType": "Output" }, - "propertyPath": "Properties", - "suggestedFix": "Add the required property 'AvailabilityZone'", - "category": "Schema", - "startLine": 26, + "propertyPath": "Outputs/ValueIsList/Value", + "category": "Structure", + "startLine": 17, "startColumn": 5, - "endLine": 26, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Required property missing", - "phase": "SCHEMA" + "endLine": 17, + "endColumn": 10, + "ruleDescription": "Output value must be a string", + "phase": "PARSE" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-abc' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "F6101", + "severity": "FATAL", + "message": "Output 'ValueIsObject' value must be a string, not an object", + "source": "SCHEMA", "entity": { - "logicalId": "Instance", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "logicalId": "ValueIsObject", + "entityType": "Output" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 8, - "startColumn": 7, - "endLine": 8, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-abc" - } + "propertyPath": "Outputs/ValueIsObject/Value", + "category": "Structure", + "startLine": 21, + "startColumn": 5, + "endLine": 21, + "endColumn": 10, + "ruleDescription": "Output value must be a string", + "phase": "PARSE" }, { - "ruleId": "E3647", - "severity": "ERROR", - "message": "'cache.r3.large' is not valid in any region", - "source": "CFN_LINT", + "ruleId": "F6101", + "severity": "FATAL", + "message": "Output 'ValueIsGetAZs' value must be a string, not a list", + "source": "SCHEMA", "entity": { - "logicalId": "CacheCluster", - "entityType": "Resource", - "resourceType": "AWS::ElastiCache::CacheCluster" + "logicalId": "ValueIsGetAZs", + "entityType": "Output" }, - "propertyPath": "Properties.CacheNodeType", - "category": "Resource", - "startLine": 16, - "startColumn": 7, - "endLine": 16, - "endColumn": 20, - "ruleDescription": "Validate ElastiCache cluster cache node type", - "phase": "LINT" + "propertyPath": "Outputs/ValueIsGetAZs/Value", + "category": "Structure", + "startLine": 24, + "startColumn": 5, + "endLine": 24, + "endColumn": 10, + "ruleDescription": "Output value must be a string", + "phase": "PARSE" }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "Domain", - "entityType": "Resource", - "resourceType": "AWS::Elasticsearch::Domain" - }, - "category": "Best Practice", - "startLine": 2, - "startColumn": 3, - "endLine": 2, - "endColumn": 9, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "ruleId": "F6101", + "severity": "FATAL", + "message": "Output 'ValueIsSplit' value must be a string, not a list", + "source": "SCHEMA", + "entity": { + "logicalId": "ValueIsSplit", + "entityType": "Output" + }, + "propertyPath": "Outputs/ValueIsSplit/Value", + "category": "Structure", + "startLine": 26, + "startColumn": 5, + "endLine": 26, + "endColumn": 10, + "ruleDescription": "Output value must be a string", + "phase": "PARSE" }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "ruleId": "F6101", + "severity": "FATAL", + "message": "Output 'ValueIsCidr' value must be a string, not a list", + "source": "SCHEMA", "entity": { - "logicalId": "Domain", - "entityType": "Resource", - "resourceType": "AWS::Elasticsearch::Domain" + "logicalId": "ValueIsCidr", + "entityType": "Output" }, - "category": "Best Practice", - "startLine": 2, - "startColumn": 3, - "endLine": 2, - "endColumn": 9, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "propertyPath": "Outputs/ValueIsCidr/Value", + "category": "Structure", + "startLine": 28, + "startColumn": 5, + "endLine": 28, + "endColumn": 10, + "ruleDescription": "Output value must be a string", + "phase": "PARSE" }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "ruleId": "F6101", + "severity": "FATAL", + "message": "Output 'ConditionalListBranch' value must be a string, not a list", + "source": "SCHEMA", "entity": { - "logicalId": "DBInstance", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "logicalId": "ConditionalListBranch", + "entityType": "Output" }, - "category": "Best Practice", - "startLine": 9, - "startColumn": 3, - "endLine": 9, - "endColumn": 13, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "propertyPath": "Outputs/ConditionalListBranch/Value/Fn::If/1", + "category": "Structure", + "startLine": 30, + "startColumn": 25, + "endLine": 30, + "endColumn": 26, + "ruleDescription": "Output value must be a string", + "phase": "PARSE" }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "ruleId": "F6101", + "severity": "FATAL", + "message": "Output 'ConditionalListBranch' value must be a string, not a list", + "source": "SCHEMA", "entity": { - "logicalId": "DBInstance", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "logicalId": "ConditionalListBranch", + "entityType": "Output" }, - "category": "Best Practice", - "startLine": 9, - "startColumn": 3, - "endLine": 9, - "endColumn": 13, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "propertyPath": "Outputs/ConditionalListBranch/Value/Fn::If/2", + "category": "Structure", + "startLine": 30, + "startColumn": 35, + "endLine": 30, + "endColumn": 36, + "ruleDescription": "Output value must be a string", + "phase": "PARSE" }, { "ruleId": "I3011", @@ -74245,15 +72891,15 @@ "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "CacheCluster", + "logicalId": "Queue", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::CacheCluster" + "resourceType": "AWS::SQS::Queue" }, "category": "Best Practice", "startLine": 13, "startColumn": 3, "endLine": 13, - "endColumn": 15, + "endColumn": 8, "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, @@ -74263,155 +72909,140 @@ "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "CacheCluster", + "logicalId": "Queue", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::CacheCluster" + "resourceType": "AWS::SQS::Queue" }, "category": "Best Practice", "startLine": 13, "startColumn": 3, "endLine": 13, - "endColumn": 15, + "endColumn": 8, "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "I3011", + "ruleId": "I3013", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "message": "'MessageRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", "source": "CFN_LINT", "entity": { - "logicalId": "Domain2", + "logicalId": "Queue", "entityType": "Resource", - "resourceType": "AWS::Elasticsearch::Domain" + "resourceType": "AWS::SQS::Queue" }, + "propertyPath": "Properties", "category": "Best Practice", - "startLine": 19, + "startLine": 13, "startColumn": 3, - "endLine": 19, - "endColumn": 10, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "endLine": 13, + "endColumn": 8, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", "phase": "LINT" }, { - "ruleId": "I3011", + "ruleId": "I9040", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Resource 'Queue' of type 'AWS::SQS::Queue' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Domain2", + "logicalId": "Queue", "entityType": "Resource", - "resourceType": "AWS::Elasticsearch::Domain" + "resourceType": "AWS::SQS::Queue" }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 19, + "startLine": 13, "startColumn": 3, - "endLine": 19, - "endColumn": 10, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "endLine": 13, + "endColumn": 8, + "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "bad/override/complete.yaml": { + "filePath": "bad/override/complete.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 5, + "counts": { + "fatal": 1, + "errors": 1, + "warnings": 1, + "informational": 7, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I3100", - "severity": "INFO", - "message": "Previous generation instance type 'm1.small' - consider upgrading", - "source": "CFN_LINT", + "ruleId": "F3003", + "severity": "FATAL", + "message": "'SpotFleetRequestConfigData' is a required property", + "source": "SCHEMA", "entity": { - "logicalId": "Instance", + "logicalId": "mySpotFleet", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::EC2::SpotFleet" }, - "propertyPath": "Properties.InstanceType", - "suggestedFix": "Upgrade to a current generation instance type", - "category": "Best Practice", - "startLine": 7, - "startColumn": 7, - "endLine": 7, - "endColumn": 19, - "ruleDescription": "Checks for legacy instance type generations", - "phase": "LINT" + "propertyPath": "Properties", + "suggestedFix": "Add the required property 'SpotFleetRequestConfigData'", + "category": "Schema", + "startLine": 20, + "startColumn": 3, + "endLine": 20, + "endColumn": 14, + "ruleDescription": "Required property missing", + "phase": "SCHEMA" }, { - "ruleId": "I3100", - "severity": "INFO", - "message": "Previous generation instance type 'db.t1.micro' - consider upgrading", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-123456' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "DBInstance", + "logicalId": "untaggedInstance", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.DBInstanceClass", - "suggestedFix": "Upgrade to a current generation instance type", - "category": "Best Practice", - "startLine": 12, + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 14, "startColumn": 7, - "endLine": 12, - "endColumn": 22, - "ruleDescription": "Checks for legacy instance type generations", - "phase": "LINT" + "endLine": 14, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-123456" + } }, { - "ruleId": "I3100", - "severity": "INFO", - "message": "Previous generation instance type 'cache.r3.large' - consider upgrading", + "ruleId": "W3045", + "severity": "WARN", + "message": "AccessControl property is deprecated. Use bucket policies instead", "source": "CFN_LINT", "entity": { - "logicalId": "CacheCluster", + "logicalId": "myS3Bucket", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::CacheCluster" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.CacheNodeType", - "suggestedFix": "Upgrade to a current generation instance type", - "category": "Best Practice", - "startLine": 16, + "propertyPath": "Properties.AccessControl", + "suggestedFix": "Remove AccessControl and use an AWS::S3::BucketPolicy resource", + "category": "Deprecation", + "startLine": 10, "startColumn": 7, - "endLine": 16, + "endLine": 10, "endColumn": 20, - "ruleDescription": "Checks for legacy instance type generations", - "phase": "LINT" - }, - { - "ruleId": "I3100", - "severity": "INFO", - "message": "Previous generation instance type 'm3.medium.elasticsearch' - consider upgrading", - "source": "CFN_LINT", - "entity": { - "logicalId": "Domain2", - "entityType": "Resource", - "resourceType": "AWS::Elasticsearch::Domain" - }, - "propertyPath": "Properties.ElasticsearchClusterConfig.InstanceType", - "suggestedFix": "Upgrade to a current generation instance type", - "category": "Best Practice", - "startLine": 23, - "startColumn": 9, - "endLine": 23, - "endColumn": 21, - "ruleDescription": "Checks for legacy instance type generations", - "phase": "LINT" - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Instance", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.InstanceType", - "category": "Best Practice", - "startLine": 7, - "startColumn": 7, - "endLine": 7, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", + "ruleDescription": "Controlling access to an S3 bucket should be done with bucket policies", + "phase": "LINT", "context": { - "lifecycle": "conditional-create-only" + "actualValue": "Private" } }, { @@ -74420,15 +73051,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Instance", + "logicalId": "untaggedInstance", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 8, + "startLine": 14, "startColumn": 7, - "endLine": 8, + "endLine": 14, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -74440,153 +73071,41 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Engine' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "CacheCluster", - "entityType": "Resource", - "resourceType": "AWS::ElastiCache::CacheCluster" - }, - "propertyPath": "Properties.Engine", - "category": "Best Practice", - "startLine": 17, - "startColumn": 7, - "endLine": 17, - "endColumn": 13, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'InstanceType' is create-only; updating it will cause resource replacement", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Host", + "logicalId": "VPC", "entityType": "Resource", - "resourceType": "AWS::EC2::Host" + "resourceType": "AWS::EC2::VPC" }, - "propertyPath": "Properties.InstanceType", + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 27, - "startColumn": 7, - "endLine": 27, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "startLine": 18, + "startColumn": 9, + "endLine": 18, + "endColumn": 18, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only" } }, - { - "ruleId": "I9003", - "severity": "INFO", - "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", - "source": "ENGINE", - "category": "Best Practice", - "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Domain' of type 'AWS::Elasticsearch::Domain' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "Domain", - "entityType": "Resource", - "resourceType": "AWS::Elasticsearch::Domain" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 2, - "startColumn": 3, - "endLine": 2, - "endColumn": 9, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Instance' of type 'AWS::EC2::Instance' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "Instance", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 6, - "startColumn": 5, - "endLine": 6, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'DBInstance' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "DBInstance", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 11, - "startColumn": 5, - "endLine": 11, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'CacheCluster' of type 'AWS::ElastiCache::CacheCluster' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "CacheCluster", - "entityType": "Resource", - "resourceType": "AWS::ElastiCache::CacheCluster" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 15, - "startColumn": 5, - "endLine": 15, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Domain2' of type 'AWS::Elasticsearch::Domain' supports Tags but none are configured", + "message": "Resource 'myS3Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Domain2", + "logicalId": "myS3Bucket", "entityType": "Resource", - "resourceType": "AWS::Elasticsearch::Domain" + "resourceType": "AWS::S3::Bucket" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 21, + "startLine": 8, "startColumn": 5, - "endLine": 21, + "endLine": 8, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -74594,278 +73113,235 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Host' of type 'AWS::EC2::Host' supports Tags but none are configured", + "message": "Resource 'untaggedInstance' of type 'AWS::EC2::Instance' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Host", + "logicalId": "untaggedInstance", "entityType": "Resource", - "resourceType": "AWS::EC2::Host" + "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 26, + "startLine": 13, "startColumn": 5, - "endLine": 26, + "endLine": 13, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" - } - ] - }, - "bad/properties_ebs.yaml": { - "filePath": "bad/properties_ebs.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 3, - "counts": { - "fatal": 1, - "errors": 3, - "warnings": 6, - "informational": 14, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "F3034", - "severity": "FATAL", - "message": "10 is less than the minimum of 100", - "source": "SCHEMA", - "entity": { - "logicalId": "MyLaunchConfig", - "entityType": "Resource", - "resourceType": "AWS::AutoScaling::LaunchConfiguration" - }, - "propertyPath": "Properties.BlockDeviceMappings.0.Ebs.Iops", - "category": "Schema", - "startLine": 50, - "startColumn": 13, - "endLine": 50, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", - "ruleDescription": "Numeric value out of bounds", - "phase": "SCHEMA", - "context": { - "actualValue": 10 - } - }, - { - "ruleId": "E3671", - "severity": "ERROR", - "message": "0 is less than the minimum of 100", - "source": "CFN_LINT", - "entity": { - "logicalId": "MyEC2Instance", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.BlockDeviceMappings.0.Ebs.Iops", - "category": "Resource", - "startLine": 17, - "startColumn": 13, - "endLine": 17, - "endColumn": 17, - "ruleDescription": "Validate block device mapping configuration", - "phase": "LINT" - }, - { - "ruleId": "E3671", - "severity": "ERROR", - "message": "10 is less than the minimum of 100", - "source": "CFN_LINT", + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'VPC' of type 'AWS::EC2::VPC' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "MyLaunchConfig", + "logicalId": "VPC", "entityType": "Resource", - "resourceType": "AWS::AutoScaling::LaunchConfiguration" + "resourceType": "AWS::EC2::VPC" }, - "propertyPath": "Properties.BlockDeviceMappings.0.Ebs.Iops", - "category": "Resource", - "startLine": 50, - "startColumn": 13, - "endLine": 50, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 17, + "startColumn": 7, + "endLine": 17, "endColumn": 17, - "ruleDescription": "Validate block device mapping configuration", + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "E3715", - "severity": "ERROR", - "message": "'ephemeralA' is not a valid ephemeral device name. Expected format is 'ephemeralN' where N is 0-23", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'mySpotFleet' of type 'AWS::EC2::SpotFleet' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "MyEC2Instance3", + "logicalId": "mySpotFleet", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::EC2::SpotFleet" }, - "propertyPath": "Properties.BlockDeviceMappings.0.VirtualName", - "category": "Resource", - "startLine": 36, - "startColumn": 9, - "endLine": 36, - "endColumn": 20, - "ruleDescription": "VirtualName must use ephemeral device format when Ebs is absent", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 20, + "startColumn": 3, + "endLine": 20, + "endColumn": 14, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "W3030", - "severity": "WARN", - "message": "'magnetic' is not one of ['gp2', 'gp3', 'io1', 'io2', 'sc1', 'st1', 'standard']", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'mySnsTopic' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "MyEC2Instance", + "logicalId": "mySnsTopic", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.BlockDeviceMappings.1.Ebs.VolumeType", - "category": "Schema", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", "startLine": 23, - "startColumn": 13, + "startColumn": 3, "endLine": 23, - "endColumn": 23, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Value not in allowed enum", - "phase": "SCHEMA", - "context": { - "actualValue": "magnetic" - } + "endColumn": 13, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "bad/override/exclude.yaml": { + "filePath": "bad/override/exclude.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 3, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 3, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "W3671", - "severity": "WARN", - "message": "Iops is ignored when VolumeType is 'standard'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'myGameLift' of type 'AWS::GameLift::Alias' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "MyLaunchConfig", + "logicalId": "myGameLift", "entityType": "Resource", - "resourceType": "AWS::AutoScaling::LaunchConfiguration" + "resourceType": "AWS::GameLift::Alias" }, - "propertyPath": "Properties.BlockDeviceMappings.1.Ebs.Iops", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 57, - "startColumn": 13, - "endLine": 57, - "endColumn": 17, - "ruleDescription": "Iops is ignored for certain EBS volume types", + "startLine": 8, + "startColumn": 5, + "endLine": 8, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "W3697", - "severity": "WARN", - "message": "Resource type 'AWS::AutoScaling::LaunchConfiguration' is from a service in maintenance mode since 2024-10-01. Consider migrating to an alternative", - "source": "CFN_LINT", - "entity": { - "logicalId": "MyLaunchConfig", - "entityType": "Resource", - "resourceType": "AWS::AutoScaling::LaunchConfiguration" - }, - "category": "Deprecation", - "startLine": 40, - "startColumn": 3, - "endLine": 40, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", - "ruleDescription": "Resource type is from a service in maintenance mode", - "phase": "SCHEMA" - }, - { - "ruleId": "W9003", - "severity": "WARN", - "message": "1 is not of type 'string' - automatically coerced (number to string)", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'myS3Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "MyEC2Instance", + "logicalId": "myS3Bucket", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.KeyName", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 11, - "startColumn": 7, - "endLine": 11, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Property type coercion warning", - "phase": "SCHEMA" + "startLine": 14, + "startColumn": 3, + "endLine": 14, + "endColumn": 13, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "W9010", - "severity": "WARN", - "message": "Hardcoded AMI ID - use a parameter or mapping for portability", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'mySnsTopic' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "MyEC2Instance", + "logicalId": "mySnsTopic", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Security", - "startLine": 9, - "startColumn": 7, - "endLine": 9, - "endColumn": 14, - "ruleDescription": "Hardcoded AMI ID", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 16, + "startColumn": 3, + "endLine": 16, + "endColumn": 13, + "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "bad/override/include.yaml": { + "filePath": "bad/override/include.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 4, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 2, + "informational": 6, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "W9010", + "ruleId": "W2511", "severity": "WARN", - "message": "Hardcoded AMI ID - use a parameter or mapping for portability", - "source": "ENGINE", + "message": "IAM Policy Version should be updated to '2012-10-17'", + "source": "CFN_LINT", "entity": { - "logicalId": "MyEC2Instance3", + "logicalId": "myS3BucketPolicy", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::S3::BucketPolicy" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Properties.PolicyDocument.Version", + "suggestedFix": "Update the policy document Version to '2012-10-17'", "category": "Security", - "startLine": 32, - "startColumn": 7, - "endLine": 32, - "endColumn": 14, - "ruleDescription": "Hardcoded AMI ID", + "startLine": 20, + "startColumn": 9, + "endLine": 20, + "endColumn": 16, + "ruleDescription": "Check IAM Resource Policies syntax", "phase": "LINT" }, { - "ruleId": "I3100", - "severity": "INFO", - "message": "Previous generation instance type 't1.micro' - consider upgrading", + "ruleId": "W3011", + "severity": "WARN", + "message": "Both 'UpdateReplacePolicy' and 'DeletionPolicy' are needed to protect resource from deletion", "source": "CFN_LINT", "entity": { - "logicalId": "MyEC2Instance", + "logicalId": "myS3BucketPolicy", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::S3::BucketPolicy" }, - "propertyPath": "Properties.InstanceType", - "suggestedFix": "Upgrade to a current generation instance type", "category": "Best Practice", - "startLine": 10, - "startColumn": 7, - "endLine": 10, + "startLine": 13, + "startColumn": 3, + "endLine": 13, "endColumn": 19, - "ruleDescription": "Checks for legacy instance type generations", + "ruleDescription": "Check resources with UpdateReplacePolicy/DeletionPolicy have both", "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MyEC2Instance", + "logicalId": "myVpc1", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::EC2::VPC" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", "startLine": 9, "startColumn": 7, "endLine": 9, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -74875,20 +73351,19 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'InstanceTenancy' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MyEC2Instance", + "logicalId": "myVpc1", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::EC2::VPC" }, - "propertyPath": "Properties.InstanceType", + "propertyPath": "Properties.InstanceTenancy", "category": "Best Practice", "startLine": 10, "startColumn": 7, "endLine": 10, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endColumn": 22, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -74898,248 +73373,379 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'KeyName' is create-only; updating it will cause resource replacement", + "message": "Property 'Bucket' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MyEC2Instance", + "logicalId": "myS3BucketPolicy", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::S3::BucketPolicy" }, - "propertyPath": "Properties.KeyName", + "propertyPath": "Properties.Bucket", "category": "Best Practice", - "startLine": 11, + "startLine": 17, "startColumn": 7, - "endLine": 11, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 17, + "endColumn": 13, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'myS3Bucket'" } }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'BlockDeviceMappings' is conditionally create-only; updating it may cause resource replacement", + "message": "Resource 'myVpc1' of type 'AWS::EC2::VPC' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "MyEC2Instance", + "logicalId": "myVpc1", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::EC2::VPC" }, - "propertyPath": "Properties.BlockDeviceMappings", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 12, - "startColumn": 7, - "endLine": 12, - "endColumn": 26, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 8, + "startColumn": 5, + "endLine": 8, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'NetworkInterfaces' is create-only; updating it will cause resource replacement", + "message": "Resource 'myS3Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "MyEC2Instance", + "logicalId": "myS3Bucket", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.NetworkInterfaces", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 11, + "startColumn": 3, + "endLine": 11, + "endColumn": 13, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'mySnsTopic' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "mySnsTopic", + "entityType": "Resource", + "resourceType": "AWS::SNS::Topic" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", "startLine": 27, - "startColumn": 7, + "startColumn": 3, "endLine": 27, - "endColumn": 24, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", + "endColumn": 13, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "bad/override/required.yaml": { + "filePath": "bad/override/required.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 1, + "informational": 1, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "W3045", + "severity": "WARN", + "message": "AccessControl property is deprecated. Use bucket policies instead", + "source": "CFN_LINT", + "entity": { + "logicalId": "myS3Bucket", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" + }, + "propertyPath": "Properties.AccessControl", + "suggestedFix": "Remove AccessControl and use an AWS::S3::BucketPolicy resource", + "category": "Deprecation", + "startLine": 10, + "startColumn": 7, + "endLine": 10, + "endColumn": 20, + "ruleDescription": "Controlling access to an S3 bucket should be done with bucket policies", + "phase": "LINT", "context": { - "lifecycle": "create-only" + "actualValue": "Private" } }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "message": "Resource 'myS3Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "MyEC2Instance3", + "logicalId": "myS3Bucket", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 32, - "startColumn": 7, - "endLine": 32, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 8, + "startColumn": 5, + "endLine": 8, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "bad/param_constraints.yaml": { + "filePath": "bad/param_constraints.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 5, + "errors": 0, + "warnings": 5, + "informational": 1, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "F2015", + "severity": "FATAL", + "message": "Parameter 'PatternParam' Default '123-bad' does not match AllowedPattern '^[a-z]+$'", + "source": "SCHEMA", + "entity": { + "logicalId": "PatternParam", + "entityType": "Parameter" + }, + "propertyPath": "Parameters/PatternParam/Default", + "category": "Parameter", + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 12, + "ruleDescription": "Default value is within parameter constraints", + "phase": "SCHEMA" + }, + { + "ruleId": "F2015", + "severity": "FATAL", + "message": "Parameter 'ShortParam' Default length 2 is less than MinLength 5", + "source": "SCHEMA", + "entity": { + "logicalId": "ShortParam", + "entityType": "Parameter" + }, + "propertyPath": "Parameters/ShortParam/Default", + "category": "Parameter", + "startLine": 9, + "startColumn": 5, + "endLine": 9, + "endColumn": 12, + "ruleDescription": "Default value is within parameter constraints", + "phase": "SCHEMA" + }, + { + "ruleId": "F2015", + "severity": "FATAL", + "message": "Parameter 'LongParam' Default length 34 exceeds MaxLength 10", + "source": "SCHEMA", + "entity": { + "logicalId": "LongParam", + "entityType": "Parameter" + }, + "propertyPath": "Parameters/LongParam/Default", + "category": "Parameter", + "startLine": 13, + "startColumn": 5, + "endLine": 13, + "endColumn": 12, + "ruleDescription": "Default value is within parameter constraints", + "phase": "SCHEMA" + }, + { + "ruleId": "F2015", + "severity": "FATAL", + "message": "Parameter 'SmallNumber' Default 3 is less than MinValue 10", + "source": "SCHEMA", + "entity": { + "logicalId": "SmallNumber", + "entityType": "Parameter" + }, + "propertyPath": "Parameters/SmallNumber/Default", + "category": "Parameter", + "startLine": 17, + "startColumn": 5, + "endLine": 17, + "endColumn": 12, + "ruleDescription": "Default value is within parameter constraints", + "phase": "SCHEMA" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'BlockDeviceMappings' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "F2015", + "severity": "FATAL", + "message": "Parameter 'BigNumber' Default 200 exceeds MaxValue 100", + "source": "SCHEMA", "entity": { - "logicalId": "MyEC2Instance3", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "logicalId": "BigNumber", + "entityType": "Parameter" }, - "propertyPath": "Properties.BlockDeviceMappings", - "category": "Best Practice", - "startLine": 33, - "startColumn": 7, - "endLine": 33, - "endColumn": 26, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "propertyPath": "Parameters/BigNumber/Default", + "category": "Parameter", + "startLine": 21, + "startColumn": 5, + "endLine": 21, + "endColumn": 12, + "ruleDescription": "Default value is within parameter constraints", + "phase": "SCHEMA" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'PatternParam' is not referenced anywhere in the template", + "source": "CFN_LINT", "entity": { - "logicalId": "MyLaunchConfig", - "entityType": "Resource", - "resourceType": "AWS::AutoScaling::LaunchConfiguration" + "logicalId": "PatternParam", + "entityType": "Parameter" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Parameters/PatternParam", "category": "Best Practice", - "startLine": 43, - "startColumn": 7, - "endLine": 43, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'InstanceType' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'ShortParam' is not referenced anywhere in the template", + "source": "CFN_LINT", "entity": { - "logicalId": "MyLaunchConfig", - "entityType": "Resource", - "resourceType": "AWS::AutoScaling::LaunchConfiguration" + "logicalId": "ShortParam", + "entityType": "Parameter" }, - "propertyPath": "Properties.InstanceType", + "propertyPath": "Parameters/ShortParam", "category": "Best Practice", - "startLine": 44, - "startColumn": 7, - "endLine": 44, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 7, + "startColumn": 3, + "endLine": 7, + "endColumn": 13, + "ruleDescription": "Check if Parameters are Used", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'BlockDeviceMappings' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'LongParam' is not referenced anywhere in the template", + "source": "CFN_LINT", "entity": { - "logicalId": "MyLaunchConfig", - "entityType": "Resource", - "resourceType": "AWS::AutoScaling::LaunchConfiguration" + "logicalId": "LongParam", + "entityType": "Parameter" }, - "propertyPath": "Properties.BlockDeviceMappings", + "propertyPath": "Parameters/LongParam", "category": "Best Practice", - "startLine": 45, - "startColumn": 7, - "endLine": 45, - "endColumn": 26, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 11, + "startColumn": 3, + "endLine": 11, + "endColumn": 12, + "ruleDescription": "Check if Parameters are Used", + "phase": "LINT" }, { - "ruleId": "I9003", - "severity": "INFO", - "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", - "source": "ENGINE", + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'SmallNumber' is not referenced anywhere in the template", + "source": "CFN_LINT", + "entity": { + "logicalId": "SmallNumber", + "entityType": "Parameter" + }, + "propertyPath": "Parameters/SmallNumber", "category": "Best Practice", - "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", + "startLine": 15, + "startColumn": 3, + "endLine": 15, + "endColumn": 14, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'MyEC2Instance' of type 'AWS::EC2::Instance' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'BigNumber' is not referenced anywhere in the template", + "source": "CFN_LINT", "entity": { - "logicalId": "MyEC2Instance", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "logicalId": "BigNumber", + "entityType": "Parameter" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Parameters/BigNumber", "category": "Best Practice", - "startLine": 8, - "startColumn": 5, - "endLine": 8, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "startLine": 19, + "startColumn": 3, + "endLine": 19, + "endColumn": 12, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'MyEC2Instance3' of type 'AWS::EC2::Instance' supports Tags but none are configured", + "message": "Resource 'Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "MyEC2Instance3", + "logicalId": "Bucket", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::S3::Bucket" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 31, - "startColumn": 5, - "endLine": 31, - "endColumn": 15, + "startLine": 24, + "startColumn": 3, + "endLine": 24, + "endColumn": 9, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "bad/properties_password.yaml": { - "filePath": "bad/properties_password.yaml", + "bad/param_number_default.yaml": { + "filePath": "bad/param_number_default.yaml", "status": "OK", "metadata": { - "resourcesScanned": 3, + "resourcesScanned": 1, "counts": { - "fatal": 0, + "fatal": 4, "errors": 0, - "warnings": 13, - "informational": 19, + "warnings": 1, + "informational": 0, "debug": 0 }, "suppressed": 0, @@ -75148,1139 +73754,1011 @@ }, "diagnostics": [ { - "ruleId": "W1011", - "severity": "WARN", - "message": "Use dynamic references (e.g., SSM SecureString) instead of parameter 'MyPassword' for secrets", - "source": "CFN_LINT", + "ruleId": "F0015", + "severity": "FATAL", + "message": "Parameter 'Port' Default 'not-a-number' is not a valid number", + "source": "SCHEMA", "entity": { - "logicalId": "MyDB", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "logicalId": "Port", + "entityType": "Parameter" }, - "propertyPath": "Properties.MasterUserPassword", - "category": "Security", - "startLine": 23, - "startColumn": 7, - "endLine": 23, - "endColumn": 25, - "ruleDescription": "Instead of REFing a parameter for a secret use a dynamic reference", - "phase": "LINT" + "propertyPath": "Parameters/Port/Default", + "category": "Parameter", + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 12, + "ruleDescription": "Default value must match parameter Type", + "phase": "SCHEMA" }, { - "ruleId": "W1011", - "severity": "WARN", - "message": "Use dynamic references (e.g., SSM SecureString) instead of parameter 'MyNewPassword' for secrets", - "source": "CFN_LINT", + "ruleId": "F0016", + "severity": "FATAL", + "message": "Parameter 'Port' AllowedValues entry 'abc' is not a valid number", + "source": "SCHEMA", "entity": { - "logicalId": "MyNewDB", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "logicalId": "Port", + "entityType": "Parameter" }, - "propertyPath": "Properties.MasterUserPassword", - "category": "Security", - "startLine": 32, - "startColumn": 7, - "endLine": 32, - "endColumn": 25, - "ruleDescription": "Instead of REFing a parameter for a secret use a dynamic reference", - "phase": "LINT" + "propertyPath": "Parameters/Port/AllowedValues", + "category": "Parameter", + "startLine": 6, + "startColumn": 5, + "endLine": 6, + "endColumn": 18, + "ruleDescription": "AllowedValues entries must match parameter Type", + "phase": "SCHEMA" }, { - "ruleId": "W2501", - "severity": "WARN", - "message": "Parameter MyPassword used as MasterUserPassword, therefore NoEcho should be True", - "source": "CFN_LINT", + "ruleId": "F0016", + "severity": "FATAL", + "message": "Parameter 'Port' AllowedValues entry 'def' is not a valid number", + "source": "SCHEMA", "entity": { - "logicalId": "MyPassword", + "logicalId": "Port", "entityType": "Parameter" }, - "propertyPath": "Parameters/MyPassword", - "category": "Security", + "propertyPath": "Parameters/Port/AllowedValues", + "category": "Parameter", "startLine": 6, - "startColumn": 3, + "startColumn": 5, "endLine": 6, - "endColumn": 13, - "ruleDescription": "Check if Password Properties are correctly configured", - "phase": "LINT" + "endColumn": 18, + "ruleDescription": "AllowedValues entries must match parameter Type", + "phase": "SCHEMA" }, { - "ruleId": "W2501", + "ruleId": "F2012", + "severity": "FATAL", + "message": "Parameter 'Port' Default 'not-a-number' is not in AllowedValues ['abc', 'def']", + "source": "SCHEMA", + "entity": { + "logicalId": "Port", + "entityType": "Parameter" + }, + "propertyPath": "Parameters/Port/Default", + "category": "Parameter", + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 12, + "ruleDescription": "Parameter Default must be in AllowedValues", + "phase": "SCHEMA" + }, + { + "ruleId": "W2001", "severity": "WARN", - "message": "Parameter MyNewPassword used as MasterUserPassword, therefore NoEcho should be True", + "message": "Parameter 'Port' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "MyNewPassword", + "logicalId": "Port", "entityType": "Parameter" }, - "propertyPath": "Parameters/MyNewPassword", - "category": "Security", - "startLine": 10, + "propertyPath": "Parameters/Port", + "category": "Best Practice", + "startLine": 3, "startColumn": 3, - "endLine": 10, - "endColumn": 16, - "ruleDescription": "Check if Password Properties are correctly configured", + "endLine": 3, + "endColumn": 7, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" + } + ] + }, + "bad/parameters/F2012_cdl_default_split.yaml": { + "filePath": "bad/parameters/F2012_cdl_default_split.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 8, + "errors": 0, + "warnings": 5, + "informational": 0, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "W2501", - "severity": "WARN", - "message": "Password should use a secure dynamic reference for Resources/myThirdDb/Properties/MasterUserPassword", - "source": "CFN_LINT", + "ruleId": "F2012", + "severity": "FATAL", + "message": "Parameter 'CDLSingleElementNotAllowed' Default 'three' is not in AllowedValues ['one', 'two']", + "source": "SCHEMA", "entity": { - "logicalId": "myThirdDb", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "logicalId": "CDLSingleElementNotAllowed", + "entityType": "Parameter" }, - "propertyPath": "Properties.MasterUserPassword", - "category": "Security", - "startLine": 41, - "startColumn": 7, - "endLine": 41, - "endColumn": 25, - "ruleDescription": "Check if Password Properties are correctly configured", - "phase": "LINT" + "propertyPath": "Parameters/CDLSingleElementNotAllowed/Default", + "category": "Parameter", + "startLine": 7, + "startColumn": 5, + "endLine": 7, + "endColumn": 12, + "ruleDescription": "Parameter Default must be in AllowedValues", + "phase": "SCHEMA" }, { - "ruleId": "W2509", - "severity": "WARN", - "message": "Parameter 'MyPassword' appears to be a password but does not have NoEcho set to true", - "source": "ENGINE", + "ruleId": "F2012", + "severity": "FATAL", + "message": "Parameter 'CDLMultipleElementsNotAllowed' Default 'four' is not in AllowedValues ['one', 'two']", + "source": "SCHEMA", "entity": { - "logicalId": "MyPassword", + "logicalId": "CDLMultipleElementsNotAllowed", "entityType": "Parameter" }, - "propertyPath": "Parameters/MyPassword", - "category": "Security", - "startLine": 6, - "startColumn": 3, - "endLine": 6, - "endColumn": 13, - "ruleDescription": "Password parameter should have NoEcho", - "phase": "LINT" + "propertyPath": "Parameters/CDLMultipleElementsNotAllowed/Default", + "category": "Parameter", + "startLine": 13, + "startColumn": 5, + "endLine": 13, + "endColumn": 12, + "ruleDescription": "Parameter Default must be in AllowedValues", + "phase": "SCHEMA" }, { - "ruleId": "W2509", - "severity": "WARN", - "message": "Parameter 'MyNewPassword' appears to be a password but does not have NoEcho set to true", - "source": "ENGINE", + "ruleId": "F2012", + "severity": "FATAL", + "message": "Parameter 'CDLMultipleElementsNotAllowed' Default 'three' is not in AllowedValues ['one', 'two']", + "source": "SCHEMA", "entity": { - "logicalId": "MyNewPassword", + "logicalId": "CDLMultipleElementsNotAllowed", "entityType": "Parameter" }, - "propertyPath": "Parameters/MyNewPassword", - "category": "Security", - "startLine": 10, - "startColumn": 3, - "endLine": 10, - "endColumn": 16, - "ruleDescription": "Password parameter should have NoEcho", - "phase": "LINT" + "propertyPath": "Parameters/CDLMultipleElementsNotAllowed/Default", + "category": "Parameter", + "startLine": 13, + "startColumn": 5, + "endLine": 13, + "endColumn": 12, + "ruleDescription": "Parameter Default must be in AllowedValues", + "phase": "SCHEMA" }, { - "ruleId": "W3011", - "severity": "WARN", - "message": "Both 'UpdateReplacePolicy' and 'DeletionPolicy' are needed to protect resource from deletion", - "source": "CFN_LINT", + "ruleId": "F2012", + "severity": "FATAL", + "message": "Parameter 'CDLCommaInAllowedValueDoesNotMatchSplit' Default 'four' is not in AllowedValues ['one', 'two', 'three,four']", + "source": "SCHEMA", "entity": { - "logicalId": "MyDB", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "logicalId": "CDLCommaInAllowedValueDoesNotMatchSplit", + "entityType": "Parameter" }, - "category": "Best Practice", - "startLine": 16, - "startColumn": 3, - "endLine": 16, - "endColumn": 7, - "ruleDescription": "Check resources with UpdateReplacePolicy/DeletionPolicy have both", - "phase": "LINT" + "propertyPath": "Parameters/CDLCommaInAllowedValueDoesNotMatchSplit/Default", + "category": "Parameter", + "startLine": 20, + "startColumn": 5, + "endLine": 20, + "endColumn": 12, + "ruleDescription": "Parameter Default must be in AllowedValues", + "phase": "SCHEMA" }, { - "ruleId": "W3011", - "severity": "WARN", - "message": "Both 'UpdateReplacePolicy' and 'DeletionPolicy' are needed to protect resource from deletion", - "source": "CFN_LINT", + "ruleId": "F2012", + "severity": "FATAL", + "message": "Parameter 'CDLCommaInAllowedValueDoesNotMatchSplit' Default 'three' is not in AllowedValues ['one', 'two', 'three,four']", + "source": "SCHEMA", "entity": { - "logicalId": "MyNewDB", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "logicalId": "CDLCommaInAllowedValueDoesNotMatchSplit", + "entityType": "Parameter" }, - "category": "Best Practice", - "startLine": 25, - "startColumn": 3, - "endLine": 25, - "endColumn": 10, - "ruleDescription": "Check resources with UpdateReplacePolicy/DeletionPolicy have both", - "phase": "LINT" + "propertyPath": "Parameters/CDLCommaInAllowedValueDoesNotMatchSplit/Default", + "category": "Parameter", + "startLine": 20, + "startColumn": 5, + "endLine": 20, + "endColumn": 12, + "ruleDescription": "Parameter Default must be in AllowedValues", + "phase": "SCHEMA" }, { - "ruleId": "W3011", - "severity": "WARN", - "message": "Both 'UpdateReplacePolicy' and 'DeletionPolicy' are needed to protect resource from deletion", - "source": "CFN_LINT", + "ruleId": "F2012", + "severity": "FATAL", + "message": "Parameter 'CDLWhitespaceTrimsToInvalid' Default 'bad' is not in AllowedValues ['one', 'two']", + "source": "SCHEMA", "entity": { - "logicalId": "myThirdDb", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "logicalId": "CDLWhitespaceTrimsToInvalid", + "entityType": "Parameter" }, - "category": "Best Practice", - "startLine": 34, - "startColumn": 3, - "endLine": 34, + "propertyPath": "Parameters/CDLWhitespaceTrimsToInvalid/Default", + "category": "Parameter", + "startLine": 28, + "startColumn": 5, + "endLine": 28, + "endColumn": 12, + "ruleDescription": "Parameter Default must be in AllowedValues", + "phase": "SCHEMA" + }, + { + "ruleId": "F2012", + "severity": "FATAL", + "message": "Parameter 'CDLListStringType' Default 'bad' is not in AllowedValues ['good', 'better']", + "source": "SCHEMA", + "entity": { + "logicalId": "CDLListStringType", + "entityType": "Parameter" + }, + "propertyPath": "Parameters/CDLListStringType/Default", + "category": "Parameter", + "startLine": 35, + "startColumn": 5, + "endLine": 35, "endColumn": 12, - "ruleDescription": "Check resources with UpdateReplacePolicy/DeletionPolicy have both", - "phase": "LINT" + "ruleDescription": "Parameter Default must be in AllowedValues", + "phase": "SCHEMA" }, { - "ruleId": "W9008", - "severity": "WARN", - "message": "RDS instance should have StorageEncrypted set to true", - "source": "ENGINE", + "ruleId": "F2012", + "severity": "FATAL", + "message": "Parameter 'CDLListStringType' Default 'worse' is not in AllowedValues ['good', 'better']", + "source": "SCHEMA", "entity": { - "logicalId": "MyDB", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "logicalId": "CDLListStringType", + "entityType": "Parameter" }, - "propertyPath": "Properties.StorageEncrypted", - "suggestedFix": "Set StorageEncrypted to true", - "category": "Security", - "startLine": 18, + "propertyPath": "Parameters/CDLListStringType/Default", + "category": "Parameter", + "startLine": 35, "startColumn": 5, - "endLine": 18, - "endColumn": 15, - "ruleDescription": "RDS instance should have StorageEncrypted", - "phase": "LINT" + "endLine": 35, + "endColumn": 12, + "ruleDescription": "Parameter Default must be in AllowedValues", + "phase": "SCHEMA" }, { - "ruleId": "W9008", + "ruleId": "W2001", "severity": "WARN", - "message": "RDS instance should have StorageEncrypted set to true", - "source": "ENGINE", + "message": "Parameter 'CDLSingleElementNotAllowed' is not referenced anywhere in the template", + "source": "CFN_LINT", "entity": { - "logicalId": "MyNewDB", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "logicalId": "CDLSingleElementNotAllowed", + "entityType": "Parameter" }, - "propertyPath": "Properties.StorageEncrypted", - "suggestedFix": "Set StorageEncrypted to true", - "category": "Security", - "startLine": 27, - "startColumn": 5, - "endLine": 27, - "endColumn": 15, - "ruleDescription": "RDS instance should have StorageEncrypted", + "propertyPath": "Parameters/CDLSingleElementNotAllowed", + "category": "Best Practice", + "startLine": 5, + "startColumn": 3, + "endLine": 5, + "endColumn": 29, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W9008", + "ruleId": "W2001", "severity": "WARN", - "message": "RDS instance should have StorageEncrypted set to true", - "source": "ENGINE", + "message": "Parameter 'CDLMultipleElementsNotAllowed' is not referenced anywhere in the template", + "source": "CFN_LINT", "entity": { - "logicalId": "myThirdDb", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "logicalId": "CDLMultipleElementsNotAllowed", + "entityType": "Parameter" }, - "propertyPath": "Properties.StorageEncrypted", - "suggestedFix": "Set StorageEncrypted to true", - "category": "Security", - "startLine": 36, - "startColumn": 5, - "endLine": 36, - "endColumn": 15, - "ruleDescription": "RDS instance should have StorageEncrypted", + "propertyPath": "Parameters/CDLMultipleElementsNotAllowed", + "category": "Best Practice", + "startLine": 11, + "startColumn": 3, + "endLine": 11, + "endColumn": 32, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'CDLCommaInAllowedValueDoesNotMatchSplit' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "MyDB", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "logicalId": "CDLCommaInAllowedValueDoesNotMatchSplit", + "entityType": "Parameter" }, + "propertyPath": "Parameters/CDLCommaInAllowedValueDoesNotMatchSplit", "category": "Best Practice", - "startLine": 16, + "startLine": 17, "startColumn": 3, - "endLine": 16, - "endColumn": 7, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "endLine": 17, + "endColumn": 42, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'CDLWhitespaceTrimsToInvalid' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "MyNewDB", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "logicalId": "CDLWhitespaceTrimsToInvalid", + "entityType": "Parameter" }, + "propertyPath": "Parameters/CDLWhitespaceTrimsToInvalid", "category": "Best Practice", "startLine": 25, "startColumn": 3, "endLine": 25, - "endColumn": 10, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "endColumn": 30, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'CDLListStringType' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "myThirdDb", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "logicalId": "CDLListStringType", + "entityType": "Parameter" }, + "propertyPath": "Parameters/CDLListStringType", "category": "Best Practice", - "startLine": 34, + "startLine": 32, "startColumn": 3, - "endLine": 34, - "endColumn": 12, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "endLine": 32, + "endColumn": 20, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" + } + ] + }, + "bad/parameters/configuration.yaml": { + "filePath": "bad/parameters/configuration.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 2, + "errors": 14, + "warnings": 16, + "informational": 3, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I3013", - "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", + "ruleId": "F2002", + "severity": "FATAL", + "message": "Parameter 'myParameter' has invalid Type 'NotString'", + "source": "SCHEMA", "entity": { - "logicalId": "MyDB", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "logicalId": "myParameter", + "entityType": "Parameter" }, - "propertyPath": "Properties", - "category": "Best Practice", - "startLine": 18, + "propertyPath": "Parameters/myParameter/Type", + "category": "Parameter", + "startLine": 22, "startColumn": 5, - "endLine": 18, - "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", - "phase": "LINT" + "endLine": 22, + "endColumn": 9, + "ruleDescription": "Parameter Type must be valid", + "phase": "SCHEMA" }, { - "ruleId": "I3013", - "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", + "ruleId": "F2002", + "severity": "FATAL", + "message": "Parameter 'mySsmParam' has invalid Type 'AWS::SSM::Parameter::Value'", + "source": "SCHEMA", "entity": { - "logicalId": "MyNewDB", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "logicalId": "mySsmParam", + "entityType": "Parameter" }, - "propertyPath": "Properties", - "category": "Best Practice", - "startLine": 27, + "propertyPath": "Parameters/mySsmParam/Type", + "category": "Parameter", + "startLine": 30, "startColumn": 5, - "endLine": 27, - "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", - "phase": "LINT" + "endLine": 30, + "endColumn": 9, + "ruleDescription": "Parameter Type must be valid", + "phase": "SCHEMA" }, { - "ruleId": "I3013", - "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "ruleId": "E2001", + "severity": "ERROR", + "message": "Parameter 'allowedValuesNotAList': AllowedValues must be an array", "source": "CFN_LINT", "entity": { - "logicalId": "myThirdDb", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "logicalId": "allowedValuesNotAList", + "entityType": "Parameter" }, - "propertyPath": "Properties", - "category": "Best Practice", - "startLine": 36, + "propertyPath": "Parameters/allowedValuesNotAList/AllowedValues", + "category": "Parameter", + "startLine": 6, "startColumn": 5, - "endLine": 36, - "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", - "phase": "LINT" + "endLine": 6, + "endColumn": 18, + "ruleDescription": "Parameters have appropriate properties", + "phase": "PARSE" }, { - "ruleId": "I3100", - "severity": "INFO", - "message": "Previous generation instance type 'db.m1.small' - consider upgrading", + "ruleId": "E2001", + "severity": "ERROR", + "message": "Parameter 'minValueIsNotNumber': MinValue must be a number", "source": "CFN_LINT", "entity": { - "logicalId": "MyDB", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "logicalId": "minValueIsNotNumber", + "entityType": "Parameter" }, - "propertyPath": "Properties.DBInstanceClass", - "suggestedFix": "Upgrade to a current generation instance type", - "category": "Best Practice", - "startLine": 20, - "startColumn": 7, - "endLine": 20, - "endColumn": 22, - "ruleDescription": "Checks for legacy instance type generations", - "phase": "LINT" + "propertyPath": "Parameters/minValueIsNotNumber/MinValue", + "category": "Parameter", + "startLine": 13, + "startColumn": 5, + "endLine": 13, + "endColumn": 13, + "ruleDescription": "Parameters have appropriate properties", + "phase": "PARSE" }, { - "ruleId": "I3100", - "severity": "INFO", - "message": "Previous generation instance type 'db.m1.small' - consider upgrading", + "ruleId": "E2001", + "severity": "ERROR", + "message": "Parameter 'notBooleanEcho': NoEcho must be a boolean", "source": "CFN_LINT", "entity": { - "logicalId": "MyNewDB", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "logicalId": "notBooleanEcho", + "entityType": "Parameter" }, - "propertyPath": "Properties.DBInstanceClass", - "suggestedFix": "Upgrade to a current generation instance type", - "category": "Best Practice", - "startLine": 29, - "startColumn": 7, - "endLine": 29, - "endColumn": 22, - "ruleDescription": "Checks for legacy instance type generations", - "phase": "LINT" + "propertyPath": "Parameters/notBooleanEcho/NoEcho", + "category": "Parameter", + "startLine": 19, + "startColumn": 5, + "endLine": 19, + "endColumn": 11, + "ruleDescription": "Parameters have appropriate properties", + "phase": "PARSE" }, { - "ruleId": "I3100", - "severity": "INFO", - "message": "Previous generation instance type 'db.m1.small' - consider upgrading", + "ruleId": "E2001", + "severity": "ERROR", + "message": "Parameter 'myInvalidParameter': 'Type' is a required property", "source": "CFN_LINT", "entity": { - "logicalId": "myThirdDb", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" - }, - "propertyPath": "Properties.DBInstanceClass", - "suggestedFix": "Upgrade to a current generation instance type", - "category": "Best Practice", - "startLine": 38, - "startColumn": 7, - "endLine": 38, - "endColumn": 22, - "ruleDescription": "Checks for legacy instance type generations", - "phase": "LINT" - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "MyDB", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "logicalId": "myInvalidParameter", + "entityType": "Parameter" }, - "propertyPath": "Properties.Engine", - "category": "Best Practice", - "startLine": 21, - "startColumn": 7, - "endLine": 21, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "propertyPath": "Parameters/myInvalidParameter", + "category": "Parameter", + "startLine": 25, + "startColumn": 3, + "endLine": 25, + "endColumn": 21, + "ruleDescription": "Parameters have appropriate properties", + "phase": "PARSE" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'MasterUsername' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E2001", + "severity": "ERROR", + "message": "Parameter 'myInvalidParameter': 'NotType' is not one of ['AllowedPattern', 'AllowedValues', 'ConstraintDescription', 'Default', 'Description', 'MaxLength', 'MinLength', 'MaxValue', 'MinValue', 'NoEcho', 'Type']", + "source": "CFN_LINT", "entity": { - "logicalId": "MyDB", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "logicalId": "myInvalidParameter", + "entityType": "Parameter" }, - "propertyPath": "Properties.MasterUsername", - "category": "Best Practice", - "startLine": 22, - "startColumn": 7, - "endLine": 22, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "propertyPath": "Parameters/myInvalidParameter/NotType", + "category": "Parameter", + "startLine": 27, + "startColumn": 5, + "endLine": 27, + "endColumn": 12, + "ruleDescription": "Parameters have appropriate properties", + "phase": "PARSE" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "E2001", + "severity": "ERROR", + "message": "Parameter 'NullParameter': None is not of type 'object'", + "source": "CFN_LINT", "entity": { - "logicalId": "MyNewDB", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "logicalId": "NullParameter", + "entityType": "Parameter" }, - "propertyPath": "Properties.Engine", - "category": "Best Practice", - "startLine": 30, - "startColumn": 7, - "endLine": 30, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "propertyPath": "Parameters/NullParameter", + "category": "Parameter", + "startLine": 34, + "startColumn": 3, + "endLine": 34, + "endColumn": 16, + "ruleDescription": "Parameters have appropriate properties", + "phase": "PARSE" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'MasterUsername' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E2001", + "severity": "ERROR", + "message": "Parameter 'NullParamType': Type must not be null", + "source": "CFN_LINT", "entity": { - "logicalId": "MyNewDB", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "logicalId": "NullParamType", + "entityType": "Parameter" }, - "propertyPath": "Properties.MasterUsername", - "category": "Best Practice", - "startLine": 31, - "startColumn": 7, - "endLine": 31, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "propertyPath": "Parameters/NullParamType/Type", + "category": "Parameter", + "startLine": 36, + "startColumn": 5, + "endLine": 36, + "endColumn": 9, + "ruleDescription": "Parameters have appropriate properties", + "phase": "PARSE" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "E2001", + "severity": "ERROR", + "message": "Parameter 'NullParamDefault': Default must not be null", + "source": "CFN_LINT", "entity": { - "logicalId": "myThirdDb", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "logicalId": "NullParamDefault", + "entityType": "Parameter" }, - "propertyPath": "Properties.Engine", - "category": "Best Practice", + "propertyPath": "Parameters/NullParamDefault/Default", + "category": "Parameter", "startLine": 39, - "startColumn": 7, + "startColumn": 5, "endLine": 39, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "endColumn": 12, + "ruleDescription": "Parameters have appropriate properties", + "phase": "PARSE" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'MasterUsername' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E2001", + "severity": "ERROR", + "message": "Parameter 'NullParamDescription': Description must not be null", + "source": "CFN_LINT", "entity": { - "logicalId": "myThirdDb", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "logicalId": "NullParamDescription", + "entityType": "Parameter" }, - "propertyPath": "Properties.MasterUsername", - "category": "Best Practice", - "startLine": 40, - "startColumn": 7, - "endLine": 40, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "propertyPath": "Parameters/NullParamDescription/Description", + "category": "Parameter", + "startLine": 42, + "startColumn": 5, + "endLine": 42, + "endColumn": 16, + "ruleDescription": "Parameters have appropriate properties", + "phase": "PARSE" }, { - "ruleId": "I9003", - "severity": "INFO", - "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", - "source": "ENGINE", - "category": "Best Practice", - "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", - "phase": "LINT" + "ruleId": "E2001", + "severity": "ERROR", + "message": "Parameter 'NullParamMaxValue': MaxValue must not be null", + "source": "CFN_LINT", + "entity": { + "logicalId": "NullParamMaxValue", + "entityType": "Parameter" + }, + "propertyPath": "Parameters/NullParamMaxValue/MaxValue", + "category": "Parameter", + "startLine": 45, + "startColumn": 5, + "endLine": 45, + "endColumn": 13, + "ruleDescription": "Parameters have appropriate properties", + "phase": "PARSE" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'MyDB' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "E2001", + "severity": "ERROR", + "message": "Parameter 'NullParamMinValue': MinValue must not be null", + "source": "CFN_LINT", "entity": { - "logicalId": "MyDB", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "logicalId": "NullParamMinValue", + "entityType": "Parameter" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 18, + "propertyPath": "Parameters/NullParamMinValue/MinValue", + "category": "Parameter", + "startLine": 48, "startColumn": 5, - "endLine": 18, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "endLine": 48, + "endColumn": 13, + "ruleDescription": "Parameters have appropriate properties", + "phase": "PARSE" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'MyNewDB' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "E2001", + "severity": "ERROR", + "message": "Parameter 'NullParamMaxLength': MaxLength must not be null", + "source": "CFN_LINT", "entity": { - "logicalId": "MyNewDB", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "logicalId": "NullParamMaxLength", + "entityType": "Parameter" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 27, + "propertyPath": "Parameters/NullParamMaxLength/MaxLength", + "category": "Parameter", + "startLine": 51, "startColumn": 5, - "endLine": 27, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "endLine": 51, + "endColumn": 14, + "ruleDescription": "Parameters have appropriate properties", + "phase": "PARSE" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'myThirdDb' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "E2001", + "severity": "ERROR", + "message": "Parameter 'NullParamMinLength': MinLength must not be null", + "source": "CFN_LINT", "entity": { - "logicalId": "myThirdDb", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "logicalId": "NullParamMinLength", + "entityType": "Parameter" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 36, + "propertyPath": "Parameters/NullParamMinLength/MinLength", + "category": "Parameter", + "startLine": 54, "startColumn": 5, - "endLine": 36, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "bad/properties_rt_association.yaml": { - "filePath": "bad/properties_rt_association.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 7, - "counts": { - "fatal": 0, - "errors": 7, - "warnings": 0, - "informational": 13, - "debug": 0 + "endLine": 54, + "endColumn": 14, + "ruleDescription": "Parameters have appropriate properties", + "phase": "PARSE" }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "E3022", + "ruleId": "E2001", "severity": "ERROR", - "message": "SubnetId in PublicSubnetRouteTableAssociation1 is also associated with PrivateSubnetRouteTableAssociation1", + "message": "Parameter 'NullParamNoEcho': NoEcho must not be null", "source": "CFN_LINT", "entity": { - "logicalId": "PublicSubnetRouteTableAssociation1", - "entityType": "Resource", - "resourceType": "AWS::EC2::SubnetRouteTableAssociation" + "logicalId": "NullParamNoEcho", + "entityType": "Parameter" }, - "propertyPath": "Properties.SubnetId", - "suggestedFix": "Associate each subnet with exactly one route table", - "category": "Resource", - "startLine": 27, - "startColumn": 9, - "endLine": 27, - "endColumn": 17, - "ruleDescription": "Resource SubnetRouteTableAssociation Properties", - "phase": "LINT" + "propertyPath": "Parameters/NullParamNoEcho/NoEcho", + "category": "Parameter", + "startLine": 57, + "startColumn": 5, + "endLine": 57, + "endColumn": 11, + "ruleDescription": "Parameters have appropriate properties", + "phase": "PARSE" }, { - "ruleId": "E3022", - "severity": "ERROR", - "message": "SubnetId in PrivateSubnetRouteTableAssociation1 is also associated with PublicSubnetRouteTableAssociation1", + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'allowedValuesNotAList' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "PrivateSubnetRouteTableAssociation1", - "entityType": "Resource", - "resourceType": "AWS::EC2::SubnetRouteTableAssociation" + "logicalId": "allowedValuesNotAList", + "entityType": "Parameter" }, - "propertyPath": "Properties.SubnetId", - "suggestedFix": "Associate each subnet with exactly one route table", - "category": "Resource", - "startLine": 35, - "startColumn": 9, - "endLine": 35, - "endColumn": 17, - "ruleDescription": "Resource SubnetRouteTableAssociation Properties", + "propertyPath": "Parameters/allowedValuesNotAList", + "category": "Best Practice", + "startLine": 4, + "startColumn": 3, + "endLine": 4, + "endColumn": 24, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "E3022", - "severity": "ERROR", - "message": "SubnetId in AuxiliaryPublicSubnetRouteTableAssociation1 is also associated with PublicSubnetRouteTableAssociation1, PrivateSubnetRouteTableAssociation1, ProxySubnetRouteTableAssociation", + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'allowedValuesAListofBadTypes' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "AuxiliaryPublicSubnetRouteTableAssociation1", - "entityType": "Resource", - "resourceType": "AWS::EC2::SubnetRouteTableAssociation" + "logicalId": "allowedValuesAListofBadTypes", + "entityType": "Parameter" }, - "propertyPath": "Properties.SubnetId", - "suggestedFix": "Associate each subnet with exactly one route table", - "category": "Resource", - "startLine": 44, - "startColumn": 9, - "endLine": 44, - "endColumn": 17, - "ruleDescription": "Resource SubnetRouteTableAssociation Properties", + "propertyPath": "Parameters/allowedValuesAListofBadTypes", + "category": "Best Practice", + "startLine": 7, + "startColumn": 3, + "endLine": 7, + "endColumn": 31, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "E3022", - "severity": "ERROR", - "message": "SubnetId in ProxySubnetRouteTableAssociation is also associated with PublicSubnetRouteTableAssociation1, PrivateSubnetRouteTableAssociation1, AuxiliaryPublicSubnetRouteTableAssociation1", + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'minValueIsNotNumber' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "ProxySubnetRouteTableAssociation", - "entityType": "Resource", - "resourceType": "AWS::EC2::SubnetRouteTableAssociation" + "logicalId": "minValueIsNotNumber", + "entityType": "Parameter" }, - "propertyPath": "Properties.SubnetId", - "suggestedFix": "Associate each subnet with exactly one route table", - "category": "Resource", - "startLine": 52, - "startColumn": 9, - "endLine": 52, - "endColumn": 17, - "ruleDescription": "Resource SubnetRouteTableAssociation Properties", + "propertyPath": "Parameters/minValueIsNotNumber", + "category": "Best Practice", + "startLine": 11, + "startColumn": 3, + "endLine": 11, + "endColumn": 22, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "E3022", - "severity": "ERROR", - "message": "SubnetId in AuxilliaryCustomSubnetRouteTableAssociation is also associated with CustomSubnetRouteTableAssociation", + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'maxLengthIsNotString' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "AuxilliaryCustomSubnetRouteTableAssociation", - "entityType": "Resource", - "resourceType": "AWS::EC2::SubnetRouteTableAssociation" + "logicalId": "maxLengthIsNotString", + "entityType": "Parameter" }, - "propertyPath": "Properties.SubnetId", - "suggestedFix": "Associate each subnet with exactly one route table", - "category": "Resource", - "startLine": 74, - "startColumn": 9, - "endLine": 74, - "endColumn": 17, - "ruleDescription": "Resource SubnetRouteTableAssociation Properties", + "propertyPath": "Parameters/maxLengthIsNotString", + "category": "Best Practice", + "startLine": 14, + "startColumn": 3, + "endLine": 14, + "endColumn": 23, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "E8002", - "severity": "ERROR", - "message": "Condition 'CreateAuxiliaryNetworks' referenced by resource 'AuxiliaryPublicSubnetRouteTableAssociation1' is not defined", - "source": "SCHEMA", + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'notBooleanEcho' is not referenced anywhere in the template", + "source": "CFN_LINT", "entity": { - "logicalId": "AuxiliaryPublicSubnetRouteTableAssociation1", - "entityType": "Resource", - "resourceType": "AWS::EC2::SubnetRouteTableAssociation" + "logicalId": "notBooleanEcho", + "entityType": "Parameter" }, - "category": "Structure", - "startLine": 38, + "propertyPath": "Parameters/notBooleanEcho", + "category": "Best Practice", + "startLine": 17, "startColumn": 3, - "endLine": 38, - "endColumn": 46, - "ruleDescription": "Condition referenced by resource is not defined", - "phase": "PARSE" + "endLine": 17, + "endColumn": 17, + "ruleDescription": "Check if Parameters are Used", + "phase": "LINT" }, { - "ruleId": "E8002", - "severity": "ERROR", - "message": "Condition 'CreateAuxiliaryNetworks' referenced by resource 'AuxilliaryCustomSubnetRouteTableAssociation' is not defined", - "source": "SCHEMA", + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'myParameter' is not referenced anywhere in the template", + "source": "CFN_LINT", "entity": { - "logicalId": "AuxilliaryCustomSubnetRouteTableAssociation", - "entityType": "Resource", - "resourceType": "AWS::EC2::SubnetRouteTableAssociation" + "logicalId": "myParameter", + "entityType": "Parameter" }, - "category": "Structure", - "startLine": 68, + "propertyPath": "Parameters/myParameter", + "category": "Best Practice", + "startLine": 20, "startColumn": 3, - "endLine": 68, - "endColumn": 46, - "ruleDescription": "Condition referenced by resource is not defined", - "phase": "PARSE" + "endLine": 20, + "endColumn": 14, + "ruleDescription": "Check if Parameters are Used", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'myInvalidParameter' is not referenced anywhere in the template", + "source": "CFN_LINT", "entity": { - "logicalId": "PublicSubnetRouteTableAssociation1", - "entityType": "Resource", - "resourceType": "AWS::EC2::SubnetRouteTableAssociation" + "logicalId": "myInvalidParameter", + "entityType": "Parameter" }, - "propertyPath": "Properties.RouteTableId", + "propertyPath": "Parameters/myInvalidParameter", "category": "Best Practice", "startLine": 25, - "startColumn": 9, + "startColumn": 3, "endLine": 25, "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter 'PublicRouteTable' (type String)", - "extra": { - "replacement_strategy": "delete_then_create" - } - } + "ruleDescription": "Check if Parameters are Used", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'mySsmParam' is not referenced anywhere in the template", + "source": "CFN_LINT", "entity": { - "logicalId": "PublicSubnetRouteTableAssociation1", - "entityType": "Resource", - "resourceType": "AWS::EC2::SubnetRouteTableAssociation" + "logicalId": "mySsmParam", + "entityType": "Parameter" }, - "propertyPath": "Properties.SubnetId", + "propertyPath": "Parameters/mySsmParam", "category": "Best Practice", - "startLine": 27, - "startColumn": 9, - "endLine": 27, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter 'PublicSubnet01' (type String)", - "extra": { - "replacement_strategy": "delete_then_create" - } - } + "startLine": 28, + "startColumn": 3, + "endLine": 28, + "endColumn": 13, + "ruleDescription": "Check if Parameters are Used", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'NullParamType' is not referenced anywhere in the template", + "source": "CFN_LINT", "entity": { - "logicalId": "PrivateSubnetRouteTableAssociation1", - "entityType": "Resource", - "resourceType": "AWS::EC2::SubnetRouteTableAssociation" + "logicalId": "NullParamType", + "entityType": "Parameter" }, - "propertyPath": "Properties.RouteTableId", + "propertyPath": "Parameters/NullParamType", "category": "Best Practice", - "startLine": 33, - "startColumn": 9, - "endLine": 33, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter 'PrivateRouteTable' (type String)", - "extra": { - "replacement_strategy": "delete_then_create" - } - } + "startLine": 35, + "startColumn": 3, + "endLine": 35, + "endColumn": 16, + "ruleDescription": "Check if Parameters are Used", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'NullParamDefault' is not referenced anywhere in the template", + "source": "CFN_LINT", "entity": { - "logicalId": "PrivateSubnetRouteTableAssociation1", - "entityType": "Resource", - "resourceType": "AWS::EC2::SubnetRouteTableAssociation" + "logicalId": "NullParamDefault", + "entityType": "Parameter" }, - "propertyPath": "Properties.SubnetId", + "propertyPath": "Parameters/NullParamDefault", "category": "Best Practice", - "startLine": 35, - "startColumn": 9, - "endLine": 35, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter 'PublicSubnet01' (type String)", - "extra": { - "replacement_strategy": "delete_then_create" - } - } + "startLine": 37, + "startColumn": 3, + "endLine": 37, + "endColumn": 19, + "ruleDescription": "Check if Parameters are Used", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'NullParamDescription' is not referenced anywhere in the template", + "source": "CFN_LINT", "entity": { - "logicalId": "AuxiliaryPublicSubnetRouteTableAssociation1", - "entityType": "Resource", - "resourceType": "AWS::EC2::SubnetRouteTableAssociation" + "logicalId": "NullParamDescription", + "entityType": "Parameter" }, - "propertyPath": "Properties.RouteTableId", + "propertyPath": "Parameters/NullParamDescription", "category": "Best Practice", - "startLine": 42, - "startColumn": 9, - "endLine": 42, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter 'PublicRouteTable' (type String)", - "extra": { - "replacement_strategy": "delete_then_create" - } - } + "startLine": 40, + "startColumn": 3, + "endLine": 40, + "endColumn": 23, + "ruleDescription": "Check if Parameters are Used", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'NullParamMaxValue' is not referenced anywhere in the template", + "source": "CFN_LINT", "entity": { - "logicalId": "AuxiliaryPublicSubnetRouteTableAssociation1", - "entityType": "Resource", - "resourceType": "AWS::EC2::SubnetRouteTableAssociation" + "logicalId": "NullParamMaxValue", + "entityType": "Parameter" }, - "propertyPath": "Properties.SubnetId", + "propertyPath": "Parameters/NullParamMaxValue", "category": "Best Practice", - "startLine": 44, - "startColumn": 9, - "endLine": 44, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter 'PublicSubnet01' (type String)", - "extra": { - "replacement_strategy": "delete_then_create" - } - } + "startLine": 43, + "startColumn": 3, + "endLine": 43, + "endColumn": 20, + "ruleDescription": "Check if Parameters are Used", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'NullParamMinValue' is not referenced anywhere in the template", + "source": "CFN_LINT", "entity": { - "logicalId": "ProxySubnetRouteTableAssociation", - "entityType": "Resource", - "resourceType": "AWS::EC2::SubnetRouteTableAssociation" + "logicalId": "NullParamMinValue", + "entityType": "Parameter" }, - "propertyPath": "Properties.RouteTableId", + "propertyPath": "Parameters/NullParamMinValue", "category": "Best Practice", - "startLine": 50, - "startColumn": 9, - "endLine": 50, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter 'PublicRouteTable' (type String)", - "extra": { - "replacement_strategy": "delete_then_create" - } - } + "startLine": 46, + "startColumn": 3, + "endLine": 46, + "endColumn": 20, + "ruleDescription": "Check if Parameters are Used", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'NullParamMaxLength' is not referenced anywhere in the template", + "source": "CFN_LINT", "entity": { - "logicalId": "ProxySubnetRouteTableAssociation", - "entityType": "Resource", - "resourceType": "AWS::EC2::SubnetRouteTableAssociation" + "logicalId": "NullParamMaxLength", + "entityType": "Parameter" }, - "propertyPath": "Properties.SubnetId", + "propertyPath": "Parameters/NullParamMaxLength", "category": "Best Practice", - "startLine": 52, - "startColumn": 9, - "endLine": 52, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Fn::If on condition 'isPublic'", - "extra": { - "replacement_strategy": "delete_then_create" - } - } + "startLine": 49, + "startColumn": 3, + "endLine": 49, + "endColumn": 21, + "ruleDescription": "Check if Parameters are Used", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ServiceToken' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'NullParamMinLength' is not referenced anywhere in the template", + "source": "CFN_LINT", "entity": { - "logicalId": "CustomResource", - "entityType": "Resource", - "resourceType": "AWS::CloudFormation::CustomResource" + "logicalId": "NullParamMinLength", + "entityType": "Parameter" }, - "propertyPath": "Properties.ServiceToken", + "propertyPath": "Parameters/NullParamMinLength", "category": "Best Practice", - "startLine": 58, - "startColumn": 9, - "endLine": 58, + "startLine": 52, + "startColumn": 3, + "endLine": 52, "endColumn": 21, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "ruleDescription": "Check if Parameters are Used", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'NullParamNoEcho' is not referenced anywhere in the template", + "source": "CFN_LINT", "entity": { - "logicalId": "CustomSubnetRouteTableAssociation", - "entityType": "Resource", - "resourceType": "AWS::EC2::SubnetRouteTableAssociation" + "logicalId": "NullParamNoEcho", + "entityType": "Parameter" }, - "propertyPath": "Properties.RouteTableId", + "propertyPath": "Parameters/NullParamNoEcho", "category": "Best Practice", - "startLine": 63, - "startColumn": 9, - "endLine": 63, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter 'PublicRouteTable' (type String)", - "extra": { - "replacement_strategy": "delete_then_create" - } - } + "startLine": 55, + "startColumn": 3, + "endLine": 55, + "endColumn": 18, + "ruleDescription": "Check if Parameters are Used", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "CustomSubnetRouteTableAssociation", + "logicalId": "IamPipeline", "entityType": "Resource", - "resourceType": "AWS::EC2::SubnetRouteTableAssociation" + "resourceType": "AWS::CloudFormation::Stack" }, - "propertyPath": "Properties.SubnetId", "category": "Best Practice", - "startLine": 65, - "startColumn": 9, - "endLine": 65, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt CustomResource.PublicSubnet", - "extra": { - "replacement_strategy": "delete_then_create" - } - } + "startLine": 60, + "startColumn": 3, + "endLine": 60, + "endColumn": 14, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "AuxilliaryCustomSubnetRouteTableAssociation", + "logicalId": "IamPipeline", "entityType": "Resource", - "resourceType": "AWS::EC2::SubnetRouteTableAssociation" + "resourceType": "AWS::CloudFormation::Stack" }, - "propertyPath": "Properties.RouteTableId", "category": "Best Practice", - "startLine": 72, - "startColumn": 9, - "endLine": 72, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter 'PublicRouteTable' (type String)", - "extra": { - "replacement_strategy": "delete_then_create" - } - } + "startLine": 60, + "startColumn": 3, + "endLine": 60, + "endColumn": 14, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", + "message": "Resource 'IamPipeline' of type 'AWS::CloudFormation::Stack' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "AuxilliaryCustomSubnetRouteTableAssociation", + "logicalId": "IamPipeline", "entityType": "Resource", - "resourceType": "AWS::EC2::SubnetRouteTableAssociation" + "resourceType": "AWS::CloudFormation::Stack" }, - "propertyPath": "Properties.SubnetId", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 74, - "startColumn": 9, - "endLine": 74, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt CustomResource.PublicSubnet", - "extra": { - "replacement_strategy": "delete_then_create" - } - } + "startLine": 62, + "startColumn": 5, + "endLine": 62, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" } ] }, - "bad/properties_sg_ingress.yaml": { - "filePath": "bad/properties_sg_ingress.yaml", + "bad/parameters/default.yaml": { + "filePath": "bad/parameters/default.yaml", "status": "OK", "metadata": { - "resourcesScanned": 9, + "resourcesScanned": 0, "counts": { - "fatal": 5, - "errors": 13, - "warnings": 7, - "informational": 21, + "fatal": 11, + "errors": 3, + "warnings": 9, + "informational": 0, "debug": 0 }, "suppressed": 0, @@ -76289,539 +74767,677 @@ }, "diagnostics": [ { - "ruleId": "F3003", + "ruleId": "F0001", "severity": "FATAL", - "message": "'IpProtocol' is a required property", + "message": "Resources section must exist and be non-empty", + "source": "SCHEMA", + "category": "Structure", + "startLine": 61, + "startColumn": 1, + "endLine": 61, + "endColumn": 10, + "ruleDescription": "Resources section must exist and be non-empty", + "phase": "SCHEMA" + }, + { + "ruleId": "F2012", + "severity": "FATAL", + "message": "Parameter 'myAllowedValue' Default 'us-east-1a' is not in AllowedValues ['us-east-1b', 'us-east-1c', 'us-east-1d']", "source": "SCHEMA", "entity": { - "logicalId": "mySecurityGroupIngressExclusive", - "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" + "logicalId": "myAllowedValue", + "entityType": "Parameter" }, - "propertyPath": "Properties", - "suggestedFix": "Add the required property 'IpProtocol'", - "category": "Schema", - "startLine": 73, + "propertyPath": "Parameters/myAllowedValue/Default", + "category": "Parameter", + "startLine": 18, "startColumn": 5, - "endLine": 73, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Required property missing", + "endLine": 18, + "endColumn": 12, + "ruleDescription": "Parameter Default must be in AllowedValues", "phase": "SCHEMA" }, { - "ruleId": "F3014", + "ruleId": "F2012", "severity": "FATAL", - "message": "Exactly one of ['CidrIp', 'CidrIpv6', 'SourcePrefixListId', 'SourceSecurityGroupId', 'SourceSecurityGroupName'] must be specified", + "message": "Parameter 'CDLAllowedValues' Default 'three' is not in AllowedValues ['one', 'two', 'three,four']", "source": "SCHEMA", "entity": { - "logicalId": "mySecurityGroupVpc", - "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "logicalId": "CDLAllowedValues", + "entityType": "Parameter" }, - "propertyPath": "Properties.SecurityGroupIngress.1", - "category": "Schema", - "startLine": 38, - "startColumn": 19, - "endLine": 38, - "endColumn": 20, - "ruleDescription": "Exactly one of properties required (requiredXor)", + "propertyPath": "Parameters/CDLAllowedValues/Default", + "category": "Parameter", + "startLine": 47, + "startColumn": 5, + "endLine": 47, + "endColumn": 12, + "ruleDescription": "Parameter Default must be in AllowedValues", "phase": "SCHEMA" }, { - "ruleId": "F3014", + "ruleId": "F2012", "severity": "FATAL", - "message": "Exactly one of ['CidrIp', 'CidrIpv6', 'SourcePrefixListId', 'SourceSecurityGroupId', 'SourceSecurityGroupName'] must be specified", + "message": "Parameter 'CDLAllowedValuesWithSpaces' Default 'four' is not in AllowedValues ['one', 'two', 'three, four']", "source": "SCHEMA", "entity": { - "logicalId": "mySecurityGroupVpc", - "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "logicalId": "CDLAllowedValuesWithSpaces", + "entityType": "Parameter" }, - "propertyPath": "Properties.SecurityGroupIngress.4", - "category": "Schema", - "startLine": 48, - "startColumn": 19, - "endLine": 48, - "endColumn": 20, - "ruleDescription": "Exactly one of properties required (requiredXor)", + "propertyPath": "Parameters/CDLAllowedValuesWithSpaces/Default", + "category": "Parameter", + "startLine": 56, + "startColumn": 5, + "endLine": 56, + "endColumn": 12, + "ruleDescription": "Parameter Default must be in AllowedValues", "phase": "SCHEMA" }, { - "ruleId": "F3014", + "ruleId": "F2012", "severity": "FATAL", - "message": "Exactly one of ['CidrIp', 'CidrIpv6', 'SourcePrefixListId', 'SourceSecurityGroupId', 'SourceSecurityGroupName'] must be specified", + "message": "Parameter 'CDLAllowedValuesWithSpaces' Default 'three' is not in AllowedValues ['one', 'two', 'three, four']", "source": "SCHEMA", "entity": { - "logicalId": "mySecurityGroupIngressExclusive", - "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" + "logicalId": "CDLAllowedValuesWithSpaces", + "entityType": "Parameter" }, - "propertyPath": "Properties", - "category": "Schema", - "startLine": 73, + "propertyPath": "Parameters/CDLAllowedValuesWithSpaces/Default", + "category": "Parameter", + "startLine": 56, "startColumn": 5, - "endLine": 73, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Exactly one of properties required (requiredXor)", + "endLine": 56, + "endColumn": 12, + "ruleDescription": "Parameter Default must be in AllowedValues", "phase": "SCHEMA" }, { - "ruleId": "F3031", + "ruleId": "F2015", "severity": "FATAL", - "message": "'Special charaters like ^ and \" are not supported' does not match pattern '^([a-z,A-Z,0-9,. _\\-:/()#,@[\\]+=&;\\{\\}!$*])*$'", + "message": "Parameter 'myAllowedPattern' Default 'vpc!@#$' does not match AllowedPattern '^[a-zA-Z0-9]*$'", "source": "SCHEMA", "entity": { - "logicalId": "mySecurityGroupNonVpc", - "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "logicalId": "myAllowedPattern", + "entityType": "Parameter" }, - "propertyPath": "Properties.GroupDescription", - "category": "Schema", - "startLine": 23, - "startColumn": 7, - "endLine": 23, - "endColumn": 23, - "ruleDescription": "Value does not match pattern", - "phase": "SCHEMA", - "context": { - "actualValue": "Special charaters like ^ and \" are not supported", - "expectedConstraint": "^([a-z,A-Z,0-9,. _\\-:/()#,@[\\]+=&;\\{\\}!$*])*$" - } + "propertyPath": "Parameters/myAllowedPattern/Default", + "category": "Parameter", + "startLine": 6, + "startColumn": 5, + "endLine": 6, + "endColumn": 12, + "ruleDescription": "Default value is within parameter constraints", + "phase": "SCHEMA" }, { - "ruleId": "E1041", + "ruleId": "F2015", + "severity": "FATAL", + "message": "Parameter 'myMinValue' Default 0 is less than MinValue 1", + "source": "SCHEMA", + "entity": { + "logicalId": "myMinValue", + "entityType": "Parameter" + }, + "propertyPath": "Parameters/myMinValue/Default", + "category": "Parameter", + "startLine": 10, + "startColumn": 5, + "endLine": 10, + "endColumn": 12, + "ruleDescription": "Default value is within parameter constraints", + "phase": "SCHEMA" + }, + { + "ruleId": "F2015", + "severity": "FATAL", + "message": "Parameter 'myMaxValue' Default 1 exceeds MaxValue 0", + "source": "SCHEMA", + "entity": { + "logicalId": "myMaxValue", + "entityType": "Parameter" + }, + "propertyPath": "Parameters/myMaxValue/Default", + "category": "Parameter", + "startLine": 14, + "startColumn": 5, + "endLine": 14, + "endColumn": 12, + "ruleDescription": "Default value is within parameter constraints", + "phase": "SCHEMA" + }, + { + "ruleId": "F2015", + "severity": "FATAL", + "message": "Parameter 'myMinLength' Default length 3 is less than MinLength 5", + "source": "SCHEMA", + "entity": { + "logicalId": "myMinLength", + "entityType": "Parameter" + }, + "propertyPath": "Parameters/myMinLength/Default", + "category": "Parameter", + "startLine": 25, + "startColumn": 5, + "endLine": 25, + "endColumn": 12, + "ruleDescription": "Default value is within parameter constraints", + "phase": "SCHEMA" + }, + { + "ruleId": "F2015", + "severity": "FATAL", + "message": "Parameter 'myMaxLength' Default length 3 exceeds MaxLength 1", + "source": "SCHEMA", + "entity": { + "logicalId": "myMaxLength", + "entityType": "Parameter" + }, + "propertyPath": "Parameters/myMaxLength/Default", + "category": "Parameter", + "startLine": 29, + "startColumn": 5, + "endLine": 29, + "endColumn": 12, + "ruleDescription": "Default value is within parameter constraints", + "phase": "SCHEMA" + }, + { + "ruleId": "F2015", + "severity": "FATAL", + "message": "Parameter 'CDLAllowedPattern' Default does not match AllowedPattern '[a-z]*$'", + "source": "SCHEMA", + "entity": { + "logicalId": "CDLAllowedPattern", + "entityType": "Parameter" + }, + "propertyPath": "Parameters/CDLAllowedPattern/Default", + "category": "Parameter", + "startLine": 42, + "startColumn": 5, + "endLine": 42, + "endColumn": 12, + "ruleDescription": "Default value is within parameter constraints", + "phase": "SCHEMA" + }, + { + "ruleId": "E2001", "severity": "ERROR", - "message": "{'Ref': 'mySecurityGroupNonVpc'} with formats ['AWS::EC2::SecurityGroup.Name'] does not match destination format of 'AWS::EC2::SecurityGroup.Id'", + "message": "Parameter 'MyEmptyDefault': Default must be a string", "source": "CFN_LINT", "entity": { - "logicalId": "mySecurityGroupVpc", - "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "logicalId": "MyEmptyDefault", + "entityType": "Parameter" }, - "propertyPath": "Properties.SecurityGroupIngress.3.SourceSecurityGroupId", - "suggestedFix": "Use a Ref to a resource whose type matches the expected format", - "category": "Intrinsic Function", - "startLine": 46, - "startColumn": 9, - "endLine": 46, - "endColumn": 30, - "ruleDescription": "Check if Ref matches destination format", - "phase": "LINT" + "propertyPath": "Parameters/MyEmptyDefault/Default", + "category": "Parameter", + "startLine": 33, + "startColumn": 5, + "endLine": 33, + "endColumn": 12, + "ruleDescription": "Parameters have appropriate properties", + "phase": "PARSE" }, { - "ruleId": "E1041", + "ruleId": "E2001", "severity": "ERROR", - "message": "{'Ref': 'mySecurityGroupNonVpc'} with formats ['AWS::EC2::SecurityGroup.Name'] does not match destination format of 'AWS::EC2::SecurityGroup.Id'", + "message": "Parameter 'MyRefDefault': Type must be a string", + "source": "CFN_LINT", + "entity": { + "logicalId": "MyRefDefault", + "entityType": "Parameter" + }, + "propertyPath": "Parameters/MyRefDefault/Type", + "category": "Parameter", + "startLine": 35, + "startColumn": 5, + "endLine": 35, + "endColumn": 9, + "ruleDescription": "Parameters have appropriate properties", + "phase": "PARSE" + }, + { + "ruleId": "E2001", + "severity": "ERROR", + "message": "Parameter 'MyRefDefault': Default must be a string", "source": "CFN_LINT", "entity": { - "logicalId": "mySecurityGroupIngress", - "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" + "logicalId": "MyRefDefault", + "entityType": "Parameter" }, - "propertyPath": "Properties.SourceSecurityGroupId", - "suggestedFix": "Use a Ref to a resource whose type matches the expected format", - "category": "Intrinsic Function", - "startLine": 64, - "startColumn": 7, - "endLine": 64, - "endColumn": 28, - "ruleDescription": "Check if Ref matches destination format", - "phase": "LINT" + "propertyPath": "Parameters/MyRefDefault/Default", + "category": "Parameter", + "startLine": 36, + "startColumn": 5, + "endLine": 36, + "endColumn": 12, + "ruleDescription": "Parameters have appropriate properties", + "phase": "PARSE" }, { - "ruleId": "E1150", - "severity": "ERROR", - "message": "'sg-1234567' does not match format 'AWS::EC2::SecurityGroup.Id'", + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'myAllowedPattern' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "mySecurityGroupNonVpc", - "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "logicalId": "myAllowedPattern", + "entityType": "Parameter" }, - "propertyPath": "Properties.SecurityGroupIngress.0.SourceSecurityGroupId", - "category": "Intrinsic Function", - "startLine": 27, - "startColumn": 9, - "endLine": 27, - "endColumn": 30, - "ruleDescription": "Validate security group format", - "phase": "SCHEMA", - "context": { - "actualValue": "sg-1234567" - } + "propertyPath": "Parameters/myAllowedPattern", + "category": "Best Practice", + "startLine": 4, + "startColumn": 3, + "endLine": 4, + "endColumn": 19, + "ruleDescription": "Check if Parameters are Used", + "phase": "LINT" }, { - "ruleId": "E1150", - "severity": "ERROR", - "message": "'vpc-1234567' does not match format 'AWS::EC2::SecurityGroup.Id'", + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'myMinValue' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "mySecurityGroupVpc", - "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "logicalId": "myMinValue", + "entityType": "Parameter" }, - "propertyPath": "Properties.SecurityGroupIngress.4.SourceSecurityGroupId", - "category": "Intrinsic Function", - "startLine": 49, - "startColumn": 9, - "endLine": 49, - "endColumn": 30, - "ruleDescription": "Validate security group format", - "phase": "SCHEMA", - "context": { - "actualValue": "vpc-1234567" - } + "propertyPath": "Parameters/myMinValue", + "category": "Best Practice", + "startLine": 8, + "startColumn": 3, + "endLine": 8, + "endColumn": 13, + "ruleDescription": "Check if Parameters are Used", + "phase": "LINT" }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-123456' does not match format 'AWS::EC2::Image.Id'", + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'myMaxValue' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "myInstance", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "logicalId": "myMaxValue", + "entityType": "Parameter" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 79, - "startColumn": 7, - "endLine": 79, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-123456" - } + "propertyPath": "Parameters/myMaxValue", + "category": "Best Practice", + "startLine": 12, + "startColumn": 3, + "endLine": 12, + "endColumn": 13, + "ruleDescription": "Check if Parameters are Used", + "phase": "LINT" }, { - "ruleId": "E3687", - "severity": "ERROR", - "message": "['FromPort', 'ToPort'] are required properties when using 'IpProtocol' value 1", + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'myAllowedValue' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "mySecurityGroupNonVpc", - "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "logicalId": "myAllowedValue", + "entityType": "Parameter" }, - "propertyPath": "Properties.SecurityGroupIngress.0", - "category": "Resource", - "startLine": 26, - "startColumn": 19, - "endLine": 26, - "endColumn": 20, - "ruleDescription": "Validate to and from ports based on the protocol", + "propertyPath": "Parameters/myAllowedValue", + "category": "Best Practice", + "startLine": 16, + "startColumn": 3, + "endLine": 16, + "endColumn": 17, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "E3687", - "severity": "ERROR", - "message": "['FromPort', 'ToPort'] are required properties when using 'IpProtocol' value 1", + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'MyEmptyDefault' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "mySecurityGroupVpc", - "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "logicalId": "MyEmptyDefault", + "entityType": "Parameter" }, - "propertyPath": "Properties.SecurityGroupIngress.0", - "category": "Resource", - "startLine": 35, - "startColumn": 19, - "endLine": 35, - "endColumn": 20, - "ruleDescription": "Validate to and from ports based on the protocol", + "propertyPath": "Parameters/MyEmptyDefault", + "category": "Best Practice", + "startLine": 31, + "startColumn": 3, + "endLine": 31, + "endColumn": 17, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "E3687", - "severity": "ERROR", - "message": "['FromPort', 'ToPort'] are required properties when using 'IpProtocol' value 1", + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'MyRefDefault' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "mySecurityGroupVpc", - "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "logicalId": "MyRefDefault", + "entityType": "Parameter" }, - "propertyPath": "Properties.SecurityGroupIngress.1", - "category": "Resource", - "startLine": 38, - "startColumn": 19, - "endLine": 38, - "endColumn": 20, - "ruleDescription": "Validate to and from ports based on the protocol", + "propertyPath": "Parameters/MyRefDefault", + "category": "Best Practice", + "startLine": 34, + "startColumn": 3, + "endLine": 34, + "endColumn": 15, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "E3687", - "severity": "ERROR", - "message": "['FromPort', 'ToPort'] are required properties when using 'IpProtocol' value 1", + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'CDLAllowedPattern' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "mySecurityGroupVpc", - "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "logicalId": "CDLAllowedPattern", + "entityType": "Parameter" }, - "propertyPath": "Properties.SecurityGroupIngress.2", - "category": "Resource", - "startLine": 42, - "startColumn": 19, - "endLine": 42, + "propertyPath": "Parameters/CDLAllowedPattern", + "category": "Best Practice", + "startLine": 37, + "startColumn": 3, + "endLine": 37, "endColumn": 20, - "ruleDescription": "Validate to and from ports based on the protocol", + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "E3687", - "severity": "ERROR", - "message": "['FromPort', 'ToPort'] are required properties when using 'IpProtocol' value 1", + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'CDLAllowedValues' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "mySecurityGroupVpc", - "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "logicalId": "CDLAllowedValues", + "entityType": "Parameter" }, - "propertyPath": "Properties.SecurityGroupIngress.3", - "category": "Resource", - "startLine": 45, - "startColumn": 19, - "endLine": 45, - "endColumn": 20, - "ruleDescription": "Validate to and from ports based on the protocol", + "propertyPath": "Parameters/CDLAllowedValues", + "category": "Best Practice", + "startLine": 43, + "startColumn": 3, + "endLine": 43, + "endColumn": 19, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "E3687", - "severity": "ERROR", - "message": "['FromPort', 'ToPort'] are required properties when using 'IpProtocol' value 1", + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'CDLAllowedValuesWithSpaces' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "mySecurityGroupVpc", - "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "logicalId": "CDLAllowedValuesWithSpaces", + "entityType": "Parameter" }, - "propertyPath": "Properties.SecurityGroupIngress.4", - "category": "Resource", - "startLine": 48, - "startColumn": 19, - "endLine": 48, - "endColumn": 20, - "ruleDescription": "Validate to and from ports based on the protocol", + "propertyPath": "Parameters/CDLAllowedValuesWithSpaces", + "category": "Best Practice", + "startLine": 52, + "startColumn": 3, + "endLine": 52, + "endColumn": 29, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" + } + ] + }, + "bad/pipeline_no_source_first_stage.yaml": { + "filePath": "bad/pipeline_no_source_first_stage.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 2, + "errors": 1, + "warnings": 2, + "informational": 2, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "E3687", - "severity": "ERROR", - "message": "['FromPort', 'ToPort'] are required properties when using 'IpProtocol' value 1", - "source": "CFN_LINT", + "ruleId": "F3014", + "severity": "FATAL", + "message": "Exactly one of ['ArtifactStore', 'ArtifactStores'] must be specified", + "source": "SCHEMA", "entity": { - "logicalId": "mySecurityGroupIngress", + "logicalId": "Pipeline", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" + "resourceType": "AWS::CodePipeline::Pipeline" }, "propertyPath": "Properties", - "category": "Resource", - "startLine": 61, + "category": "Schema", + "startLine": 5, "startColumn": 5, - "endLine": 61, + "endLine": 5, "endColumn": 15, - "ruleDescription": "Validate to and from ports based on the protocol", - "phase": "LINT" + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-codepipeline", + "ruleDescription": "Exactly one of properties required (requiredXor)", + "phase": "SCHEMA" }, { - "ruleId": "E3687", - "severity": "ERROR", - "message": "['FromPort', 'ToPort'] are required properties when using 'IpProtocol' value 1", - "source": "CFN_LINT", + "ruleId": "F3032", + "severity": "FATAL", + "message": "expected minimum item count: 2, found: 1", + "source": "SCHEMA", "entity": { - "logicalId": "mySecurityGroupIngress2", + "logicalId": "Pipeline", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" + "resourceType": "AWS::CodePipeline::Pipeline" }, - "propertyPath": "Properties", - "category": "Resource", - "startLine": 67, - "startColumn": 5, - "endLine": 67, - "endColumn": 15, - "ruleDescription": "Validate to and from ports based on the protocol", - "phase": "LINT" + "propertyPath": "Properties.Stages", + "category": "Schema", + "startLine": 8, + "startColumn": 7, + "endLine": 8, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-codepipeline", + "ruleDescription": "Array item count out of bounds", + "phase": "SCHEMA", + "context": { + "extra": { + "actual_count": 1, + "min_items": 2 + } + } }, { - "ruleId": "W9003", - "severity": "WARN", - "message": "1 is not of type 'string' - automatically coerced (number to string)", + "ruleId": "E3700", + "severity": "ERROR", + "message": "First stage of a pipeline must contain at least one Source action", "source": "CFN_LINT", "entity": { - "logicalId": "mySecurityGroupNonVpc", + "logicalId": "Pipeline", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::CodePipeline::Pipeline" }, - "propertyPath": "Properties.SecurityGroupIngress.0.IpProtocol", - "category": "Best Practice", - "startLine": 26, - "startColumn": 9, - "endLine": 26, - "endColumn": 19, - "ruleDescription": "Property type coercion warning", - "phase": "SCHEMA" + "propertyPath": "Properties.Stages[0]", + "suggestedFix": "Add an action with ActionTypeId.Category=Source to the first stage", + "category": "Resource", + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Validate CodePipeline Source actions are only in the first stage", + "phase": "LINT" }, { - "ruleId": "W9003", + "ruleId": "W9002", "severity": "WARN", - "message": "1 is not of type 'string' - automatically coerced (number to string)", - "source": "CFN_LINT", + "message": "Property 'RoleArn' has a hardcoded ARN - use Ref, GetAtt, or a parameter instead", + "source": "ENGINE", "entity": { - "logicalId": "mySecurityGroupVpc", + "logicalId": "Pipeline", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::CodePipeline::Pipeline" }, - "propertyPath": "Properties.SecurityGroupIngress.0.IpProtocol", + "propertyPath": "Properties.RoleArn", "category": "Best Practice", - "startLine": 35, - "startColumn": 9, - "endLine": 35, - "endColumn": 19, - "ruleDescription": "Property type coercion warning", - "phase": "SCHEMA" + "startLine": 7, + "startColumn": 7, + "endLine": 7, + "endColumn": 14, + "ruleDescription": "Hardcoded ARN property", + "phase": "LINT" }, { - "ruleId": "W9003", + "ruleId": "W9013", "severity": "WARN", - "message": "1 is not of type 'string' - automatically coerced (number to string)", - "source": "CFN_LINT", + "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", + "source": "ENGINE", "entity": { - "logicalId": "mySecurityGroupVpc", + "logicalId": "Pipeline", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::CodePipeline::Pipeline" }, - "propertyPath": "Properties.SecurityGroupIngress.1.IpProtocol", - "category": "Best Practice", - "startLine": 38, - "startColumn": 9, - "endLine": 38, - "endColumn": 19, - "ruleDescription": "Property type coercion warning", - "phase": "SCHEMA" + "category": "Security", + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 11, + "ruleDescription": "Hardcoded account ID in ARN", + "phase": "LINT" }, { - "ruleId": "W9003", - "severity": "WARN", - "message": "1 is not of type 'string' - automatically coerced (number to string)", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Name' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "mySecurityGroupVpc", + "logicalId": "Pipeline", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::CodePipeline::Pipeline" }, - "propertyPath": "Properties.SecurityGroupIngress.3.IpProtocol", + "propertyPath": "Properties.Name", "category": "Best Practice", - "startLine": 45, - "startColumn": 9, - "endLine": 45, - "endColumn": 19, - "ruleDescription": "Property type coercion warning", - "phase": "SCHEMA" + "startLine": 6, + "startColumn": 7, + "endLine": 6, + "endColumn": 11, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-codepipeline", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W9003", - "severity": "WARN", - "message": "1 is not of type 'string' - automatically coerced (number to string)", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Pipeline' of type 'AWS::CodePipeline::Pipeline' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "mySecurityGroupVpc", + "logicalId": "Pipeline", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::CodePipeline::Pipeline" }, - "propertyPath": "Properties.SecurityGroupIngress.4.IpProtocol", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 48, - "startColumn": 9, - "endLine": 48, - "endColumn": 19, - "ruleDescription": "Property type coercion warning", - "phase": "SCHEMA" + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "bad/previous_gen_instance.yaml": { + "filePath": "bad/previous_gen_instance.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 1, + "informational": 5, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "W9003", + "ruleId": "W9010", "severity": "WARN", - "message": "1 is not of type 'string' - automatically coerced (number to string)", - "source": "CFN_LINT", + "message": "Hardcoded AMI ID - use a parameter or mapping for portability", + "source": "ENGINE", "entity": { - "logicalId": "mySecurityGroupIngress", + "logicalId": "Instance", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.IpProtocol", - "category": "Best Practice", - "startLine": 63, + "propertyPath": "Properties.ImageId", + "category": "Security", + "startLine": 7, "startColumn": 7, - "endLine": 63, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Property type coercion warning", - "phase": "SCHEMA" + "endLine": 7, + "endColumn": 14, + "ruleDescription": "Hardcoded AMI ID", + "phase": "LINT" }, { - "ruleId": "W9003", - "severity": "WARN", - "message": "1 is not of type 'string' - automatically coerced (number to string)", + "ruleId": "I3100", + "severity": "INFO", + "message": "Previous generation instance type 'm1.small' - consider upgrading", "source": "CFN_LINT", "entity": { - "logicalId": "mySecurityGroupIngress2", + "logicalId": "Instance", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.IpProtocol", + "propertyPath": "Properties.InstanceType", + "suggestedFix": "Upgrade to a current generation instance type", "category": "Best Practice", - "startLine": 69, + "startLine": 6, "startColumn": 7, - "endLine": 69, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Property type coercion warning", - "phase": "SCHEMA" + "endLine": 6, + "endColumn": 19, + "ruleDescription": "Checks for legacy instance type generations", + "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", + "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "mySecurityGroupNonVpc", + "logicalId": "Instance", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.GroupDescription", + "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 23, + "startLine": 6, "startColumn": 7, - "endLine": 23, - "endColumn": 23, + "endLine": 6, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "mySecurityGroupVpc", + "logicalId": "Instance", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.GroupDescription", + "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 31, + "startLine": 7, "startColumn": 7, - "endLine": 31, - "endColumn": 23, + "endLine": 7, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -76829,332 +75445,361 @@ } }, { - "ruleId": "I9001", + "ruleId": "I9003", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", "source": "ENGINE", - "entity": { - "logicalId": "mySecurityGroupVpc", - "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" - }, - "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 32, - "startColumn": 7, - "endLine": 32, - "endColumn": 12, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter 'myVpcId' (type AWS::EC2::VPC::Id)" - } + "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'GroupId' is create-only; updating it will cause resource replacement", + "message": "Resource 'Instance' of type 'AWS::EC2::Instance' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "SecurityGroupRuleSSM", + "logicalId": "Instance", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.GroupId", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 54, + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "bad/previous_generation_instances.yaml": { + "filePath": "bad/previous_generation_instances.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 6, + "counts": { + "fatal": 1, + "errors": 2, + "warnings": 0, + "informational": 23, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "F3003", + "severity": "FATAL", + "message": "'AvailabilityZone' is a required property", + "source": "SCHEMA", + "entity": { + "logicalId": "Host", + "entityType": "Resource", + "resourceType": "AWS::EC2::Host" + }, + "propertyPath": "Properties", + "suggestedFix": "Add the required property 'AvailabilityZone'", + "category": "Schema", + "startLine": 26, + "startColumn": 5, + "endLine": 26, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Required property missing", + "phase": "SCHEMA" + }, + { + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-abc' does not match format 'AWS::EC2::Image.Id'", + "source": "CFN_LINT", + "entity": { + "logicalId": "Instance", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 8, "startColumn": 7, - "endLine": 54, + "endLine": 8, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", + "ruleDescription": "Validate AMI id format", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'mySecurityGroupVpc'" + "actualValue": "ami-abc" } }, { - "ruleId": "I9001", + "ruleId": "E3647", + "severity": "ERROR", + "message": "'cache.r3.large' is not valid in any region", + "source": "CFN_LINT", + "entity": { + "logicalId": "CacheCluster", + "entityType": "Resource", + "resourceType": "AWS::ElastiCache::CacheCluster" + }, + "propertyPath": "Properties.CacheNodeType", + "category": "Resource", + "startLine": 16, + "startColumn": 7, + "endLine": 16, + "endColumn": 20, + "ruleDescription": "Validate ElastiCache cluster cache node type", + "phase": "LINT" + }, + { + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'IpProtocol' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "SecurityGroupRuleSSM", + "logicalId": "Domain", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" + "resourceType": "AWS::Elasticsearch::Domain" }, - "propertyPath": "Properties.IpProtocol", "category": "Best Practice", - "startLine": 55, - "startColumn": 7, - "endLine": 55, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 2, + "startColumn": 3, + "endLine": 2, + "endColumn": 9, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'FromPort' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "SecurityGroupRuleSSM", + "logicalId": "Domain", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" + "resourceType": "AWS::Elasticsearch::Domain" }, - "propertyPath": "Properties.FromPort", "category": "Best Practice", - "startLine": 56, - "startColumn": 7, - "endLine": 56, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 2, + "startColumn": 3, + "endLine": 2, + "endColumn": 9, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'ToPort' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "SecurityGroupRuleSSM", + "logicalId": "DBInstance", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.ToPort", "category": "Best Practice", - "startLine": 57, - "startColumn": 7, - "endLine": 57, + "startLine": 9, + "startColumn": 3, + "endLine": 9, "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'CidrIp' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "SecurityGroupRuleSSM", + "logicalId": "DBInstance", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.CidrIp", "category": "Best Practice", - "startLine": 58, - "startColumn": 7, - "endLine": 58, + "startLine": 9, + "startColumn": 3, + "endLine": 9, "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "dynamic (dynamic reference: {{resolve:ssm:mysubnet}})" - } + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'GroupId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "mySecurityGroupIngress", + "logicalId": "CacheCluster", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" + "resourceType": "AWS::ElastiCache::CacheCluster" }, - "propertyPath": "Properties.GroupId", "category": "Best Practice", - "startLine": 62, - "startColumn": 7, - "endLine": 62, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'mySecurityGroupVpc'" - } + "startLine": 13, + "startColumn": 3, + "endLine": 13, + "endColumn": 15, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'IpProtocol' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "mySecurityGroupIngress", + "logicalId": "CacheCluster", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" + "resourceType": "AWS::ElastiCache::CacheCluster" }, - "propertyPath": "Properties.IpProtocol", "category": "Best Practice", - "startLine": 63, - "startColumn": 7, - "endLine": 63, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 13, + "startColumn": 3, + "endLine": 13, + "endColumn": 15, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'SourceSecurityGroupId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "mySecurityGroupIngress", + "logicalId": "Domain2", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" + "resourceType": "AWS::Elasticsearch::Domain" }, - "propertyPath": "Properties.SourceSecurityGroupId", "category": "Best Practice", - "startLine": 64, - "startColumn": 7, - "endLine": 64, - "endColumn": 28, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'mySecurityGroupNonVpc'" - } + "startLine": 19, + "startColumn": 3, + "endLine": 19, + "endColumn": 10, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'GroupId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "mySecurityGroupIngress2", + "logicalId": "Domain2", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" + "resourceType": "AWS::Elasticsearch::Domain" }, - "propertyPath": "Properties.GroupId", "category": "Best Practice", - "startLine": 68, - "startColumn": 7, - "endLine": 68, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'mySecurityGroupVpc'" - } + "startLine": 19, + "startColumn": 3, + "endLine": 19, + "endColumn": 10, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3100", "severity": "INFO", - "message": "Property 'IpProtocol' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "Previous generation instance type 'm1.small' - consider upgrading", + "source": "CFN_LINT", "entity": { - "logicalId": "mySecurityGroupIngress2", + "logicalId": "Instance", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.IpProtocol", + "propertyPath": "Properties.InstanceType", + "suggestedFix": "Upgrade to a current generation instance type", "category": "Best Practice", - "startLine": 69, + "startLine": 7, "startColumn": 7, - "endLine": 69, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "endLine": 7, + "endColumn": 19, + "ruleDescription": "Checks for legacy instance type generations", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3100", "severity": "INFO", - "message": "Property 'SourceSecurityGroupId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "Previous generation instance type 'db.t1.micro' - consider upgrading", + "source": "CFN_LINT", "entity": { - "logicalId": "mySecurityGroupIngress2", + "logicalId": "DBInstance", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.SourceSecurityGroupId", + "propertyPath": "Properties.DBInstanceClass", + "suggestedFix": "Upgrade to a current generation instance type", "category": "Best Practice", - "startLine": 70, + "startLine": 12, "startColumn": 7, - "endLine": 70, - "endColumn": 28, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter 'mySecurity3Group' (type String)" - } + "endLine": 12, + "endColumn": 22, + "ruleDescription": "Checks for legacy instance type generations", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3100", "severity": "INFO", - "message": "Property 'GroupId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "Previous generation instance type 'cache.r3.large' - consider upgrading", + "source": "CFN_LINT", "entity": { - "logicalId": "mySecurityGroupIngressExclusive", + "logicalId": "CacheCluster", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" + "resourceType": "AWS::ElastiCache::CacheCluster" }, - "propertyPath": "Properties.GroupId", + "propertyPath": "Properties.CacheNodeType", + "suggestedFix": "Upgrade to a current generation instance type", "category": "Best Practice", - "startLine": 74, + "startLine": 16, "startColumn": 7, - "endLine": 74, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'mySecurityGroupVpc'" - } + "endLine": 16, + "endColumn": 20, + "ruleDescription": "Checks for legacy instance type generations", + "phase": "LINT" + }, + { + "ruleId": "I3100", + "severity": "INFO", + "message": "Previous generation instance type 'm3.medium.elasticsearch' - consider upgrading", + "source": "CFN_LINT", + "entity": { + "logicalId": "Domain2", + "entityType": "Resource", + "resourceType": "AWS::Elasticsearch::Domain" + }, + "propertyPath": "Properties.ElasticsearchClusterConfig.InstanceType", + "suggestedFix": "Upgrade to a current generation instance type", + "category": "Best Practice", + "startLine": 23, + "startColumn": 9, + "endLine": 23, + "endColumn": 21, + "ruleDescription": "Checks for legacy instance type generations", + "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'GroupName' is create-only; updating it will cause resource replacement", + "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "mySecurityGroupIngressExclusive", + "logicalId": "Instance", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.GroupName", + "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 75, + "startLine": 7, "startColumn": 7, - "endLine": 75, - "endColumn": 16, + "endLine": 7, + "endColumn": 19, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } }, { @@ -77163,15 +75808,15 @@ "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "myInstance", + "logicalId": "Instance", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 79, + "startLine": 8, "startColumn": 7, - "endLine": 79, + "endLine": 8, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -77183,348 +75828,189 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'SecurityGroupIds' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'Engine' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "myInstance", + "logicalId": "CacheCluster", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::ElastiCache::CacheCluster" }, - "propertyPath": "Properties.SecurityGroupIds", + "propertyPath": "Properties.Engine", "category": "Best Practice", - "startLine": 80, + "startLine": 17, "startColumn": 7, - "endLine": 80, - "endColumn": 23, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 17, + "endColumn": 13, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only" } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'mySecurityGroupNonVpc' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", + "message": "Property 'InstanceType' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "mySecurityGroupNonVpc", + "logicalId": "Host", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::EC2::Host" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 22, - "startColumn": 5, - "endLine": 22, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "startLine": 27, + "startColumn": 7, + "endLine": 27, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9003", + "severity": "INFO", + "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", + "source": "ENGINE", + "category": "Best Practice", + "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'mySecurityGroupVpc' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", + "message": "Resource 'Domain' of type 'AWS::Elasticsearch::Domain' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "mySecurityGroupVpc", + "logicalId": "Domain", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::Elasticsearch::Domain" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 30, - "startColumn": 5, - "endLine": 30, - "endColumn": 15, + "startLine": 2, + "startColumn": 3, + "endLine": 2, + "endColumn": 9, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'myInstance' of type 'AWS::EC2::Instance' supports Tags but none are configured", + "message": "Resource 'Instance' of type 'AWS::EC2::Instance' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "myInstance", + "logicalId": "Instance", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 78, + "startLine": 6, "startColumn": 5, - "endLine": 78, + "endLine": 6, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" - } - ] - }, - "bad/rds_dbclusterinstanceclass_invalid.yaml": { - "filePath": "bad/rds_dbclusterinstanceclass_invalid.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 3, - "errors": 1, - "warnings": 1, - "informational": 7, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "F3003", - "severity": "FATAL", - "message": "'AllocatedStorage' is a required property (from extension)", - "source": "SCHEMA", - "entity": { - "logicalId": "Cluster", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" - }, - "propertyPath": "Properties", - "suggestedFix": "Add 'AllocatedStorage'", - "category": "Schema", - "startLine": 7, - "startColumn": 5, - "endLine": 7, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", - "ruleDescription": "Required property missing", - "phase": "SCHEMA" - }, - { - "ruleId": "F3003", - "severity": "FATAL", - "message": "'Iops' is a required property (from extension)", - "source": "SCHEMA", - "entity": { - "logicalId": "Cluster", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" - }, - "propertyPath": "Properties", - "suggestedFix": "Add 'Iops'", - "category": "Schema", - "startLine": 7, - "startColumn": 5, - "endLine": 7, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", - "ruleDescription": "Required property missing", - "phase": "SCHEMA" - }, - { - "ruleId": "F3003", - "severity": "FATAL", - "message": "'StorageType' is a required property (from extension)", - "source": "SCHEMA", - "entity": { - "logicalId": "Cluster", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" - }, - "propertyPath": "Properties", - "suggestedFix": "Add 'StorageType'", - "category": "Schema", - "startLine": 7, - "startColumn": 5, - "endLine": 7, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", - "ruleDescription": "Required property missing", - "phase": "SCHEMA" - }, - { - "ruleId": "E3694", - "severity": "ERROR", - "message": "'db.bogus.class' is not one of ['db.c6gd.12xlarge', 'db.c6gd.16xlarge', 'db.c6gd.2xlarge', 'db.c6gd.4xlarge', 'db.c6gd.8xlarge', 'db.c6gd.large', 'db.c6gd.medium', 'db.c6gd.xlarge', 'db.m5d.12xlarge', 'db.m5d.16xlarge', 'db.m5d.24xlarge', 'db.m5d.2xlarge', 'db.m5d.4xlarge', 'db.m5d.8xlarge', 'db.m5d.large', 'db.m5d.xlarge', 'db.m6gd.12xlarge', 'db.m6gd.16xlarge', 'db.m6gd.2xlarge', 'db.m6gd.4xlarge', 'db.m6gd.8xlarge', 'db.m6gd.large', 'db.m6gd.xlarge', 'db.m6id.12xlarge', 'db.m6id.16xlarge', 'db.m6id.24xlarge', 'db.m6id.2xlarge', 'db.m6id.32xlarge', 'db.m6id.4xlarge', 'db.m6id.8xlarge', 'db.m6id.large', 'db.m6id.xlarge', 'db.m6idn.12xlarge', 'db.m6idn.16xlarge', 'db.m6idn.24xlarge', 'db.m6idn.2xlarge', 'db.m6idn.32xlarge', 'db.m6idn.4xlarge', 'db.m6idn.8xlarge', 'db.m6idn.large', 'db.m6idn.xlarge', 'db.m8gd.12xlarge', 'db.m8gd.16xlarge', 'db.m8gd.24xlarge', 'db.m8gd.2xlarge', 'db.m8gd.48xlarge', 'db.m8gd.4xlarge', 'db.m8gd.8xlarge', 'db.m8gd.large', 'db.m8gd.xlarge', 'db.r5d.12xlarge', 'db.r5d.16xlarge', 'db.r5d.24xlarge', 'db.r5d.2xlarge', 'db.r5d.4xlarge', 'db.r5d.8xlarge', 'db.r5d.large', 'db.r5d.xlarge', 'db.r6gd.12xlarge', 'db.r6gd.16xlarge', 'db.r6gd.2xlarge', 'db.r6gd.4xlarge', 'db.r6gd.8xlarge', 'db.r6gd.large', 'db.r6gd.xlarge', 'db.r6id.12xlarge', 'db.r6id.16xlarge', 'db.r6id.24xlarge', 'db.r6id.2xlarge', 'db.r6id.32xlarge', 'db.r6id.4xlarge', 'db.r6id.8xlarge', 'db.r6id.large', 'db.r6id.xlarge', 'db.r6idn.12xlarge', 'db.r6idn.16xlarge', 'db.r6idn.24xlarge', 'db.r6idn.2xlarge', 'db.r6idn.32xlarge', 'db.r6idn.4xlarge', 'db.r6idn.8xlarge', 'db.r6idn.large', 'db.r6idn.xlarge', 'db.r8gd.12xlarge', 'db.r8gd.16xlarge', 'db.r8gd.24xlarge', 'db.r8gd.2xlarge', 'db.r8gd.48xlarge', 'db.r8gd.4xlarge', 'db.r8gd.8xlarge', 'db.r8gd.large', 'db.r8gd.xlarge', 'db.x2idn.16xlarge', 'db.x2idn.24xlarge', 'db.x2idn.32xlarge', 'db.x2iedn.16xlarge', 'db.x2iedn.24xlarge', 'db.x2iedn.2xlarge', 'db.x2iedn.32xlarge', 'db.x2iedn.4xlarge', 'db.x2iedn.8xlarge', 'db.x2iedn.xlarge'] when Engine is 'mysql' in any region", - "source": "CFN_LINT", - "entity": { - "logicalId": "Cluster", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" - }, - "propertyPath": "Properties.DBClusterInstanceClass", - "category": "Resource", - "startLine": 9, - "startColumn": 7, - "endLine": 9, - "endColumn": 29, - "ruleDescription": "Validates RDS DB Cluster instance class", - "phase": "LINT" - }, - { - "ruleId": "W2501", - "severity": "WARN", - "message": "Property 'MasterUserPassword' should not be a hardcoded string - use a parameter with NoEcho or a dynamic reference", - "source": "CFN_LINT", - "entity": { - "logicalId": "Cluster", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" - }, - "propertyPath": "Properties.MasterUserPassword", - "category": "Security", - "startLine": 11, - "startColumn": 7, - "endLine": 11, - "endColumn": 25, - "ruleDescription": "Check if Password Properties are correctly configured", - "phase": "LINT" - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "Cluster", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" - }, - "category": "Best Practice", - "startLine": 5, - "startColumn": 3, - "endLine": 5, - "endColumn": 10, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "Cluster", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" - }, - "category": "Best Practice", - "startLine": 5, - "startColumn": 3, - "endLine": 5, - "endColumn": 10, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" }, { - "ruleId": "I3013", + "ruleId": "I9040", "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", + "message": "Resource 'DBInstance' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Cluster", + "logicalId": "DBInstance", "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 7, + "startLine": 11, "startColumn": 5, - "endLine": 7, + "endLine": 11, "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Resource 'CacheCluster' of type 'AWS::ElastiCache::CacheCluster' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Cluster", + "logicalId": "CacheCluster", "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" + "resourceType": "AWS::ElastiCache::CacheCluster" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 8, - "startColumn": 7, - "endLine": 8, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 15, + "startColumn": 5, + "endLine": 15, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'MasterUsername' is conditionally create-only; updating it may cause resource replacement", + "message": "Resource 'Domain2' of type 'AWS::Elasticsearch::Domain' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Cluster", + "logicalId": "Domain2", "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" + "resourceType": "AWS::Elasticsearch::Domain" }, - "propertyPath": "Properties.MasterUsername", - "category": "Best Practice", - "startLine": 10, - "startColumn": 7, - "endLine": 10, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } - }, - { - "ruleId": "I9003", - "severity": "INFO", - "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", - "source": "ENGINE", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", + "startLine": 21, + "startColumn": 5, + "endLine": 21, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Cluster' of type 'AWS::RDS::DBCluster' supports Tags but none are configured", + "message": "Resource 'Host' of type 'AWS::EC2::Host' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Cluster", + "logicalId": "Host", "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" + "resourceType": "AWS::EC2::Host" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 7, + "startLine": 26, "startColumn": 5, - "endLine": 7, + "endLine": 26, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "bad/rds_dbinstanceclass_mixed_case_engine.yaml": { - "filePath": "bad/rds_dbinstanceclass_mixed_case_engine.yaml", + "bad/properties_ebs.yaml": { + "filePath": "bad/properties_ebs.yaml", "status": "OK", "metadata": { - "resourcesScanned": 1, + "resourcesScanned": 3, "counts": { - "fatal": 0, - "errors": 1, - "warnings": 1, - "informational": 6, + "fatal": 1, + "errors": 3, + "warnings": 6, + "informational": 14, "debug": 0 }, "suppressed": 0, @@ -77533,423 +76019,333 @@ }, "diagnostics": [ { - "ruleId": "E3025", - "severity": "ERROR", - "message": "'totally.bogus.class' is not one of ['db.m1.large', 'db.m1.medium', 'db.m1.small', 'db.m1.xlarge', 'db.m2.2xlarge', 'db.m2.4xlarge', 'db.m2.xlarge', 'db.m3.2xlarge', 'db.m3.large', 'db.m3.medium', 'db.m3.xlarge', 'db.m4.10xlarge', 'db.m4.16xlarge', 'db.m4.2xlarge', 'db.m4.4xlarge', 'db.m4.large', 'db.m4.xlarge', 'db.m5.12xlarge', 'db.m5.16xlarge', 'db.m5.24xlarge', 'db.m5.2xlarge', 'db.m5.4xlarge', 'db.m5.8xlarge', 'db.m5.large', 'db.m5.xlarge', 'db.m5d.12xlarge', 'db.m5d.16xlarge', 'db.m5d.24xlarge', 'db.m5d.2xlarge', 'db.m5d.4xlarge', 'db.m5d.8xlarge', 'db.m5d.large', 'db.m5d.xlarge', 'db.m6g.12xlarge', 'db.m6g.16xlarge', 'db.m6g.2xlarge', 'db.m6g.4xlarge', 'db.m6g.8xlarge', 'db.m6g.large', 'db.m6g.xlarge', 'db.m6gd.12xlarge', 'db.m6gd.16xlarge', 'db.m6gd.2xlarge', 'db.m6gd.4xlarge', 'db.m6gd.8xlarge', 'db.m6gd.large', 'db.m6gd.xlarge', 'db.m6i.12xlarge', 'db.m6i.16xlarge', 'db.m6i.24xlarge', 'db.m6i.2xlarge', 'db.m6i.32xlarge', 'db.m6i.4xlarge', 'db.m6i.8xlarge', 'db.m6i.large', 'db.m6i.xlarge', 'db.m6id.12xlarge', 'db.m6id.16xlarge', 'db.m6id.24xlarge', 'db.m6id.2xlarge', 'db.m6id.32xlarge', 'db.m6id.4xlarge', 'db.m6id.8xlarge', 'db.m6id.large', 'db.m6id.xlarge', 'db.m6idn.12xlarge', 'db.m6idn.16xlarge', 'db.m6idn.24xlarge', 'db.m6idn.2xlarge', 'db.m6idn.32xlarge', 'db.m6idn.4xlarge', 'db.m6idn.8xlarge', 'db.m6idn.large', 'db.m6idn.xlarge', 'db.m6in.12xlarge', 'db.m6in.16xlarge', 'db.m6in.24xlarge', 'db.m6in.2xlarge', 'db.m6in.32xlarge', 'db.m6in.4xlarge', 'db.m6in.8xlarge', 'db.m6in.large', 'db.m6in.xlarge', 'db.m7g.12xlarge', 'db.m7g.16xlarge', 'db.m7g.2xlarge', 'db.m7g.4xlarge', 'db.m7g.8xlarge', 'db.m7g.large', 'db.m7g.xlarge', 'db.m7i.12xlarge', 'db.m7i.16xlarge', 'db.m7i.24xlarge', 'db.m7i.2xlarge', 'db.m7i.48xlarge', 'db.m7i.4xlarge', 'db.m7i.8xlarge', 'db.m7i.large', 'db.m7i.xlarge', 'db.m8g.12xlarge', 'db.m8g.16xlarge', 'db.m8g.24xlarge', 'db.m8g.2xlarge', 'db.m8g.48xlarge', 'db.m8g.4xlarge', 'db.m8g.8xlarge', 'db.m8g.large', 'db.m8g.xlarge', 'db.m8gd.12xlarge', 'db.m8gd.16xlarge', 'db.m8gd.24xlarge', 'db.m8gd.2xlarge', 'db.m8gd.48xlarge', 'db.m8gd.4xlarge', 'db.m8gd.8xlarge', 'db.m8gd.large', 'db.m8gd.xlarge', 'db.m9g.12xlarge', 'db.m9g.16xlarge', 'db.m9g.24xlarge', 'db.m9g.2xlarge', 'db.m9g.48xlarge', 'db.m9g.4xlarge', 'db.m9g.8xlarge', 'db.m9g.large', 'db.m9g.xlarge', 'db.r3.2xlarge', 'db.r3.4xlarge', 'db.r3.8xlarge', 'db.r3.large', 'db.r3.xlarge', 'db.r4.16xlarge', 'db.r4.2xlarge', 'db.r4.4xlarge', 'db.r4.8xlarge', 'db.r4.large', 'db.r4.xlarge', 'db.r5.12xlarge', 'db.r5.16xlarge', 'db.r5.24xlarge', 'db.r5.2xlarge', 'db.r5.4xlarge', 'db.r5.8xlarge', 'db.r5.large', 'db.r5.xlarge', 'db.r5b.12xlarge', 'db.r5b.16xlarge', 'db.r5b.24xlarge', 'db.r5b.2xlarge', 'db.r5b.4xlarge', 'db.r5b.8xlarge', 'db.r5b.large', 'db.r5b.xlarge', 'db.r5d.12xlarge', 'db.r5d.16xlarge', 'db.r5d.24xlarge', 'db.r5d.2xlarge', 'db.r5d.4xlarge', 'db.r5d.8xlarge', 'db.r5d.large', 'db.r5d.xlarge', 'db.r6g.12xlarge', 'db.r6g.16xlarge', 'db.r6g.2xlarge', 'db.r6g.4xlarge', 'db.r6g.8xlarge', 'db.r6g.large', 'db.r6g.xlarge', 'db.r6gd.12xlarge', 'db.r6gd.16xlarge', 'db.r6gd.2xlarge', 'db.r6gd.4xlarge', 'db.r6gd.8xlarge', 'db.r6gd.large', 'db.r6gd.xlarge', 'db.r6i.12xlarge', 'db.r6i.16xlarge', 'db.r6i.24xlarge', 'db.r6i.2xlarge', 'db.r6i.32xlarge', 'db.r6i.4xlarge', 'db.r6i.8xlarge', 'db.r6i.large', 'db.r6i.xlarge', 'db.r6id.12xlarge', 'db.r6id.16xlarge', 'db.r6id.24xlarge', 'db.r6id.2xlarge', 'db.r6id.32xlarge', 'db.r6id.4xlarge', 'db.r6id.8xlarge', 'db.r6id.large', 'db.r6id.xlarge', 'db.r6idn.12xlarge', 'db.r6idn.16xlarge', 'db.r6idn.24xlarge', 'db.r6idn.2xlarge', 'db.r6idn.32xlarge', 'db.r6idn.4xlarge', 'db.r6idn.8xlarge', 'db.r6idn.large', 'db.r6idn.xlarge', 'db.r6in.12xlarge', 'db.r6in.16xlarge', 'db.r6in.24xlarge', 'db.r6in.2xlarge', 'db.r6in.32xlarge', 'db.r6in.4xlarge', 'db.r6in.8xlarge', 'db.r6in.large', 'db.r6in.xlarge', 'db.r7g.12xlarge', 'db.r7g.16xlarge', 'db.r7g.2xlarge', 'db.r7g.4xlarge', 'db.r7g.8xlarge', 'db.r7g.large', 'db.r7g.xlarge', 'db.r7i.12xlarge', 'db.r7i.16xlarge', 'db.r7i.24xlarge', 'db.r7i.2xlarge', 'db.r7i.48xlarge', 'db.r7i.4xlarge', 'db.r7i.8xlarge', 'db.r7i.large', 'db.r7i.xlarge', 'db.r8g.12xlarge', 'db.r8g.16xlarge', 'db.r8g.24xlarge', 'db.r8g.2xlarge', 'db.r8g.48xlarge', 'db.r8g.4xlarge', 'db.r8g.8xlarge', 'db.r8g.large', 'db.r8g.xlarge', 'db.r8gd.12xlarge', 'db.r8gd.16xlarge', 'db.r8gd.24xlarge', 'db.r8gd.2xlarge', 'db.r8gd.48xlarge', 'db.r8gd.4xlarge', 'db.r8gd.8xlarge', 'db.r8gd.large', 'db.r8gd.xlarge', 'db.t1.micro', 'db.t2.2xlarge', 'db.t2.large', 'db.t2.medium', 'db.t2.micro', 'db.t2.small', 'db.t2.xlarge', 'db.t3.2xlarge', 'db.t3.large', 'db.t3.medium', 'db.t3.micro', 'db.t3.small', 'db.t3.xlarge', 'db.t4g.2xlarge', 'db.t4g.large', 'db.t4g.medium', 'db.t4g.micro', 'db.t4g.small', 'db.t4g.xlarge', 'db.x2g.12xlarge', 'db.x2g.16xlarge', 'db.x2g.2xlarge', 'db.x2g.4xlarge', 'db.x2g.8xlarge', 'db.x2g.large', 'db.x2g.xlarge', 'db.x2iedn.16xlarge', 'db.x2iedn.24xlarge', 'db.x2iedn.2xlarge', 'db.x2iedn.32xlarge', 'db.x2iedn.4xlarge', 'db.x2iedn.8xlarge', 'db.x2iedn.xlarge'] when Engine is 'mysql' in any region", - "source": "CFN_LINT", - "entity": { - "logicalId": "Db", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" - }, - "propertyPath": "Properties.DBInstanceClass", - "category": "Resource", - "startLine": 9, - "startColumn": 7, - "endLine": 9, - "endColumn": 22, - "ruleDescription": "Validates RDS DB Instance Class", - "phase": "LINT" - }, - { - "ruleId": "W9008", - "severity": "WARN", - "message": "RDS instance should have StorageEncrypted set to true", - "source": "ENGINE", + "ruleId": "F3034", + "severity": "FATAL", + "message": "10 is less than the minimum of 100", + "source": "SCHEMA", "entity": { - "logicalId": "Db", + "logicalId": "MyLaunchConfig", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::AutoScaling::LaunchConfiguration" }, - "propertyPath": "Properties.StorageEncrypted", - "suggestedFix": "Set StorageEncrypted to true", - "category": "Security", - "startLine": 7, - "startColumn": 5, - "endLine": 7, - "endColumn": 15, - "ruleDescription": "RDS instance should have StorageEncrypted", - "phase": "LINT" + "propertyPath": "Properties.BlockDeviceMappings.0.Ebs.Iops", + "category": "Schema", + "startLine": 50, + "startColumn": 13, + "endLine": 50, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", + "ruleDescription": "Numeric value out of bounds", + "phase": "SCHEMA", + "context": { + "actualValue": 10 + } }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "ruleId": "E3671", + "severity": "ERROR", + "message": "0 is less than the minimum of 100", "source": "CFN_LINT", "entity": { - "logicalId": "Db", + "logicalId": "MyEC2Instance", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Instance" }, - "category": "Best Practice", - "startLine": 5, - "startColumn": 3, - "endLine": 5, - "endColumn": 5, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "propertyPath": "Properties.BlockDeviceMappings.0.Ebs.Iops", + "category": "Resource", + "startLine": 17, + "startColumn": 13, + "endLine": 17, + "endColumn": 17, + "ruleDescription": "Validate block device mapping configuration", "phase": "LINT" }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "ruleId": "E3671", + "severity": "ERROR", + "message": "10 is less than the minimum of 100", "source": "CFN_LINT", "entity": { - "logicalId": "Db", + "logicalId": "MyLaunchConfig", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::AutoScaling::LaunchConfiguration" }, - "category": "Best Practice", - "startLine": 5, - "startColumn": 3, - "endLine": 5, - "endColumn": 5, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "propertyPath": "Properties.BlockDeviceMappings.0.Ebs.Iops", + "category": "Resource", + "startLine": 50, + "startColumn": 13, + "endLine": 50, + "endColumn": 17, + "ruleDescription": "Validate block device mapping configuration", "phase": "LINT" }, { - "ruleId": "I3013", - "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "ruleId": "E3715", + "severity": "ERROR", + "message": "'ephemeralA' is not a valid ephemeral device name. Expected format is 'ephemeralN' where N is 0-23", "source": "CFN_LINT", "entity": { - "logicalId": "Db", + "logicalId": "MyEC2Instance3", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties", - "category": "Best Practice", - "startLine": 7, - "startColumn": 5, - "endLine": 7, - "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "propertyPath": "Properties.BlockDeviceMappings.0.VirtualName", + "category": "Resource", + "startLine": 36, + "startColumn": 9, + "endLine": 36, + "endColumn": 20, + "ruleDescription": "VirtualName must use ephemeral device format when Ebs is absent", "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W3030", + "severity": "WARN", + "message": "'magnetic' is not one of ['gp2', 'gp3', 'io1', 'io2', 'sc1', 'st1', 'standard']", + "source": "CFN_LINT", "entity": { - "logicalId": "Db", + "logicalId": "MyEC2Instance", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Engine", - "category": "Best Practice", - "startLine": 8, - "startColumn": 7, - "endLine": 8, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", + "propertyPath": "Properties.BlockDeviceMappings.1.Ebs.VolumeType", + "category": "Schema", + "startLine": 23, + "startColumn": 13, + "endLine": 23, + "endColumn": 23, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Value not in allowed enum", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "actualValue": "magnetic" } }, { - "ruleId": "I9003", - "severity": "INFO", - "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", - "source": "ENGINE", - "category": "Best Practice", - "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Db' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W3671", + "severity": "WARN", + "message": "Iops is ignored when VolumeType is 'standard'", + "source": "CFN_LINT", "entity": { - "logicalId": "Db", + "logicalId": "MyLaunchConfig", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::AutoScaling::LaunchConfiguration" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.BlockDeviceMappings.1.Ebs.Iops", "category": "Best Practice", - "startLine": 7, - "startColumn": 5, - "endLine": 7, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "startLine": 57, + "startColumn": 13, + "endLine": 57, + "endColumn": 17, + "ruleDescription": "Iops is ignored for certain EBS volume types", "phase": "LINT" - } - ] - }, - "bad/rds_public.yaml": { - "filePath": "bad/rds_public.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 2, - "informational": 8, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "W2501", + "ruleId": "W3697", "severity": "WARN", - "message": "Property 'MasterUserPassword' should not be a hardcoded string - use a parameter with NoEcho or a dynamic reference", + "message": "Resource type 'AWS::AutoScaling::LaunchConfiguration' is from a service in maintenance mode since 2024-10-01. Consider migrating to an alternative", "source": "CFN_LINT", "entity": { - "logicalId": "Database", + "logicalId": "MyLaunchConfig", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::AutoScaling::LaunchConfiguration" }, - "propertyPath": "Properties.MasterUserPassword", - "category": "Security", - "startLine": 9, - "startColumn": 7, - "endLine": 9, - "endColumn": 25, - "ruleDescription": "Check if Password Properties are correctly configured", - "phase": "LINT" + "category": "Deprecation", + "startLine": 40, + "startColumn": 3, + "endLine": 40, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", + "ruleDescription": "Resource type is from a service in maintenance mode", + "phase": "SCHEMA" }, { - "ruleId": "W9011", + "ruleId": "W9003", "severity": "WARN", - "message": "RDS instance has PubliclyAccessible set to true - consider restricting access", - "source": "ENGINE", + "message": "1 is not of type 'string' - automatically coerced (number to string)", + "source": "CFN_LINT", "entity": { - "logicalId": "Database", + "logicalId": "MyEC2Instance", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.PubliclyAccessible", - "suggestedFix": "Set PubliclyAccessible to false", - "category": "Security", + "propertyPath": "Properties.KeyName", + "category": "Best Practice", "startLine": 11, "startColumn": 7, "endLine": 11, - "endColumn": 25, - "ruleDescription": "RDS instance PubliclyAccessible is true", - "phase": "LINT", - "context": { - "actualValue": true - } + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Property type coercion warning", + "phase": "SCHEMA" }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "ruleId": "W9010", + "severity": "WARN", + "message": "Hardcoded AMI ID - use a parameter or mapping for portability", + "source": "ENGINE", "entity": { - "logicalId": "Database", + "logicalId": "MyEC2Instance", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Instance" }, - "category": "Best Practice", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 11, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "propertyPath": "Properties.ImageId", + "category": "Security", + "startLine": 9, + "startColumn": 7, + "endLine": 9, + "endColumn": 14, + "ruleDescription": "Hardcoded AMI ID", "phase": "LINT" }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "ruleId": "W9010", + "severity": "WARN", + "message": "Hardcoded AMI ID - use a parameter or mapping for portability", + "source": "ENGINE", "entity": { - "logicalId": "Database", + "logicalId": "MyEC2Instance3", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Instance" }, - "category": "Best Practice", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 11, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "propertyPath": "Properties.ImageId", + "category": "Security", + "startLine": 32, + "startColumn": 7, + "endLine": 32, + "endColumn": 14, + "ruleDescription": "Hardcoded AMI ID", "phase": "LINT" }, { - "ruleId": "I3013", + "ruleId": "I3100", "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "message": "Previous generation instance type 't1.micro' - consider upgrading", "source": "CFN_LINT", "entity": { - "logicalId": "Database", + "logicalId": "MyEC2Instance", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties", + "propertyPath": "Properties.InstanceType", + "suggestedFix": "Upgrade to a current generation instance type", "category": "Best Practice", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "startLine": 10, + "startColumn": 7, + "endLine": 10, + "endColumn": 19, + "ruleDescription": "Checks for legacy instance type generations", "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Database", + "logicalId": "MyEC2Instance", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 7, + "startLine": 9, "startColumn": 7, - "endLine": 7, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "endLine": 9, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'MasterUsername' is create-only; updating it will cause resource replacement", + "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Database", + "logicalId": "MyEC2Instance", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.MasterUsername", + "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 8, + "startLine": 10, "startColumn": 7, - "endLine": 8, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "endLine": 10, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'StorageEncrypted' is create-only; updating it will cause resource replacement", + "message": "Property 'KeyName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Database", + "logicalId": "MyEC2Instance", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.StorageEncrypted", + "propertyPath": "Properties.KeyName", "category": "Best Practice", - "startLine": 10, + "startLine": 11, "startColumn": 7, - "endLine": 10, - "endColumn": 23, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "endLine": 11, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only" } }, - { - "ruleId": "I9003", - "severity": "INFO", - "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", - "source": "ENGINE", - "category": "Best Practice", - "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Database' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "Database", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "bad/redshift_internet_accessible.yaml": { - "filePath": "bad/redshift_internet_accessible.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 7, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 13, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "message": "Property 'BlockDeviceMappings' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Subnet1", + "logicalId": "MyEC2Instance", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.BlockDeviceMappings", "category": "Best Practice", - "startLine": 6, + "startLine": 12, "startColumn": 7, - "endLine": 6, - "endColumn": 12, + "endLine": 12, + "endColumn": 26, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'VPC'" + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Property 'NetworkInterfaces' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Subnet1", + "logicalId": "MyEC2Instance", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Properties.NetworkInterfaces", "category": "Best Practice", - "startLine": 7, + "startLine": 27, "startColumn": 7, - "endLine": 7, - "endColumn": 16, + "endLine": 27, + "endColumn": 24, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -77959,19 +76355,20 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "VPC", + "logicalId": "MyEC2Instance3", "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 11, + "startLine": 32, "startColumn": 7, - "endLine": 11, - "endColumn": 16, + "endLine": 32, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -77981,144 +76378,120 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "message": "Property 'BlockDeviceMappings' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "RouteTable1", + "logicalId": "MyEC2Instance3", "entityType": "Resource", - "resourceType": "AWS::EC2::RouteTable" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.BlockDeviceMappings", "category": "Best Practice", - "startLine": 21, + "startLine": 33, "startColumn": 7, - "endLine": 21, - "endColumn": 12, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", + "endLine": 33, + "endColumn": 26, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'VPC'" + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SubnetRTAssoc", + "logicalId": "MyLaunchConfig", "entityType": "Resource", - "resourceType": "AWS::EC2::SubnetRouteTableAssociation" + "resourceType": "AWS::AutoScaling::LaunchConfiguration" }, - "propertyPath": "Properties.SubnetId", + "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 25, + "startLine": 43, "startColumn": 7, - "endLine": 25, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 43, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'Subnet1'", - "extra": { - "replacement_strategy": "delete_then_create" - } + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", + "message": "Property 'InstanceType' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SubnetRTAssoc", + "logicalId": "MyLaunchConfig", "entityType": "Resource", - "resourceType": "AWS::EC2::SubnetRouteTableAssociation" + "resourceType": "AWS::AutoScaling::LaunchConfiguration" }, - "propertyPath": "Properties.RouteTableId", + "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 26, + "startLine": 44, "startColumn": 7, - "endLine": 26, + "endLine": 44, "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'RouteTable1'", - "extra": { - "replacement_strategy": "delete_then_create" - } + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", + "message": "Property 'BlockDeviceMappings' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Route1", + "logicalId": "MyLaunchConfig", "entityType": "Resource", - "resourceType": "AWS::EC2::Route" + "resourceType": "AWS::AutoScaling::LaunchConfiguration" }, - "propertyPath": "Properties.RouteTableId", + "propertyPath": "Properties.BlockDeviceMappings", "category": "Best Practice", - "startLine": 33, + "startLine": 45, "startColumn": 7, - "endLine": 33, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", + "endLine": 45, + "endColumn": 26, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'RouteTable1'" + "lifecycle": "create-only" } }, { - "ruleId": "I9001", + "ruleId": "I9003", "severity": "INFO", - "message": "Property 'DestinationCidrBlock' is create-only; updating it will cause resource replacement", + "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", "source": "ENGINE", - "entity": { - "logicalId": "Route1", - "entityType": "Resource", - "resourceType": "AWS::EC2::Route" - }, - "propertyPath": "Properties.DestinationCidrBlock", "category": "Best Practice", - "startLine": 34, - "startColumn": 7, - "endLine": 34, - "endColumn": 27, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", + "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Subnet1' of type 'AWS::EC2::Subnet' supports Tags but none are configured", + "message": "Resource 'MyEC2Instance' of type 'AWS::EC2::Instance' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Subnet1", + "logicalId": "MyEC2Instance", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 5, + "startLine": 8, "startColumn": 5, - "endLine": 5, + "endLine": 8, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -78126,545 +76499,592 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'VPC' of type 'AWS::EC2::VPC' supports Tags but none are configured", + "message": "Resource 'MyEC2Instance3' of type 'AWS::EC2::Instance' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "VPC", - "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" + "logicalId": "MyEC2Instance3", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 31, + "startColumn": 5, + "endLine": 31, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "bad/properties_password.yaml": { + "filePath": "bad/properties_password.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 3, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 13, + "informational": 19, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "W1011", + "severity": "WARN", + "message": "Use dynamic references (e.g., SSM SecureString) instead of parameter 'MyPassword' for secrets", + "source": "CFN_LINT", + "entity": { + "logicalId": "MyDB", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.MasterUserPassword", + "category": "Security", + "startLine": 23, + "startColumn": 7, + "endLine": 23, + "endColumn": 25, + "ruleDescription": "Instead of REFing a parameter for a secret use a dynamic reference", + "phase": "LINT" + }, + { + "ruleId": "W1011", + "severity": "WARN", + "message": "Use dynamic references (e.g., SSM SecureString) instead of parameter 'MyNewPassword' for secrets", + "source": "CFN_LINT", + "entity": { + "logicalId": "MyNewDB", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.MasterUserPassword", + "category": "Security", + "startLine": 32, + "startColumn": 7, + "endLine": 32, + "endColumn": 25, + "ruleDescription": "Instead of REFing a parameter for a secret use a dynamic reference", + "phase": "LINT" + }, + { + "ruleId": "W2501", + "severity": "WARN", + "message": "Parameter MyPassword used as MasterUserPassword, therefore NoEcho should be True", + "source": "CFN_LINT", + "entity": { + "logicalId": "MyPassword", + "entityType": "Parameter" + }, + "propertyPath": "Parameters/MyPassword", + "category": "Security", + "startLine": 6, + "startColumn": 3, + "endLine": 6, + "endColumn": 13, + "ruleDescription": "Check if Password Properties are correctly configured", + "phase": "LINT" + }, + { + "ruleId": "W2501", + "severity": "WARN", + "message": "Parameter MyNewPassword used as MasterUserPassword, therefore NoEcho should be True", + "source": "CFN_LINT", + "entity": { + "logicalId": "MyNewPassword", + "entityType": "Parameter" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", + "propertyPath": "Parameters/MyNewPassword", + "category": "Security", "startLine": 10, - "startColumn": 5, + "startColumn": 3, "endLine": 10, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "endColumn": 16, + "ruleDescription": "Check if Password Properties are correctly configured", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'RedshiftSubnetGroup' of type 'AWS::Redshift::ClusterSubnetGroup' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W2501", + "severity": "WARN", + "message": "Password should use a secure dynamic reference for Resources/myThirdDb/Properties/MasterUserPassword", + "source": "CFN_LINT", "entity": { - "logicalId": "RedshiftSubnetGroup", + "logicalId": "myThirdDb", "entityType": "Resource", - "resourceType": "AWS::Redshift::ClusterSubnetGroup" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 14, - "startColumn": 5, - "endLine": 14, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "propertyPath": "Properties.MasterUserPassword", + "category": "Security", + "startLine": 41, + "startColumn": 7, + "endLine": 41, + "endColumn": 25, + "ruleDescription": "Check if Password Properties are correctly configured", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'RouteTable1' of type 'AWS::EC2::RouteTable' supports Tags but none are configured", + "ruleId": "W2509", + "severity": "WARN", + "message": "Parameter 'MyPassword' appears to be a password but does not have NoEcho set to true", "source": "ENGINE", "entity": { - "logicalId": "RouteTable1", - "entityType": "Resource", - "resourceType": "AWS::EC2::RouteTable" + "logicalId": "MyPassword", + "entityType": "Parameter" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 20, - "startColumn": 5, - "endLine": 20, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "propertyPath": "Parameters/MyPassword", + "category": "Security", + "startLine": 6, + "startColumn": 3, + "endLine": 6, + "endColumn": 13, + "ruleDescription": "Password parameter should have NoEcho", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'IGW' of type 'AWS::EC2::InternetGateway' supports Tags but none are configured", + "ruleId": "W2509", + "severity": "WARN", + "message": "Parameter 'MyNewPassword' appears to be a password but does not have NoEcho set to true", "source": "ENGINE", "entity": { - "logicalId": "IGW", - "entityType": "Resource", - "resourceType": "AWS::EC2::InternetGateway" + "logicalId": "MyNewPassword", + "entityType": "Parameter" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 29, - "startColumn": 5, - "endLine": 29, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "propertyPath": "Parameters/MyNewPassword", + "category": "Security", + "startLine": 10, + "startColumn": 3, + "endLine": 10, + "endColumn": 16, + "ruleDescription": "Password parameter should have NoEcho", "phase": "LINT" - } - ] - }, - "bad/refs.yaml": { - "filePath": "bad/refs.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 2, - "counts": { - "fatal": 4, - "errors": 0, - "warnings": 2, - "informational": 17, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "F1018", - "severity": "FATAL", - "message": "Fn::Sub variable '${Package}' does not reference a valid resource, parameter, or pseudo-parameter", - "source": "SCHEMA", + "ruleId": "W3011", + "severity": "WARN", + "message": "Both 'UpdateReplacePolicy' and 'DeletionPolicy' are needed to protect resource from deletion", + "source": "CFN_LINT", "entity": { - "logicalId": "MyEC2Instance", + "logicalId": "MyDB", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.UserData", - "category": "Intrinsic Function", - "startLine": 21, - "startColumn": 7, - "endLine": 21, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Sub variables must resolve", - "phase": "SCHEMA", - "context": { - "resolutionSource": "dynamic (Sub:yum install ${Package}\n)" - } + "category": "Best Practice", + "startLine": 16, + "startColumn": 3, + "endLine": 16, + "endColumn": 7, + "ruleDescription": "Check resources with UpdateReplacePolicy/DeletionPolicy have both", + "phase": "LINT" }, { - "ruleId": "F1020", - "severity": "FATAL", - "message": "'pIops' is not one of ['AWS::AccountId', 'AWS::NoValue', 'AWS::NotificationARNs', 'AWS::Partition', 'AWS::Region', 'AWS::StackId', 'AWS::StackName', 'AWS::URLSuffix', 'AnotherInstance', 'MyEC2Instance']", - "source": "SCHEMA", + "ruleId": "W3011", + "severity": "WARN", + "message": "Both 'UpdateReplacePolicy' and 'DeletionPolicy' are needed to protect resource from deletion", + "source": "CFN_LINT", "entity": { - "logicalId": "MyEC2Instance", + "logicalId": "MyNewDB", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.BlockDeviceMappings.0.Ebs.Iops", - "suggestedFix": "Check that the Ref target exists as a resource, parameter, or pseudo-parameter", - "category": "Intrinsic Function", - "startLine": 15, - "startColumn": 13, - "endLine": 15, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Ref/GetAtt target must exist", - "phase": "SCHEMA" + "category": "Best Practice", + "startLine": 25, + "startColumn": 3, + "endLine": 25, + "endColumn": 10, + "ruleDescription": "Check resources with UpdateReplacePolicy/DeletionPolicy have both", + "phase": "LINT" }, { - "ruleId": "F1020", - "severity": "FATAL", - "message": "'pIops' is not one of ['AWS::AccountId', 'AWS::NoValue', 'AWS::NotificationARNs', 'AWS::Partition', 'AWS::Region', 'AWS::StackId', 'AWS::StackName', 'AWS::URLSuffix', 'AnotherInstance', 'MyEC2Instance']", - "source": "SCHEMA", + "ruleId": "W3011", + "severity": "WARN", + "message": "Both 'UpdateReplacePolicy' and 'DeletionPolicy' are needed to protect resource from deletion", + "source": "CFN_LINT", "entity": { - "logicalId": "AnotherInstance", + "logicalId": "myThirdDb", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.BlockDeviceMappings.0.Ebs.Iops", - "suggestedFix": "Check that the Ref target exists as a resource, parameter, or pseudo-parameter", - "category": "Intrinsic Function", + "category": "Best Practice", "startLine": 34, - "startColumn": 13, + "startColumn": 3, "endLine": 34, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Ref/GetAtt target must exist", - "phase": "SCHEMA" + "endColumn": 12, + "ruleDescription": "Check resources with UpdateReplacePolicy/DeletionPolicy have both", + "phase": "LINT" }, { - "ruleId": "F1020", - "severity": "FATAL", - "message": "'httpdPackage' is not one of ['AWS::AccountId', 'AWS::NoValue', 'AWS::NotificationARNs', 'AWS::Partition', 'AWS::Region', 'AWS::StackId', 'AWS::StackName', 'AWS::URLSuffix', 'AnotherInstance', 'MyEC2Instance']", - "source": "SCHEMA", + "ruleId": "W9008", + "severity": "WARN", + "message": "RDS instance should have StorageEncrypted set to true", + "source": "ENGINE", "entity": { - "logicalId": "AnotherInstance", + "logicalId": "MyDB", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.UserData", - "suggestedFix": "Check that the Ref target exists as a resource, parameter, or pseudo-parameter", - "category": "Intrinsic Function", - "startLine": 40, - "startColumn": 7, - "endLine": 40, + "propertyPath": "Properties.StorageEncrypted", + "suggestedFix": "Set StorageEncrypted to true", + "category": "Security", + "startLine": 18, + "startColumn": 5, + "endLine": 18, "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Ref/GetAtt target must exist", - "phase": "SCHEMA", - "context": { - "resolutionSource": "dynamic (Sub:yum install ${myPackage} ${Package})" - } + "ruleDescription": "RDS instance should have StorageEncrypted", + "phase": "LINT" }, { - "ruleId": "W9010", + "ruleId": "W9008", "severity": "WARN", - "message": "Hardcoded AMI ID - use a parameter or mapping for portability", + "message": "RDS instance should have StorageEncrypted set to true", "source": "ENGINE", "entity": { - "logicalId": "MyEC2Instance", + "logicalId": "MyNewDB", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Properties.StorageEncrypted", + "suggestedFix": "Set StorageEncrypted to true", "category": "Security", - "startLine": 7, - "startColumn": 7, - "endLine": 7, - "endColumn": 14, - "ruleDescription": "Hardcoded AMI ID", + "startLine": 27, + "startColumn": 5, + "endLine": 27, + "endColumn": 15, + "ruleDescription": "RDS instance should have StorageEncrypted", "phase": "LINT" }, { - "ruleId": "W9010", + "ruleId": "W9008", "severity": "WARN", - "message": "Hardcoded AMI ID - use a parameter or mapping for portability", + "message": "RDS instance should have StorageEncrypted set to true", "source": "ENGINE", "entity": { - "logicalId": "AnotherInstance", + "logicalId": "myThirdDb", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Properties.StorageEncrypted", + "suggestedFix": "Set StorageEncrypted to true", "category": "Security", - "startLine": 26, - "startColumn": 7, - "endLine": 26, - "endColumn": 14, - "ruleDescription": "Hardcoded AMI ID", + "startLine": 36, + "startColumn": 5, + "endLine": 36, + "endColumn": 15, + "ruleDescription": "RDS instance should have StorageEncrypted", "phase": "LINT" }, { - "ruleId": "I3100", + "ruleId": "I3011", "severity": "INFO", - "message": "Previous generation instance type 't1.micro' - consider upgrading", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "MyEC2Instance", + "logicalId": "MyDB", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.InstanceType", - "suggestedFix": "Upgrade to a current generation instance type", "category": "Best Practice", - "startLine": 8, - "startColumn": 7, - "endLine": 8, - "endColumn": 19, - "ruleDescription": "Checks for legacy instance type generations", + "startLine": 16, + "startColumn": 3, + "endLine": 16, + "endColumn": 7, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "I3100", + "ruleId": "I3011", "severity": "INFO", - "message": "Previous generation instance type 't1.micro' - consider upgrading", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "AnotherInstance", + "logicalId": "MyNewDB", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.InstanceType", - "suggestedFix": "Upgrade to a current generation instance type", "category": "Best Practice", - "startLine": 27, - "startColumn": 7, - "endLine": 27, - "endColumn": 19, - "ruleDescription": "Checks for legacy instance type generations", + "startLine": 25, + "startColumn": 3, + "endLine": 25, + "endColumn": 10, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "MyEC2Instance", + "logicalId": "myThirdDb", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 7, - "startColumn": 7, - "endLine": 7, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 34, + "startColumn": 3, + "endLine": 34, + "endColumn": 12, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3013", "severity": "INFO", - "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "MyEC2Instance", + "logicalId": "MyDB", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.InstanceType", + "propertyPath": "Properties", "category": "Best Practice", - "startLine": 8, - "startColumn": 7, - "endLine": 8, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 18, + "startColumn": 5, + "endLine": 18, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3013", "severity": "INFO", - "message": "Property 'KeyName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "MyEC2Instance", + "logicalId": "MyNewDB", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.KeyName", + "propertyPath": "Properties", "category": "Best Practice", - "startLine": 9, - "startColumn": 7, - "endLine": 9, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 27, + "startColumn": 5, + "endLine": 27, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3013", "severity": "INFO", - "message": "Property 'BlockDeviceMappings' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "MyEC2Instance", + "logicalId": "myThirdDb", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.BlockDeviceMappings", + "propertyPath": "Properties", "category": "Best Practice", - "startLine": 10, + "startLine": 36, + "startColumn": 5, + "endLine": 36, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "phase": "LINT" + }, + { + "ruleId": "I3100", + "severity": "INFO", + "message": "Previous generation instance type 'db.m1.small' - consider upgrading", + "source": "CFN_LINT", + "entity": { + "logicalId": "MyDB", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.DBInstanceClass", + "suggestedFix": "Upgrade to a current generation instance type", + "category": "Best Practice", + "startLine": 20, "startColumn": 7, - "endLine": 10, - "endColumn": 26, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "endLine": 20, + "endColumn": 22, + "ruleDescription": "Checks for legacy instance type generations", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3100", "severity": "INFO", - "message": "Property 'NetworkInterfaces' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "Previous generation instance type 'db.m1.small' - consider upgrading", + "source": "CFN_LINT", "entity": { - "logicalId": "MyEC2Instance", + "logicalId": "MyNewDB", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.NetworkInterfaces", + "propertyPath": "Properties.DBInstanceClass", + "suggestedFix": "Upgrade to a current generation instance type", "category": "Best Practice", - "startLine": 18, + "startLine": 29, "startColumn": 7, - "endLine": 18, - "endColumn": 24, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "endLine": 29, + "endColumn": 22, + "ruleDescription": "Checks for legacy instance type generations", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3100", "severity": "INFO", - "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "message": "Previous generation instance type 'db.m1.small' - consider upgrading", + "source": "CFN_LINT", "entity": { - "logicalId": "MyEC2Instance", + "logicalId": "myThirdDb", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.UserData", + "propertyPath": "Properties.DBInstanceClass", + "suggestedFix": "Upgrade to a current generation instance type", "category": "Best Practice", - "startLine": 21, + "startLine": 38, "startColumn": 7, - "endLine": 21, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only", - "resolutionSource": "dynamic (Sub:yum install ${Package}\n)" - } + "endLine": 38, + "endColumn": 22, + "ruleDescription": "Checks for legacy instance type generations", + "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "AnotherInstance", + "logicalId": "MyDB", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Properties.Engine", "category": "Best Practice", - "startLine": 26, + "startLine": 21, "startColumn": 7, - "endLine": 26, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 21, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'MasterUsername' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "AnotherInstance", + "logicalId": "MyDB", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.InstanceType", + "propertyPath": "Properties.MasterUsername", "category": "Best Practice", - "startLine": 27, + "startLine": 22, "startColumn": 7, - "endLine": 27, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 22, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'KeyName' is create-only; updating it will cause resource replacement", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "AnotherInstance", + "logicalId": "MyNewDB", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.KeyName", + "propertyPath": "Properties.Engine", "category": "Best Practice", - "startLine": 28, + "startLine": 30, "startColumn": 7, - "endLine": 28, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 30, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'BlockDeviceMappings' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'MasterUsername' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "AnotherInstance", + "logicalId": "MyNewDB", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.BlockDeviceMappings", + "propertyPath": "Properties.MasterUsername", "category": "Best Practice", - "startLine": 29, + "startLine": 31, "startColumn": 7, - "endLine": 29, - "endColumn": 26, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 31, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'NetworkInterfaces' is create-only; updating it will cause resource replacement", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "AnotherInstance", + "logicalId": "myThirdDb", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.NetworkInterfaces", + "propertyPath": "Properties.Engine", "category": "Best Practice", - "startLine": 37, + "startLine": 39, "startColumn": 7, - "endLine": 37, - "endColumn": 24, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 39, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'MasterUsername' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "AnotherInstance", + "logicalId": "myThirdDb", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.UserData", + "propertyPath": "Properties.MasterUsername", "category": "Best Practice", "startLine": 40, "startColumn": 7, "endLine": 40, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only", - "resolutionSource": "dynamic (Sub:yum install ${myPackage} ${Package})" + "lifecycle": "create-only" } }, { @@ -78679,19 +77099,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'MyEC2Instance' of type 'AWS::EC2::Instance' supports Tags but none are configured", + "message": "Resource 'MyDB' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "MyEC2Instance", + "logicalId": "MyDB", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::RDS::DBInstance" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 6, + "startLine": 18, "startColumn": 5, - "endLine": 6, + "endLine": 18, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -78699,35 +77119,55 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'AnotherInstance' of type 'AWS::EC2::Instance' supports Tags but none are configured", + "message": "Resource 'MyNewDB' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "AnotherInstance", + "logicalId": "MyNewDB", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::RDS::DBInstance" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 25, + "startLine": 27, "startColumn": 5, - "endLine": 25, + "endLine": 27, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'myThirdDb' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "myThirdDb", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 36, + "startColumn": 5, + "endLine": 36, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "bad/resource_policy_no_statement.yaml": { - "filePath": "bad/resource_policy_no_statement.yaml", + "bad/properties_rt_association.yaml": { + "filePath": "bad/properties_rt_association.yaml", "status": "OK", "metadata": { - "resourcesScanned": 1, + "resourcesScanned": 7, "counts": { "fatal": 0, - "errors": 1, + "errors": 7, "warnings": 0, - "informational": 3, + "informational": 13, "debug": 0 }, "suppressed": 0, @@ -78736,348 +77176,499 @@ }, "diagnostics": [ { - "ruleId": "E3512", + "ruleId": "E3022", "severity": "ERROR", - "message": "Resource-based policy must have a Statement property", + "message": "SubnetId in PublicSubnetRouteTableAssociation1 is also associated with PrivateSubnetRouteTableAssociation1", "source": "CFN_LINT", "entity": { - "logicalId": "Policy", + "logicalId": "PublicSubnetRouteTableAssociation1", "entityType": "Resource", - "resourceType": "AWS::KMS::Key" + "resourceType": "AWS::EC2::SubnetRouteTableAssociation" }, - "propertyPath": "Properties.KeyPolicy", - "suggestedFix": "Add a Statement array to the policy document", + "propertyPath": "Properties.SubnetId", + "suggestedFix": "Associate each subnet with exactly one route table", "category": "Resource", - "startLine": 6, - "startColumn": 7, - "endLine": 6, - "endColumn": 16, - "ruleDescription": "Validate resource based IAM policies", + "startLine": 27, + "startColumn": 9, + "endLine": 27, + "endColumn": 17, + "ruleDescription": "Resource SubnetRouteTableAssociation Properties", "phase": "LINT" }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "ruleId": "E3022", + "severity": "ERROR", + "message": "SubnetId in PrivateSubnetRouteTableAssociation1 is also associated with PublicSubnetRouteTableAssociation1", "source": "CFN_LINT", "entity": { - "logicalId": "Policy", + "logicalId": "PrivateSubnetRouteTableAssociation1", "entityType": "Resource", - "resourceType": "AWS::KMS::Key" + "resourceType": "AWS::EC2::SubnetRouteTableAssociation" }, - "category": "Best Practice", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 9, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "propertyPath": "Properties.SubnetId", + "suggestedFix": "Associate each subnet with exactly one route table", + "category": "Resource", + "startLine": 35, + "startColumn": 9, + "endLine": 35, + "endColumn": 17, + "ruleDescription": "Resource SubnetRouteTableAssociation Properties", "phase": "LINT" }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "ruleId": "E3022", + "severity": "ERROR", + "message": "SubnetId in AuxiliaryPublicSubnetRouteTableAssociation1 is also associated with PublicSubnetRouteTableAssociation1, PrivateSubnetRouteTableAssociation1, ProxySubnetRouteTableAssociation", "source": "CFN_LINT", "entity": { - "logicalId": "Policy", + "logicalId": "AuxiliaryPublicSubnetRouteTableAssociation1", "entityType": "Resource", - "resourceType": "AWS::KMS::Key" + "resourceType": "AWS::EC2::SubnetRouteTableAssociation" }, - "category": "Best Practice", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 9, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "propertyPath": "Properties.SubnetId", + "suggestedFix": "Associate each subnet with exactly one route table", + "category": "Resource", + "startLine": 44, + "startColumn": 9, + "endLine": 44, + "endColumn": 17, + "ruleDescription": "Resource SubnetRouteTableAssociation Properties", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Policy' of type 'AWS::KMS::Key' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "E3022", + "severity": "ERROR", + "message": "SubnetId in ProxySubnetRouteTableAssociation is also associated with PublicSubnetRouteTableAssociation1, PrivateSubnetRouteTableAssociation1, AuxiliaryPublicSubnetRouteTableAssociation1", + "source": "CFN_LINT", "entity": { - "logicalId": "Policy", + "logicalId": "ProxySubnetRouteTableAssociation", "entityType": "Resource", - "resourceType": "AWS::KMS::Key" + "resourceType": "AWS::EC2::SubnetRouteTableAssociation" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "propertyPath": "Properties.SubnetId", + "suggestedFix": "Associate each subnet with exactly one route table", + "category": "Resource", + "startLine": 52, + "startColumn": 9, + "endLine": 52, + "endColumn": 17, + "ruleDescription": "Resource SubnetRouteTableAssociation Properties", "phase": "LINT" - } - ] - }, - "bad/resources/backup/test_backup_plan_lifecycle_rule.yml": { - "filePath": "bad/resources/backup/test_backup_plan_lifecycle_rule.yml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 0, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [] - }, - "bad/resources/cloudformation/stack_nested.yaml": { - "filePath": "bad/resources/cloudformation/stack_nested.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 0, - "counts": { - "fatal": 1, - "errors": 0, - "warnings": 2, - "informational": 0, - "debug": 0 + { + "ruleId": "E3022", + "severity": "ERROR", + "message": "SubnetId in AuxilliaryCustomSubnetRouteTableAssociation is also associated with CustomSubnetRouteTableAssociation", + "source": "CFN_LINT", + "entity": { + "logicalId": "AuxilliaryCustomSubnetRouteTableAssociation", + "entityType": "Resource", + "resourceType": "AWS::EC2::SubnetRouteTableAssociation" + }, + "propertyPath": "Properties.SubnetId", + "suggestedFix": "Associate each subnet with exactly one route table", + "category": "Resource", + "startLine": 74, + "startColumn": 9, + "endLine": 74, + "endColumn": 17, + "ruleDescription": "Resource SubnetRouteTableAssociation Properties", + "phase": "LINT" }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "F0001", - "severity": "FATAL", - "message": "Resources section must exist and be non-empty", + "ruleId": "E8002", + "severity": "ERROR", + "message": "Condition 'CreateAuxiliaryNetworks' referenced by resource 'AuxiliaryPublicSubnetRouteTableAssociation1' is not defined", "source": "SCHEMA", + "entity": { + "logicalId": "AuxiliaryPublicSubnetRouteTableAssociation1", + "entityType": "Resource", + "resourceType": "AWS::EC2::SubnetRouteTableAssociation" + }, "category": "Structure", - "startLine": 6, - "startColumn": 1, - "endLine": 6, - "endColumn": 10, - "ruleDescription": "Resources section must exist and be non-empty", - "phase": "SCHEMA" + "startLine": 38, + "startColumn": 3, + "endLine": 38, + "endColumn": 46, + "ruleDescription": "Condition referenced by resource is not defined", + "phase": "PARSE" }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'One' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "E8002", + "severity": "ERROR", + "message": "Condition 'CreateAuxiliaryNetworks' referenced by resource 'AuxilliaryCustomSubnetRouteTableAssociation' is not defined", + "source": "SCHEMA", "entity": { - "logicalId": "One", - "entityType": "Parameter" + "logicalId": "AuxilliaryCustomSubnetRouteTableAssociation", + "entityType": "Resource", + "resourceType": "AWS::EC2::SubnetRouteTableAssociation" }, - "propertyPath": "Parameters/One", - "category": "Best Practice", - "startLine": 2, + "category": "Structure", + "startLine": 68, "startColumn": 3, - "endLine": 2, - "endColumn": 6, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "endLine": 68, + "endColumn": 46, + "ruleDescription": "Condition referenced by resource is not defined", + "phase": "PARSE" }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Two' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Two", - "entityType": "Parameter" + "logicalId": "PublicSubnetRouteTableAssociation1", + "entityType": "Resource", + "resourceType": "AWS::EC2::SubnetRouteTableAssociation" }, - "propertyPath": "Parameters/Two", + "propertyPath": "Properties.RouteTableId", "category": "Best Practice", - "startLine": 4, - "startColumn": 3, - "endLine": 4, - "endColumn": 6, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" - } - ] - }, - "bad/resources/cloudformation/stacks.yaml": { - "filePath": "bad/resources/cloudformation/stacks.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 2, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 2, - "informational": 6, - "debug": 0 + "startLine": 25, + "startColumn": 9, + "endLine": 25, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "parameter 'PublicRouteTable' (type String)", + "extra": { + "replacement_strategy": "delete_then_create" + } + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "W3002", - "severity": "WARN", - "message": "This code may only work with 'package' cli command", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "PublicSubnetRouteTableAssociation1", + "entityType": "Resource", + "resourceType": "AWS::EC2::SubnetRouteTableAssociation" + }, + "propertyPath": "Properties.SubnetId", + "category": "Best Practice", + "startLine": 27, + "startColumn": 9, + "endLine": 27, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "parameter 'PublicSubnet01' (type String)", + "extra": { + "replacement_strategy": "delete_then_create" + } + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "PrivateSubnetRouteTableAssociation1", + "entityType": "Resource", + "resourceType": "AWS::EC2::SubnetRouteTableAssociation" + }, + "propertyPath": "Properties.RouteTableId", + "category": "Best Practice", + "startLine": 33, + "startColumn": 9, + "endLine": 33, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "parameter 'PrivateRouteTable' (type String)", + "extra": { + "replacement_strategy": "delete_then_create" + } + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "PrivateSubnetRouteTableAssociation1", + "entityType": "Resource", + "resourceType": "AWS::EC2::SubnetRouteTableAssociation" + }, + "propertyPath": "Properties.SubnetId", + "category": "Best Practice", + "startLine": 35, + "startColumn": 9, + "endLine": 35, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "parameter 'PublicSubnet01' (type String)", + "extra": { + "replacement_strategy": "delete_then_create" + } + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "AuxiliaryPublicSubnetRouteTableAssociation1", + "entityType": "Resource", + "resourceType": "AWS::EC2::SubnetRouteTableAssociation" + }, + "propertyPath": "Properties.RouteTableId", + "category": "Best Practice", + "startLine": 42, + "startColumn": 9, + "endLine": 42, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "parameter 'PublicRouteTable' (type String)", + "extra": { + "replacement_strategy": "delete_then_create" + } + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "StackNormal", + "logicalId": "AuxiliaryPublicSubnetRouteTableAssociation1", "entityType": "Resource", - "resourceType": "AWS::CloudFormation::Stack" + "resourceType": "AWS::EC2::SubnetRouteTableAssociation" }, - "propertyPath": "Properties.TemplateURL", + "propertyPath": "Properties.SubnetId", "category": "Best Practice", - "startLine": 9, - "startColumn": 7, - "endLine": 9, - "endColumn": 18, - "ruleDescription": "Warn when properties are configured to only work with the package command", - "phase": "LINT" + "startLine": 44, + "startColumn": 9, + "endLine": 44, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "parameter 'PublicSubnet01' (type String)", + "extra": { + "replacement_strategy": "delete_then_create" + } + } }, { - "ruleId": "W3002", - "severity": "WARN", - "message": "This code may only work with 'package' cli command", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Stack3", + "logicalId": "ProxySubnetRouteTableAssociation", "entityType": "Resource", - "resourceType": "AWS::CloudFormation::Stack" + "resourceType": "AWS::EC2::SubnetRouteTableAssociation" }, - "propertyPath": "Properties.TemplateURL", + "propertyPath": "Properties.RouteTableId", "category": "Best Practice", - "startLine": 17, - "startColumn": 7, - "endLine": 17, - "endColumn": 18, - "ruleDescription": "Warn when properties are configured to only work with the package command", - "phase": "LINT" + "startLine": 50, + "startColumn": 9, + "endLine": 50, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "parameter 'PublicRouteTable' (type String)", + "extra": { + "replacement_strategy": "delete_then_create" + } + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "StackNormal", + "logicalId": "ProxySubnetRouteTableAssociation", "entityType": "Resource", - "resourceType": "AWS::CloudFormation::Stack" + "resourceType": "AWS::EC2::SubnetRouteTableAssociation" }, + "propertyPath": "Properties.SubnetId", "category": "Best Practice", - "startLine": 6, - "startColumn": 3, - "endLine": 6, - "endColumn": 14, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 52, + "startColumn": 9, + "endLine": 52, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Fn::If on condition 'isPublic'", + "extra": { + "replacement_strategy": "delete_then_create" + } + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'ServiceToken' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "StackNormal", + "logicalId": "CustomResource", "entityType": "Resource", - "resourceType": "AWS::CloudFormation::Stack" + "resourceType": "AWS::CloudFormation::CustomResource" }, + "propertyPath": "Properties.ServiceToken", "category": "Best Practice", - "startLine": 6, - "startColumn": 3, - "endLine": 6, - "endColumn": 14, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 58, + "startColumn": 9, + "endLine": 58, + "endColumn": 21, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Stack3", + "logicalId": "CustomSubnetRouteTableAssociation", "entityType": "Resource", - "resourceType": "AWS::CloudFormation::Stack" + "resourceType": "AWS::EC2::SubnetRouteTableAssociation" }, + "propertyPath": "Properties.RouteTableId", "category": "Best Practice", - "startLine": 14, - "startColumn": 3, - "endLine": 14, - "endColumn": 9, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 63, + "startColumn": 9, + "endLine": 63, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "parameter 'PublicRouteTable' (type String)", + "extra": { + "replacement_strategy": "delete_then_create" + } + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Stack3", + "logicalId": "CustomSubnetRouteTableAssociation", "entityType": "Resource", - "resourceType": "AWS::CloudFormation::Stack" + "resourceType": "AWS::EC2::SubnetRouteTableAssociation" }, + "propertyPath": "Properties.SubnetId", "category": "Best Practice", - "startLine": 14, - "startColumn": 3, - "endLine": 14, - "endColumn": 9, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 65, + "startColumn": 9, + "endLine": 65, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "GetAtt CustomResource.PublicSubnet", + "extra": { + "replacement_strategy": "delete_then_create" + } + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'StackNormal' of type 'AWS::CloudFormation::Stack' supports Tags but none are configured", + "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "StackNormal", + "logicalId": "AuxilliaryCustomSubnetRouteTableAssociation", "entityType": "Resource", - "resourceType": "AWS::CloudFormation::Stack" + "resourceType": "AWS::EC2::SubnetRouteTableAssociation" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.RouteTableId", "category": "Best Practice", - "startLine": 8, - "startColumn": 5, - "endLine": 8, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 72, + "startColumn": 9, + "endLine": 72, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "parameter 'PublicRouteTable' (type String)", + "extra": { + "replacement_strategy": "delete_then_create" + } + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'Stack3' of type 'AWS::CloudFormation::Stack' supports Tags but none are configured", + "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Stack3", + "logicalId": "AuxilliaryCustomSubnetRouteTableAssociation", "entityType": "Resource", - "resourceType": "AWS::CloudFormation::Stack" + "resourceType": "AWS::EC2::SubnetRouteTableAssociation" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.SubnetId", "category": "Best Practice", - "startLine": 16, - "startColumn": 5, - "endLine": 16, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 74, + "startColumn": 9, + "endLine": 74, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "GetAtt CustomResource.PublicSubnet", + "extra": { + "replacement_strategy": "delete_then_create" + } + } } ] }, - "bad/resources/codepipeline/stages_second_stage.yaml": { - "filePath": "bad/resources/codepipeline/stages_second_stage.yaml", + "bad/properties_sg_ingress.yaml": { + "filePath": "bad/properties_sg_ingress.yaml", "status": "OK", "metadata": { - "resourcesScanned": 1, + "resourcesScanned": 9, "counts": { - "fatal": 2, - "errors": 1, - "warnings": 1, - "informational": 2, + "fatal": 5, + "errors": 13, + "warnings": 7, + "informational": 21, "debug": 0 }, "suppressed": 0, @@ -79086,828 +77677,914 @@ }, "diagnostics": [ { - "ruleId": "F1020", + "ruleId": "F3003", "severity": "FATAL", - "message": "'Github' is not one of ['AWS::AccountId', 'AWS::NoValue', 'AWS::NotificationARNs', 'AWS::Partition', 'AWS::Region', 'AWS::StackId', 'AWS::StackName', 'AWS::URLSuffix', 'TestPipeline']", + "message": "'IpProtocol' is a required property", "source": "SCHEMA", "entity": { - "logicalId": "TestPipeline", + "logicalId": "mySecurityGroupIngressExclusive", "entityType": "Resource", - "resourceType": "AWS::CodePipeline::Pipeline" + "resourceType": "AWS::EC2::SecurityGroupIngress" }, - "propertyPath": "Properties.Stages.1.Actions.0.Name", - "suggestedFix": "Check that the Ref target exists as a resource, parameter, or pseudo-parameter", - "category": "Intrinsic Function", - "startLine": 32, - "startColumn": 15, - "endLine": 32, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-codepipeline", - "ruleDescription": "Ref/GetAtt target must exist", + "propertyPath": "Properties", + "suggestedFix": "Add the required property 'IpProtocol'", + "category": "Schema", + "startLine": 73, + "startColumn": 5, + "endLine": 73, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Required property missing", + "phase": "SCHEMA" + }, + { + "ruleId": "F3014", + "severity": "FATAL", + "message": "Exactly one of ['CidrIp', 'CidrIpv6', 'SourcePrefixListId', 'SourceSecurityGroupId', 'SourceSecurityGroupName'] must be specified", + "source": "SCHEMA", + "entity": { + "logicalId": "mySecurityGroupVpc", + "entityType": "Resource", + "resourceType": "AWS::EC2::SecurityGroup" + }, + "propertyPath": "Properties.SecurityGroupIngress.1", + "category": "Schema", + "startLine": 38, + "startColumn": 19, + "endLine": 38, + "endColumn": 20, + "ruleDescription": "Exactly one of properties required (requiredXor)", + "phase": "SCHEMA" + }, + { + "ruleId": "F3014", + "severity": "FATAL", + "message": "Exactly one of ['CidrIp', 'CidrIpv6', 'SourcePrefixListId', 'SourceSecurityGroupId', 'SourceSecurityGroupName'] must be specified", + "source": "SCHEMA", + "entity": { + "logicalId": "mySecurityGroupVpc", + "entityType": "Resource", + "resourceType": "AWS::EC2::SecurityGroup" + }, + "propertyPath": "Properties.SecurityGroupIngress.4", + "category": "Schema", + "startLine": 48, + "startColumn": 19, + "endLine": 48, + "endColumn": 20, + "ruleDescription": "Exactly one of properties required (requiredXor)", + "phase": "SCHEMA" + }, + { + "ruleId": "F3014", + "severity": "FATAL", + "message": "Exactly one of ['CidrIp', 'CidrIpv6', 'SourcePrefixListId', 'SourceSecurityGroupId', 'SourceSecurityGroupName'] must be specified", + "source": "SCHEMA", + "entity": { + "logicalId": "mySecurityGroupIngressExclusive", + "entityType": "Resource", + "resourceType": "AWS::EC2::SecurityGroupIngress" + }, + "propertyPath": "Properties", + "category": "Schema", + "startLine": 73, + "startColumn": 5, + "endLine": 73, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Exactly one of properties required (requiredXor)", "phase": "SCHEMA" }, { "ruleId": "F3031", "severity": "FATAL", - "message": "'arn:aws:iam:::role/AWSCodePipelineRole' does not match pattern 'arn:aws(-[\\w]+)*:iam::[0-9]{12}:role/.*'", + "message": "'Special charaters like ^ and \" are not supported' does not match pattern '^([a-z,A-Z,0-9,. _\\-:/()#,@[\\]+=&;\\{\\}!$*])*$'", "source": "SCHEMA", "entity": { - "logicalId": "TestPipeline", + "logicalId": "mySecurityGroupNonVpc", "entityType": "Resource", - "resourceType": "AWS::CodePipeline::Pipeline" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.RoleArn", + "propertyPath": "Properties.GroupDescription", "category": "Schema", - "startLine": 12, + "startLine": 23, "startColumn": 7, - "endLine": 12, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-codepipeline", + "endLine": 23, + "endColumn": 23, "ruleDescription": "Value does not match pattern", "phase": "SCHEMA", "context": { - "actualValue": "arn:aws:iam:::role/AWSCodePipelineRole", - "expectedConstraint": "arn:aws(-[\\w]+)*:iam::[0-9]{12}:role/.*" + "actualValue": "Special charaters like ^ and \" are not supported", + "expectedConstraint": "^([a-z,A-Z,0-9,. _\\-:/()#,@[\\]+=&;\\{\\}!$*])*$" } }, { - "ruleId": "E1156", + "ruleId": "E1041", "severity": "ERROR", - "message": "'arn:aws:iam:::role/AWSCodePipelineRole' does not match format 'AWS::IAM::Role.Arn'", + "message": "{'Ref': 'mySecurityGroupNonVpc'} with formats ['AWS::EC2::SecurityGroup.Name'] does not match destination format of 'AWS::EC2::SecurityGroup.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "TestPipeline", + "logicalId": "mySecurityGroupVpc", "entityType": "Resource", - "resourceType": "AWS::CodePipeline::Pipeline" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.RoleArn", + "propertyPath": "Properties.SecurityGroupIngress.3.SourceSecurityGroupId", + "suggestedFix": "Use a Ref to a resource whose type matches the expected format", "category": "Intrinsic Function", - "startLine": 12, - "startColumn": 7, - "endLine": 12, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-codepipeline", - "ruleDescription": "Validate IAM role ARN format", - "phase": "SCHEMA", - "context": { - "actualValue": "arn:aws:iam:::role/AWSCodePipelineRole" - } + "startLine": 46, + "startColumn": 9, + "endLine": 46, + "endColumn": 30, + "ruleDescription": "Check if Ref matches destination format", + "phase": "LINT" }, { - "ruleId": "W9002", - "severity": "WARN", - "message": "Property 'RoleArn' has a hardcoded ARN - use Ref, GetAtt, or a parameter instead", - "source": "ENGINE", + "ruleId": "E1041", + "severity": "ERROR", + "message": "{'Ref': 'mySecurityGroupNonVpc'} with formats ['AWS::EC2::SecurityGroup.Name'] does not match destination format of 'AWS::EC2::SecurityGroup.Id'", + "source": "CFN_LINT", "entity": { - "logicalId": "TestPipeline", + "logicalId": "mySecurityGroupIngress", "entityType": "Resource", - "resourceType": "AWS::CodePipeline::Pipeline" + "resourceType": "AWS::EC2::SecurityGroupIngress" }, - "propertyPath": "Properties.RoleArn", - "category": "Best Practice", - "startLine": 12, + "propertyPath": "Properties.SourceSecurityGroupId", + "suggestedFix": "Use a Ref to a resource whose type matches the expected format", + "category": "Intrinsic Function", + "startLine": 64, "startColumn": 7, - "endLine": 12, - "endColumn": 14, - "ruleDescription": "Hardcoded ARN property", + "endLine": 64, + "endColumn": 28, + "ruleDescription": "Check if Ref matches destination format", "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Name' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E1150", + "severity": "ERROR", + "message": "'sg-1234567' does not match format 'AWS::EC2::SecurityGroup.Id'", + "source": "CFN_LINT", "entity": { - "logicalId": "TestPipeline", + "logicalId": "mySecurityGroupNonVpc", "entityType": "Resource", - "resourceType": "AWS::CodePipeline::Pipeline" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.Name", - "category": "Best Practice", - "startLine": 8, - "startColumn": 7, - "endLine": 8, - "endColumn": 11, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-codepipeline", - "ruleDescription": "Create-only property updated triggers resource replacement", + "propertyPath": "Properties.SecurityGroupIngress.0.SourceSecurityGroupId", + "category": "Intrinsic Function", + "startLine": 27, + "startColumn": 9, + "endLine": 27, + "endColumn": 30, + "ruleDescription": "Validate security group format", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "actualValue": "sg-1234567" } }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'TestPipeline' of type 'AWS::CodePipeline::Pipeline' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "TestPipeline", - "entityType": "Resource", - "resourceType": "AWS::CodePipeline::Pipeline" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 7, - "startColumn": 5, - "endLine": 7, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "bad/resources/creation_policy_unsupported_e3055.yaml": { - "filePath": "bad/resources/creation_policy_unsupported_e3055.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 0, - "informational": 2, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "E3055", + "ruleId": "E1150", "severity": "ERROR", - "message": "CreationPolicy is not supported on resource type 'AWS::S3::Bucket'", + "message": "'vpc-1234567' does not match format 'AWS::EC2::SecurityGroup.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "MyBucket", + "logicalId": "mySecurityGroupVpc", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "CreationPolicy", - "suggestedFix": "Remove CreationPolicy or change resource type to one of: AWS::AppStream::Fleet, AWS::AutoScaling::AutoScalingGroup, AWS::CloudFormation::WaitCondition, AWS::EC2::Instance", - "category": "Resource", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 19, - "ruleDescription": "Check CreationPolicy values for Resources", - "phase": "LINT" + "propertyPath": "Properties.SecurityGroupIngress.4.SourceSecurityGroupId", + "category": "Intrinsic Function", + "startLine": 49, + "startColumn": 9, + "endLine": 49, + "endColumn": 30, + "ruleDescription": "Validate security group format", + "phase": "SCHEMA", + "context": { + "actualValue": "vpc-1234567" + } }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-123456' does not match format 'AWS::EC2::Image.Id'", + "source": "CFN_LINT", "entity": { - "logicalId": "MyBucket", + "logicalId": "myInstance", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.BucketName", - "category": "Best Practice", - "startLine": 10, + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 79, "startColumn": 7, - "endLine": 10, - "endColumn": 17, - "ruleDescription": "Create-only property updated triggers resource replacement", + "endLine": 79, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "actualValue": "ami-123456" } }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'MyBucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "E3687", + "severity": "ERROR", + "message": "['FromPort', 'ToPort'] are required properties when using 'IpProtocol' value 1", + "source": "CFN_LINT", "entity": { - "logicalId": "MyBucket", + "logicalId": "mySecurityGroupNonVpc", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 9, - "startColumn": 5, - "endLine": 9, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "propertyPath": "Properties.SecurityGroupIngress.0", + "category": "Resource", + "startLine": 26, + "startColumn": 19, + "endLine": 26, + "endColumn": 20, + "ruleDescription": "Validate to and from ports based on the protocol", "phase": "LINT" - } - ] - }, - "bad/resources/dynamodb/attributes_transform_e3639.yaml": { - "filePath": "bad/resources/dynamodb/attributes_transform_e3639.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 3, - "counts": { - "fatal": 4, - "errors": 3, - "warnings": 0, - "informational": 12, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "F1101", - "severity": "FATAL", - "message": "Fn::Transform: Fn::Transform value must be an object", - "source": "SCHEMA", + "ruleId": "E3687", + "severity": "ERROR", + "message": "['FromPort', 'ToPort'] are required properties when using 'IpProtocol' value 1", + "source": "CFN_LINT", "entity": { - "logicalId": "DDBTableTransformAttributeDefinitions", + "logicalId": "mySecurityGroupVpc", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.AttributeDefinitions.Fn::Transform", - "category": "Structure", - "startLine": 11, - "startColumn": 9, - "endLine": 11, - "endColumn": 22, - "ruleDescription": "Invalid YAML/JSON syntax", - "phase": "PARSE" + "propertyPath": "Properties.SecurityGroupIngress.0", + "category": "Resource", + "startLine": 35, + "startColumn": 19, + "endLine": 35, + "endColumn": 20, + "ruleDescription": "Validate to and from ports based on the protocol", + "phase": "LINT" }, { - "ruleId": "F1101", - "severity": "FATAL", - "message": "Fn::Transform: Fn::Transform value must be an object", - "source": "SCHEMA", + "ruleId": "E3687", + "severity": "ERROR", + "message": "['FromPort', 'ToPort'] are required properties when using 'IpProtocol' value 1", + "source": "CFN_LINT", "entity": { - "logicalId": "DDBTableTransformKeySchema", + "logicalId": "mySecurityGroupVpc", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.KeySchema.Fn::Transform", - "category": "Structure", - "startLine": 25, - "startColumn": 9, - "endLine": 25, - "endColumn": 22, - "ruleDescription": "Invalid YAML/JSON syntax", - "phase": "PARSE" + "propertyPath": "Properties.SecurityGroupIngress.1", + "category": "Resource", + "startLine": 38, + "startColumn": 19, + "endLine": 38, + "endColumn": 20, + "ruleDescription": "Validate to and from ports based on the protocol", + "phase": "LINT" }, { - "ruleId": "F1101", - "severity": "FATAL", - "message": "Fn::Transform: Fn::Transform value must be an object", - "source": "SCHEMA", + "ruleId": "E3687", + "severity": "ERROR", + "message": "['FromPort', 'ToPort'] are required properties when using 'IpProtocol' value 1", + "source": "CFN_LINT", "entity": { - "logicalId": "DDBTableTransformBoth", + "logicalId": "mySecurityGroupVpc", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.AttributeDefinitions.Fn::Transform", - "category": "Structure", - "startLine": 33, - "startColumn": 9, - "endLine": 33, - "endColumn": 22, - "ruleDescription": "Invalid YAML/JSON syntax", - "phase": "PARSE" + "propertyPath": "Properties.SecurityGroupIngress.2", + "category": "Resource", + "startLine": 42, + "startColumn": 19, + "endLine": 42, + "endColumn": 20, + "ruleDescription": "Validate to and from ports based on the protocol", + "phase": "LINT" }, { - "ruleId": "F1101", - "severity": "FATAL", - "message": "Fn::Transform: Fn::Transform value must be an object", - "source": "SCHEMA", + "ruleId": "E3687", + "severity": "ERROR", + "message": "['FromPort', 'ToPort'] are required properties when using 'IpProtocol' value 1", + "source": "CFN_LINT", "entity": { - "logicalId": "DDBTableTransformBoth", + "logicalId": "mySecurityGroupVpc", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.KeySchema.Fn::Transform", - "category": "Structure", - "startLine": 38, - "startColumn": 9, - "endLine": 38, - "endColumn": 22, - "ruleDescription": "Invalid YAML/JSON syntax", - "phase": "PARSE" + "propertyPath": "Properties.SecurityGroupIngress.3", + "category": "Resource", + "startLine": 45, + "startColumn": 19, + "endLine": 45, + "endColumn": 20, + "ruleDescription": "Validate to and from ports based on the protocol", + "phase": "LINT" }, { - "ruleId": "E3639", + "ruleId": "E3687", "severity": "ERROR", - "message": "ProvisionedThroughput is required when BillingMode defaults to 'PROVISIONED'", + "message": "['FromPort', 'ToPort'] are required properties when using 'IpProtocol' value 1", "source": "CFN_LINT", "entity": { - "logicalId": "DDBTableTransformAttributeDefinitions", + "logicalId": "mySecurityGroupVpc", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.ProvisionedThroughput", - "suggestedFix": "Add ProvisionedThroughput or set BillingMode to 'PAY_PER_REQUEST'", + "propertyPath": "Properties.SecurityGroupIngress.4", "category": "Resource", - "startLine": 9, - "startColumn": 5, - "endLine": 9, - "endColumn": 15, - "ruleDescription": "Validate DynamoDB table ProvisionedThroughput is set when BillingMode is PROVISIONED", + "startLine": 48, + "startColumn": 19, + "endLine": 48, + "endColumn": 20, + "ruleDescription": "Validate to and from ports based on the protocol", "phase": "LINT" }, { - "ruleId": "E3639", + "ruleId": "E3687", "severity": "ERROR", - "message": "ProvisionedThroughput is required when BillingMode defaults to 'PROVISIONED'", + "message": "['FromPort', 'ToPort'] are required properties when using 'IpProtocol' value 1", "source": "CFN_LINT", "entity": { - "logicalId": "DDBTableTransformKeySchema", + "logicalId": "mySecurityGroupIngress", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::SecurityGroupIngress" }, - "propertyPath": "Properties.ProvisionedThroughput", - "suggestedFix": "Add ProvisionedThroughput or set BillingMode to 'PAY_PER_REQUEST'", + "propertyPath": "Properties", "category": "Resource", - "startLine": 20, + "startLine": 61, "startColumn": 5, - "endLine": 20, + "endLine": 61, "endColumn": 15, - "ruleDescription": "Validate DynamoDB table ProvisionedThroughput is set when BillingMode is PROVISIONED", + "ruleDescription": "Validate to and from ports based on the protocol", "phase": "LINT" }, { - "ruleId": "E3639", + "ruleId": "E3687", "severity": "ERROR", - "message": "ProvisionedThroughput is required when BillingMode defaults to 'PROVISIONED'", + "message": "['FromPort', 'ToPort'] are required properties when using 'IpProtocol' value 1", "source": "CFN_LINT", "entity": { - "logicalId": "DDBTableTransformBoth", + "logicalId": "mySecurityGroupIngress2", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::SecurityGroupIngress" }, - "propertyPath": "Properties.ProvisionedThroughput", - "suggestedFix": "Add ProvisionedThroughput or set BillingMode to 'PAY_PER_REQUEST'", + "propertyPath": "Properties", "category": "Resource", - "startLine": 31, + "startLine": 67, "startColumn": 5, - "endLine": 31, + "endLine": 67, "endColumn": 15, - "ruleDescription": "Validate DynamoDB table ProvisionedThroughput is set when BillingMode is PROVISIONED", + "ruleDescription": "Validate to and from ports based on the protocol", "phase": "LINT" }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "ruleId": "W9003", + "severity": "WARN", + "message": "1 is not of type 'string' - automatically coerced (number to string)", "source": "CFN_LINT", "entity": { - "logicalId": "DDBTableTransformAttributeDefinitions", + "logicalId": "mySecurityGroupNonVpc", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::SecurityGroup" }, + "propertyPath": "Properties.SecurityGroupIngress.0.IpProtocol", "category": "Best Practice", - "startLine": 7, - "startColumn": 3, - "endLine": 7, - "endColumn": 40, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 26, + "startColumn": 9, + "endLine": 26, + "endColumn": 19, + "ruleDescription": "Property type coercion warning", + "phase": "SCHEMA" }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "ruleId": "W9003", + "severity": "WARN", + "message": "1 is not of type 'string' - automatically coerced (number to string)", "source": "CFN_LINT", "entity": { - "logicalId": "DDBTableTransformAttributeDefinitions", + "logicalId": "mySecurityGroupVpc", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::SecurityGroup" }, + "propertyPath": "Properties.SecurityGroupIngress.0.IpProtocol", "category": "Best Practice", - "startLine": 7, - "startColumn": 3, - "endLine": 7, - "endColumn": 40, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 35, + "startColumn": 9, + "endLine": 35, + "endColumn": 19, + "ruleDescription": "Property type coercion warning", + "phase": "SCHEMA" }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "ruleId": "W9003", + "severity": "WARN", + "message": "1 is not of type 'string' - automatically coerced (number to string)", "source": "CFN_LINT", "entity": { - "logicalId": "DDBTableTransformKeySchema", + "logicalId": "mySecurityGroupVpc", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::SecurityGroup" }, + "propertyPath": "Properties.SecurityGroupIngress.1.IpProtocol", "category": "Best Practice", - "startLine": 18, - "startColumn": 3, - "endLine": 18, - "endColumn": 29, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 38, + "startColumn": 9, + "endLine": 38, + "endColumn": 19, + "ruleDescription": "Property type coercion warning", + "phase": "SCHEMA" }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "ruleId": "W9003", + "severity": "WARN", + "message": "1 is not of type 'string' - automatically coerced (number to string)", "source": "CFN_LINT", "entity": { - "logicalId": "DDBTableTransformKeySchema", + "logicalId": "mySecurityGroupVpc", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::SecurityGroup" }, + "propertyPath": "Properties.SecurityGroupIngress.3.IpProtocol", "category": "Best Practice", - "startLine": 18, - "startColumn": 3, - "endLine": 18, - "endColumn": 29, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 45, + "startColumn": 9, + "endLine": 45, + "endColumn": 19, + "ruleDescription": "Property type coercion warning", + "phase": "SCHEMA" }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "ruleId": "W9003", + "severity": "WARN", + "message": "1 is not of type 'string' - automatically coerced (number to string)", "source": "CFN_LINT", "entity": { - "logicalId": "DDBTableTransformBoth", + "logicalId": "mySecurityGroupVpc", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::SecurityGroup" }, + "propertyPath": "Properties.SecurityGroupIngress.4.IpProtocol", "category": "Best Practice", - "startLine": 29, - "startColumn": 3, - "endLine": 29, - "endColumn": 24, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 48, + "startColumn": 9, + "endLine": 48, + "endColumn": 19, + "ruleDescription": "Property type coercion warning", + "phase": "SCHEMA" }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "ruleId": "W9003", + "severity": "WARN", + "message": "1 is not of type 'string' - automatically coerced (number to string)", "source": "CFN_LINT", "entity": { - "logicalId": "DDBTableTransformBoth", + "logicalId": "mySecurityGroupIngress", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::SecurityGroupIngress" }, + "propertyPath": "Properties.IpProtocol", "category": "Best Practice", - "startLine": 29, - "startColumn": 3, - "endLine": 29, - "endColumn": 24, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 63, + "startColumn": 7, + "endLine": 63, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Property type coercion warning", + "phase": "SCHEMA" + }, + { + "ruleId": "W9003", + "severity": "WARN", + "message": "1 is not of type 'string' - automatically coerced (number to string)", + "source": "CFN_LINT", + "entity": { + "logicalId": "mySecurityGroupIngress2", + "entityType": "Resource", + "resourceType": "AWS::EC2::SecurityGroupIngress" + }, + "propertyPath": "Properties.IpProtocol", + "category": "Best Practice", + "startLine": 69, + "startColumn": 7, + "endLine": 69, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Property type coercion warning", + "phase": "SCHEMA" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DDBTableTransformAttributeDefinitions", + "logicalId": "mySecurityGroupNonVpc", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.KeySchema", + "propertyPath": "Properties.GroupDescription", "category": "Best Practice", - "startLine": 15, + "startLine": 23, "startColumn": 7, - "endLine": 15, - "endColumn": 16, + "endLine": 23, + "endColumn": 23, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DDBTableTransformKeySchema", + "logicalId": "mySecurityGroupVpc", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.KeySchema", + "propertyPath": "Properties.GroupDescription", "category": "Best Practice", - "startLine": 24, + "startLine": 31, "startColumn": 7, - "endLine": 24, - "endColumn": 16, + "endLine": 31, + "endColumn": 23, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DDBTableTransformBoth", + "logicalId": "mySecurityGroupVpc", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.KeySchema", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 37, + "startLine": 32, "startColumn": 7, - "endLine": 37, - "endColumn": 16, + "endLine": 32, + "endColumn": 12, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only", + "resolutionSource": "parameter 'myVpcId' (type AWS::EC2::VPC::Id)" } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'DDBTableTransformAttributeDefinitions' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", + "message": "Property 'GroupId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DDBTableTransformAttributeDefinitions", + "logicalId": "SecurityGroupRuleSSM", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::SecurityGroupIngress" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.GroupId", "category": "Best Practice", - "startLine": 9, - "startColumn": 5, - "endLine": 9, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 54, + "startColumn": 7, + "endLine": 54, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'mySecurityGroupVpc'" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'DDBTableTransformKeySchema' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", + "message": "Property 'IpProtocol' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DDBTableTransformKeySchema", + "logicalId": "SecurityGroupRuleSSM", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::SecurityGroupIngress" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.IpProtocol", "category": "Best Practice", - "startLine": 20, - "startColumn": 5, - "endLine": 20, + "startLine": 55, + "startColumn": 7, + "endLine": 55, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'FromPort' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "SecurityGroupRuleSSM", + "entityType": "Resource", + "resourceType": "AWS::EC2::SecurityGroupIngress" + }, + "propertyPath": "Properties.FromPort", + "category": "Best Practice", + "startLine": 56, + "startColumn": 7, + "endLine": 56, "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'DDBTableTransformBoth' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", + "message": "Property 'ToPort' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DDBTableTransformBoth", + "logicalId": "SecurityGroupRuleSSM", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::SecurityGroupIngress" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.ToPort", "category": "Best Practice", - "startLine": 31, - "startColumn": 5, - "endLine": 31, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "bad/resources/dynamodb/conditional_scenarios.yaml": { - "filePath": "bad/resources/dynamodb/conditional_scenarios.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 3, - "counts": { - "fatal": 0, - "errors": 3, - "warnings": 0, - "informational": 11, - "debug": 0 + "startLine": 57, + "startColumn": 7, + "endLine": 57, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "E3039", - "severity": "ERROR", - "message": "AttributeDefinitions does not match KeySchema attributes. unused definitions: [gsi_key]", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'CidrIp' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ConditionalGSI", + "logicalId": "SecurityGroupRuleSSM", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::SecurityGroupIngress" }, - "propertyPath": "Properties", - "category": "Resource", - "startLine": 22, - "startColumn": 5, - "endLine": 22, - "endColumn": 15, - "ruleDescription": "AttributeDefinitions / KeySchemas mismatch", - "phase": "LINT" + "propertyPath": "Properties.CidrIp", + "category": "Best Practice", + "startLine": 58, + "startColumn": 7, + "endLine": 58, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "dynamic (dynamic reference: {{resolve:ssm:mysubnet}})" + } }, { - "ruleId": "E3039", - "severity": "ERROR", - "message": "AttributeDefinitions does not match KeySchema attributes. unused definitions: [lsi_key]", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'GroupId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ConditionalLSI", + "logicalId": "mySecurityGroupIngress", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::SecurityGroupIngress" }, - "propertyPath": "Properties", - "category": "Resource", - "startLine": 37, - "startColumn": 5, - "endLine": 37, - "endColumn": 15, - "ruleDescription": "AttributeDefinitions / KeySchemas mismatch", - "phase": "LINT" + "propertyPath": "Properties.GroupId", + "category": "Best Practice", + "startLine": 62, + "startColumn": 7, + "endLine": 62, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'mySecurityGroupVpc'" + } }, { - "ruleId": "E3639", - "severity": "ERROR", - "message": "ProvisionedThroughput is required when BillingMode defaults to 'PROVISIONED'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'IpProtocol' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "MissingDefaultThroughput", + "logicalId": "mySecurityGroupIngress", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::SecurityGroupIngress" }, - "propertyPath": "Properties.ProvisionedThroughput", - "suggestedFix": "Add ProvisionedThroughput or set BillingMode to 'PAY_PER_REQUEST'", - "category": "Resource", - "startLine": 12, - "startColumn": 5, - "endLine": 12, - "endColumn": 15, - "ruleDescription": "Validate DynamoDB table ProvisionedThroughput is set when BillingMode is PROVISIONED", - "phase": "LINT" + "propertyPath": "Properties.IpProtocol", + "category": "Best Practice", + "startLine": 63, + "startColumn": 7, + "endLine": 63, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'SourceSecurityGroupId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "MissingDefaultThroughput", + "logicalId": "mySecurityGroupIngress", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::SecurityGroupIngress" }, + "propertyPath": "Properties.SourceSecurityGroupId", "category": "Best Practice", - "startLine": 10, - "startColumn": 3, - "endLine": 10, - "endColumn": 27, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 64, + "startColumn": 7, + "endLine": 64, + "endColumn": 28, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'mySecurityGroupNonVpc'" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'GroupId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "MissingDefaultThroughput", + "logicalId": "mySecurityGroupIngress2", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::SecurityGroupIngress" }, + "propertyPath": "Properties.GroupId", "category": "Best Practice", - "startLine": 10, - "startColumn": 3, - "endLine": 10, - "endColumn": 27, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 68, + "startColumn": 7, + "endLine": 68, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'mySecurityGroupVpc'" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'IpProtocol' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ConditionalGSI", + "logicalId": "mySecurityGroupIngress2", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::SecurityGroupIngress" }, + "propertyPath": "Properties.IpProtocol", "category": "Best Practice", - "startLine": 20, - "startColumn": 3, - "endLine": 20, + "startLine": 69, + "startColumn": 7, + "endLine": 69, "endColumn": 17, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'SourceSecurityGroupId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ConditionalGSI", + "logicalId": "mySecurityGroupIngress2", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::SecurityGroupIngress" }, + "propertyPath": "Properties.SourceSecurityGroupId", "category": "Best Practice", - "startLine": 20, - "startColumn": 3, - "endLine": 20, - "endColumn": 17, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 70, + "startColumn": 7, + "endLine": 70, + "endColumn": 28, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "parameter 'mySecurity3Group' (type String)" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'GroupId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ConditionalLSI", + "logicalId": "mySecurityGroupIngressExclusive", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::SecurityGroupIngress" }, + "propertyPath": "Properties.GroupId", "category": "Best Practice", - "startLine": 35, - "startColumn": 3, - "endLine": 35, - "endColumn": 17, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 74, + "startColumn": 7, + "endLine": 74, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'mySecurityGroupVpc'" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'GroupName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ConditionalLSI", + "logicalId": "mySecurityGroupIngressExclusive", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::SecurityGroupIngress" }, + "propertyPath": "Properties.GroupName", "category": "Best Practice", - "startLine": 35, - "startColumn": 3, - "endLine": 35, - "endColumn": 17, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 75, + "startColumn": 7, + "endLine": 75, + "endColumn": 16, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConditionalGSI", + "logicalId": "myInstance", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.KeySchema", + "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 27, + "startLine": 79, "startColumn": 7, - "endLine": 27, - "endColumn": 16, + "endLine": 79, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'SecurityGroupIds' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConditionalLSI", + "logicalId": "myInstance", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.KeySchema", + "propertyPath": "Properties.SecurityGroupIds", "category": "Best Practice", - "startLine": 43, + "startLine": 80, "startColumn": 7, - "endLine": 43, - "endColumn": 16, + "endLine": 80, + "endColumn": 23, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -79917,19 +78594,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'MissingDefaultThroughput' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", + "message": "Resource 'mySecurityGroupNonVpc' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "MissingDefaultThroughput", + "logicalId": "mySecurityGroupNonVpc", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::SecurityGroup" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 12, + "startLine": 22, "startColumn": 5, - "endLine": 12, + "endLine": 22, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -79937,19 +78614,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'ConditionalGSI' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", + "message": "Resource 'mySecurityGroupVpc' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ConditionalGSI", + "logicalId": "mySecurityGroupVpc", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::SecurityGroup" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 22, + "startLine": 30, "startColumn": 5, - "endLine": 22, + "endLine": 30, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -79957,35 +78634,35 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'ConditionalLSI' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", + "message": "Resource 'myInstance' of type 'AWS::EC2::Instance' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ConditionalLSI", + "logicalId": "myInstance", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 37, + "startLine": 78, "startColumn": 5, - "endLine": 37, + "endLine": 78, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "bad/resources/dynamodb/provisioned_throughput_e3639.yaml": { - "filePath": "bad/resources/dynamodb/provisioned_throughput_e3639.yaml", + "bad/rds_dbclusterinstanceclass_invalid.yaml": { + "filePath": "bad/rds_dbclusterinstanceclass_invalid.yaml", "status": "OK", "metadata": { - "resourcesScanned": 7, + "resourcesScanned": 1, "counts": { - "fatal": 1, - "errors": 7, - "warnings": 0, - "informational": 31, + "fatal": 3, + "errors": 1, + "warnings": 1, + "informational": 7, "debug": 0 }, "suppressed": 0, @@ -79996,161 +78673,102 @@ { "ruleId": "F3003", "severity": "FATAL", - "message": "'ProvisionedThroughput' is a required property (from extension)", + "message": "'AllocatedStorage' is a required property (from extension)", "source": "SCHEMA", "entity": { - "logicalId": "ExplicitProvisioned", + "logicalId": "Cluster", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::RDS::DBCluster" }, "propertyPath": "Properties", - "suggestedFix": "Add 'ProvisionedThroughput'", + "suggestedFix": "Add 'AllocatedStorage'", "category": "Schema", - "startLine": 10, + "startLine": 7, "startColumn": 5, - "endLine": 10, + "endLine": 7, "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", "ruleDescription": "Required property missing", "phase": "SCHEMA" }, { - "ruleId": "E3639", - "severity": "ERROR", - "message": "ProvisionedThroughput is required when BillingMode is 'PROVISIONED'", - "source": "CFN_LINT", - "entity": { - "logicalId": "ExplicitProvisioned", - "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" - }, - "propertyPath": "Properties.ProvisionedThroughput", - "suggestedFix": "Add ProvisionedThroughput or set BillingMode to 'PAY_PER_REQUEST'", - "category": "Resource", - "startLine": 10, - "startColumn": 5, - "endLine": 10, - "endColumn": 15, - "ruleDescription": "Validate DynamoDB table ProvisionedThroughput is set when BillingMode is PROVISIONED", - "phase": "LINT" - }, - { - "ruleId": "E3639", - "severity": "ERROR", - "message": "ProvisionedThroughput is required when BillingMode defaults to 'PROVISIONED'", - "source": "CFN_LINT", + "ruleId": "F3003", + "severity": "FATAL", + "message": "'Iops' is a required property (from extension)", + "source": "SCHEMA", "entity": { - "logicalId": "DefaultProvisioned", + "logicalId": "Cluster", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::RDS::DBCluster" }, - "propertyPath": "Properties.ProvisionedThroughput", - "suggestedFix": "Add ProvisionedThroughput or set BillingMode to 'PAY_PER_REQUEST'", - "category": "Resource", - "startLine": 23, + "propertyPath": "Properties", + "suggestedFix": "Add 'Iops'", + "category": "Schema", + "startLine": 7, "startColumn": 5, - "endLine": 23, + "endLine": 7, "endColumn": 15, - "ruleDescription": "Validate DynamoDB table ProvisionedThroughput is set when BillingMode is PROVISIONED", - "phase": "LINT" - }, - { - "ruleId": "E3639", - "severity": "ERROR", - "message": "ProvisionedThroughput is required when BillingMode is 'PROVISIONED'", - "source": "CFN_LINT", - "entity": { - "logicalId": "NullThroughput", - "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" - }, - "propertyPath": "Properties.ProvisionedThroughput", - "suggestedFix": "Add ProvisionedThroughput or set BillingMode to 'PAY_PER_REQUEST'", - "category": "Resource", - "startLine": 44, - "startColumn": 7, - "endLine": 44, - "endColumn": 28, - "ruleDescription": "Validate DynamoDB table ProvisionedThroughput is set when BillingMode is PROVISIONED", - "phase": "LINT" - }, - { - "ruleId": "E3639", - "severity": "ERROR", - "message": "ProvisionedThroughput is required when BillingMode is 'PROVISIONED'", - "source": "CFN_LINT", - "entity": { - "logicalId": "ExplicitValueThenRemoved", - "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" - }, - "propertyPath": "Properties.ProvisionedThroughput", - "suggestedFix": "Add ProvisionedThroughput or set BillingMode to 'PAY_PER_REQUEST'", - "category": "Resource", - "startLine": 54, - "startColumn": 7, - "endLine": 54, - "endColumn": 28, - "ruleDescription": "Validate DynamoDB table ProvisionedThroughput is set when BillingMode is PROVISIONED", - "phase": "LINT" + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", + "ruleDescription": "Required property missing", + "phase": "SCHEMA" }, { - "ruleId": "E3639", - "severity": "ERROR", - "message": "ProvisionedThroughput is required when BillingMode is 'PROVISIONED'", - "source": "CFN_LINT", + "ruleId": "F3003", + "severity": "FATAL", + "message": "'StorageType' is a required property (from extension)", + "source": "SCHEMA", "entity": { - "logicalId": "ExplicitRemovedThenValue", + "logicalId": "Cluster", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::RDS::DBCluster" }, - "propertyPath": "Properties.ProvisionedThroughput", - "suggestedFix": "Add ProvisionedThroughput or set BillingMode to 'PAY_PER_REQUEST'", - "category": "Resource", - "startLine": 65, - "startColumn": 7, - "endLine": 65, - "endColumn": 28, - "ruleDescription": "Validate DynamoDB table ProvisionedThroughput is set when BillingMode is PROVISIONED", - "phase": "LINT" + "propertyPath": "Properties", + "suggestedFix": "Add 'StorageType'", + "category": "Schema", + "startLine": 7, + "startColumn": 5, + "endLine": 7, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", + "ruleDescription": "Required property missing", + "phase": "SCHEMA" }, { - "ruleId": "E3639", + "ruleId": "E3694", "severity": "ERROR", - "message": "ProvisionedThroughput is required when BillingMode defaults to 'PROVISIONED'", + "message": "'db.bogus.class' is not one of ['db.c6gd.12xlarge', 'db.c6gd.16xlarge', 'db.c6gd.2xlarge', 'db.c6gd.4xlarge', 'db.c6gd.8xlarge', 'db.c6gd.large', 'db.c6gd.medium', 'db.c6gd.xlarge', 'db.m5d.12xlarge', 'db.m5d.16xlarge', 'db.m5d.24xlarge', 'db.m5d.2xlarge', 'db.m5d.4xlarge', 'db.m5d.8xlarge', 'db.m5d.large', 'db.m5d.xlarge', 'db.m6gd.12xlarge', 'db.m6gd.16xlarge', 'db.m6gd.2xlarge', 'db.m6gd.4xlarge', 'db.m6gd.8xlarge', 'db.m6gd.large', 'db.m6gd.xlarge', 'db.m6id.12xlarge', 'db.m6id.16xlarge', 'db.m6id.24xlarge', 'db.m6id.2xlarge', 'db.m6id.32xlarge', 'db.m6id.4xlarge', 'db.m6id.8xlarge', 'db.m6id.large', 'db.m6id.xlarge', 'db.m6idn.12xlarge', 'db.m6idn.16xlarge', 'db.m6idn.24xlarge', 'db.m6idn.2xlarge', 'db.m6idn.32xlarge', 'db.m6idn.4xlarge', 'db.m6idn.8xlarge', 'db.m6idn.large', 'db.m6idn.xlarge', 'db.m8gd.12xlarge', 'db.m8gd.16xlarge', 'db.m8gd.24xlarge', 'db.m8gd.2xlarge', 'db.m8gd.48xlarge', 'db.m8gd.4xlarge', 'db.m8gd.8xlarge', 'db.m8gd.large', 'db.m8gd.xlarge', 'db.r5d.12xlarge', 'db.r5d.16xlarge', 'db.r5d.24xlarge', 'db.r5d.2xlarge', 'db.r5d.4xlarge', 'db.r5d.8xlarge', 'db.r5d.large', 'db.r5d.xlarge', 'db.r6gd.12xlarge', 'db.r6gd.16xlarge', 'db.r6gd.2xlarge', 'db.r6gd.4xlarge', 'db.r6gd.8xlarge', 'db.r6gd.large', 'db.r6gd.xlarge', 'db.r6id.12xlarge', 'db.r6id.16xlarge', 'db.r6id.24xlarge', 'db.r6id.2xlarge', 'db.r6id.32xlarge', 'db.r6id.4xlarge', 'db.r6id.8xlarge', 'db.r6id.large', 'db.r6id.xlarge', 'db.r6idn.12xlarge', 'db.r6idn.16xlarge', 'db.r6idn.24xlarge', 'db.r6idn.2xlarge', 'db.r6idn.32xlarge', 'db.r6idn.4xlarge', 'db.r6idn.8xlarge', 'db.r6idn.large', 'db.r6idn.xlarge', 'db.r8gd.12xlarge', 'db.r8gd.16xlarge', 'db.r8gd.24xlarge', 'db.r8gd.2xlarge', 'db.r8gd.48xlarge', 'db.r8gd.4xlarge', 'db.r8gd.8xlarge', 'db.r8gd.large', 'db.r8gd.xlarge', 'db.x2idn.16xlarge', 'db.x2idn.24xlarge', 'db.x2idn.32xlarge', 'db.x2iedn.16xlarge', 'db.x2iedn.24xlarge', 'db.x2iedn.2xlarge', 'db.x2iedn.32xlarge', 'db.x2iedn.4xlarge', 'db.x2iedn.8xlarge', 'db.x2iedn.xlarge'] when Engine is 'mysql' in any region", "source": "CFN_LINT", "entity": { - "logicalId": "DefaultValueThenRemoved", + "logicalId": "Cluster", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::RDS::DBCluster" }, - "propertyPath": "Properties.ProvisionedThroughput", - "suggestedFix": "Add ProvisionedThroughput or set BillingMode to 'PAY_PER_REQUEST'", + "propertyPath": "Properties.DBClusterInstanceClass", "category": "Resource", - "startLine": 75, + "startLine": 9, "startColumn": 7, - "endLine": 75, - "endColumn": 28, - "ruleDescription": "Validate DynamoDB table ProvisionedThroughput is set when BillingMode is PROVISIONED", + "endLine": 9, + "endColumn": 29, + "ruleDescription": "Validates RDS DB Cluster instance class", "phase": "LINT" }, { - "ruleId": "E3639", - "severity": "ERROR", - "message": "ProvisionedThroughput is required when BillingMode defaults to 'PROVISIONED'", + "ruleId": "W2501", + "severity": "WARN", + "message": "Property 'MasterUserPassword' should not be a hardcoded string - use a parameter with NoEcho or a dynamic reference", "source": "CFN_LINT", "entity": { - "logicalId": "DefaultRemovedThenValue", + "logicalId": "Cluster", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::RDS::DBCluster" }, - "propertyPath": "Properties.ProvisionedThroughput", - "suggestedFix": "Add ProvisionedThroughput or set BillingMode to 'PAY_PER_REQUEST'", - "category": "Resource", - "startLine": 85, + "propertyPath": "Properties.MasterUserPassword", + "category": "Security", + "startLine": 11, "startColumn": 7, - "endLine": 85, - "endColumn": 28, - "ruleDescription": "Validate DynamoDB table ProvisionedThroughput is set when BillingMode is PROVISIONED", + "endLine": 11, + "endColumn": 25, + "ruleDescription": "Check if Password Properties are correctly configured", "phase": "LINT" }, { @@ -80159,15 +78777,15 @@ "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "ExplicitProvisioned", + "logicalId": "Cluster", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::RDS::DBCluster" }, "category": "Best Practice", - "startLine": 8, + "startLine": 5, "startColumn": 3, - "endLine": 8, - "endColumn": 22, + "endLine": 5, + "endColumn": 10, "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, @@ -80177,88 +78795,168 @@ "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "ExplicitProvisioned", + "logicalId": "Cluster", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::RDS::DBCluster" }, "category": "Best Practice", - "startLine": 8, + "startLine": 5, "startColumn": 3, - "endLine": 8, - "endColumn": 22, + "endLine": 5, + "endColumn": 10, "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "I3011", + "ruleId": "I3013", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", "source": "CFN_LINT", "entity": { - "logicalId": "DefaultProvisioned", + "logicalId": "Cluster", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::RDS::DBCluster" }, + "propertyPath": "Properties", "category": "Best Practice", - "startLine": 21, - "startColumn": 3, - "endLine": 21, - "endColumn": 21, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "startLine": 7, + "startColumn": 5, + "endLine": 7, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", "phase": "LINT" }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "DefaultProvisioned", + "logicalId": "Cluster", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::RDS::DBCluster" }, + "propertyPath": "Properties.Engine", "category": "Best Practice", - "startLine": 21, - "startColumn": 3, - "endLine": 21, + "startLine": 8, + "startColumn": 7, + "endLine": 8, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'MasterUsername' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "Cluster", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBCluster" + }, + "propertyPath": "Properties.MasterUsername", + "category": "Best Practice", + "startLine": 10, + "startColumn": 7, + "endLine": 10, "endColumn": 21, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } + }, + { + "ruleId": "I9003", + "severity": "INFO", + "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", + "source": "ENGINE", + "category": "Best Practice", + "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", "phase": "LINT" }, { - "ruleId": "I3011", + "ruleId": "I9040", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Resource 'Cluster' of type 'AWS::RDS::DBCluster' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "NullThroughput", + "logicalId": "Cluster", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::RDS::DBCluster" }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 33, - "startColumn": 3, - "endLine": 33, - "endColumn": 17, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "startLine": 7, + "startColumn": 5, + "endLine": 7, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "bad/rds_dbinstanceclass_mixed_case_engine.yaml": { + "filePath": "bad/rds_dbinstanceclass_mixed_case_engine.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 1, + "warnings": 1, + "informational": 6, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "ruleId": "E3025", + "severity": "ERROR", + "message": "'totally.bogus.class' is not one of ['db.m1.large', 'db.m1.medium', 'db.m1.small', 'db.m1.xlarge', 'db.m2.2xlarge', 'db.m2.4xlarge', 'db.m2.xlarge', 'db.m3.2xlarge', 'db.m3.large', 'db.m3.medium', 'db.m3.xlarge', 'db.m4.10xlarge', 'db.m4.16xlarge', 'db.m4.2xlarge', 'db.m4.4xlarge', 'db.m4.large', 'db.m4.xlarge', 'db.m5.12xlarge', 'db.m5.16xlarge', 'db.m5.24xlarge', 'db.m5.2xlarge', 'db.m5.4xlarge', 'db.m5.8xlarge', 'db.m5.large', 'db.m5.xlarge', 'db.m5d.12xlarge', 'db.m5d.16xlarge', 'db.m5d.24xlarge', 'db.m5d.2xlarge', 'db.m5d.4xlarge', 'db.m5d.8xlarge', 'db.m5d.large', 'db.m5d.xlarge', 'db.m6g.12xlarge', 'db.m6g.16xlarge', 'db.m6g.2xlarge', 'db.m6g.4xlarge', 'db.m6g.8xlarge', 'db.m6g.large', 'db.m6g.xlarge', 'db.m6gd.12xlarge', 'db.m6gd.16xlarge', 'db.m6gd.2xlarge', 'db.m6gd.4xlarge', 'db.m6gd.8xlarge', 'db.m6gd.large', 'db.m6gd.xlarge', 'db.m6i.12xlarge', 'db.m6i.16xlarge', 'db.m6i.24xlarge', 'db.m6i.2xlarge', 'db.m6i.32xlarge', 'db.m6i.4xlarge', 'db.m6i.8xlarge', 'db.m6i.large', 'db.m6i.xlarge', 'db.m6id.12xlarge', 'db.m6id.16xlarge', 'db.m6id.24xlarge', 'db.m6id.2xlarge', 'db.m6id.32xlarge', 'db.m6id.4xlarge', 'db.m6id.8xlarge', 'db.m6id.large', 'db.m6id.xlarge', 'db.m6idn.12xlarge', 'db.m6idn.16xlarge', 'db.m6idn.24xlarge', 'db.m6idn.2xlarge', 'db.m6idn.32xlarge', 'db.m6idn.4xlarge', 'db.m6idn.8xlarge', 'db.m6idn.large', 'db.m6idn.xlarge', 'db.m6in.12xlarge', 'db.m6in.16xlarge', 'db.m6in.24xlarge', 'db.m6in.2xlarge', 'db.m6in.32xlarge', 'db.m6in.4xlarge', 'db.m6in.8xlarge', 'db.m6in.large', 'db.m6in.xlarge', 'db.m7g.12xlarge', 'db.m7g.16xlarge', 'db.m7g.2xlarge', 'db.m7g.4xlarge', 'db.m7g.8xlarge', 'db.m7g.large', 'db.m7g.xlarge', 'db.m7i.12xlarge', 'db.m7i.16xlarge', 'db.m7i.24xlarge', 'db.m7i.2xlarge', 'db.m7i.48xlarge', 'db.m7i.4xlarge', 'db.m7i.8xlarge', 'db.m7i.large', 'db.m7i.xlarge', 'db.m8g.12xlarge', 'db.m8g.16xlarge', 'db.m8g.24xlarge', 'db.m8g.2xlarge', 'db.m8g.48xlarge', 'db.m8g.4xlarge', 'db.m8g.8xlarge', 'db.m8g.large', 'db.m8g.xlarge', 'db.m8gd.12xlarge', 'db.m8gd.16xlarge', 'db.m8gd.24xlarge', 'db.m8gd.2xlarge', 'db.m8gd.48xlarge', 'db.m8gd.4xlarge', 'db.m8gd.8xlarge', 'db.m8gd.large', 'db.m8gd.xlarge', 'db.m9g.12xlarge', 'db.m9g.16xlarge', 'db.m9g.24xlarge', 'db.m9g.2xlarge', 'db.m9g.48xlarge', 'db.m9g.4xlarge', 'db.m9g.8xlarge', 'db.m9g.large', 'db.m9g.xlarge', 'db.r3.2xlarge', 'db.r3.4xlarge', 'db.r3.8xlarge', 'db.r3.large', 'db.r3.xlarge', 'db.r4.16xlarge', 'db.r4.2xlarge', 'db.r4.4xlarge', 'db.r4.8xlarge', 'db.r4.large', 'db.r4.xlarge', 'db.r5.12xlarge', 'db.r5.16xlarge', 'db.r5.24xlarge', 'db.r5.2xlarge', 'db.r5.4xlarge', 'db.r5.8xlarge', 'db.r5.large', 'db.r5.xlarge', 'db.r5b.12xlarge', 'db.r5b.16xlarge', 'db.r5b.24xlarge', 'db.r5b.2xlarge', 'db.r5b.4xlarge', 'db.r5b.8xlarge', 'db.r5b.large', 'db.r5b.xlarge', 'db.r5d.12xlarge', 'db.r5d.16xlarge', 'db.r5d.24xlarge', 'db.r5d.2xlarge', 'db.r5d.4xlarge', 'db.r5d.8xlarge', 'db.r5d.large', 'db.r5d.xlarge', 'db.r6g.12xlarge', 'db.r6g.16xlarge', 'db.r6g.2xlarge', 'db.r6g.4xlarge', 'db.r6g.8xlarge', 'db.r6g.large', 'db.r6g.xlarge', 'db.r6gd.12xlarge', 'db.r6gd.16xlarge', 'db.r6gd.2xlarge', 'db.r6gd.4xlarge', 'db.r6gd.8xlarge', 'db.r6gd.large', 'db.r6gd.xlarge', 'db.r6i.12xlarge', 'db.r6i.16xlarge', 'db.r6i.24xlarge', 'db.r6i.2xlarge', 'db.r6i.32xlarge', 'db.r6i.4xlarge', 'db.r6i.8xlarge', 'db.r6i.large', 'db.r6i.xlarge', 'db.r6id.12xlarge', 'db.r6id.16xlarge', 'db.r6id.24xlarge', 'db.r6id.2xlarge', 'db.r6id.32xlarge', 'db.r6id.4xlarge', 'db.r6id.8xlarge', 'db.r6id.large', 'db.r6id.xlarge', 'db.r6idn.12xlarge', 'db.r6idn.16xlarge', 'db.r6idn.24xlarge', 'db.r6idn.2xlarge', 'db.r6idn.32xlarge', 'db.r6idn.4xlarge', 'db.r6idn.8xlarge', 'db.r6idn.large', 'db.r6idn.xlarge', 'db.r6in.12xlarge', 'db.r6in.16xlarge', 'db.r6in.24xlarge', 'db.r6in.2xlarge', 'db.r6in.32xlarge', 'db.r6in.4xlarge', 'db.r6in.8xlarge', 'db.r6in.large', 'db.r6in.xlarge', 'db.r7g.12xlarge', 'db.r7g.16xlarge', 'db.r7g.2xlarge', 'db.r7g.4xlarge', 'db.r7g.8xlarge', 'db.r7g.large', 'db.r7g.xlarge', 'db.r7i.12xlarge', 'db.r7i.16xlarge', 'db.r7i.24xlarge', 'db.r7i.2xlarge', 'db.r7i.48xlarge', 'db.r7i.4xlarge', 'db.r7i.8xlarge', 'db.r7i.large', 'db.r7i.xlarge', 'db.r8g.12xlarge', 'db.r8g.16xlarge', 'db.r8g.24xlarge', 'db.r8g.2xlarge', 'db.r8g.48xlarge', 'db.r8g.4xlarge', 'db.r8g.8xlarge', 'db.r8g.large', 'db.r8g.xlarge', 'db.r8gd.12xlarge', 'db.r8gd.16xlarge', 'db.r8gd.24xlarge', 'db.r8gd.2xlarge', 'db.r8gd.48xlarge', 'db.r8gd.4xlarge', 'db.r8gd.8xlarge', 'db.r8gd.large', 'db.r8gd.xlarge', 'db.t1.micro', 'db.t2.2xlarge', 'db.t2.large', 'db.t2.medium', 'db.t2.micro', 'db.t2.small', 'db.t2.xlarge', 'db.t3.2xlarge', 'db.t3.large', 'db.t3.medium', 'db.t3.micro', 'db.t3.small', 'db.t3.xlarge', 'db.t4g.2xlarge', 'db.t4g.large', 'db.t4g.medium', 'db.t4g.micro', 'db.t4g.small', 'db.t4g.xlarge', 'db.x2g.12xlarge', 'db.x2g.16xlarge', 'db.x2g.2xlarge', 'db.x2g.4xlarge', 'db.x2g.8xlarge', 'db.x2g.large', 'db.x2g.xlarge', 'db.x2iedn.16xlarge', 'db.x2iedn.24xlarge', 'db.x2iedn.2xlarge', 'db.x2iedn.32xlarge', 'db.x2iedn.4xlarge', 'db.x2iedn.8xlarge', 'db.x2iedn.xlarge'] when Engine is 'mysql' in any region", "source": "CFN_LINT", "entity": { - "logicalId": "NullThroughput", + "logicalId": "Db", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::RDS::DBInstance" }, - "category": "Best Practice", - "startLine": 33, - "startColumn": 3, - "endLine": 33, - "endColumn": 17, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "propertyPath": "Properties.DBInstanceClass", + "category": "Resource", + "startLine": 9, + "startColumn": 7, + "endLine": 9, + "endColumn": 22, + "ruleDescription": "Validates RDS DB Instance Class", + "phase": "LINT" + }, + { + "ruleId": "W9008", + "severity": "WARN", + "message": "RDS instance should have StorageEncrypted set to true", + "source": "ENGINE", + "entity": { + "logicalId": "Db", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.StorageEncrypted", + "suggestedFix": "Set StorageEncrypted to true", + "category": "Security", + "startLine": 7, + "startColumn": 5, + "endLine": 7, + "endColumn": 15, + "ruleDescription": "RDS instance should have StorageEncrypted", "phase": "LINT" }, { @@ -80267,15 +78965,15 @@ "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "ExplicitValueThenRemoved", + "logicalId": "Db", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::RDS::DBInstance" }, "category": "Best Practice", - "startLine": 48, + "startLine": 5, "startColumn": 3, - "endLine": 48, - "endColumn": 27, + "endLine": 5, + "endColumn": 5, "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, @@ -80285,69 +78983,165 @@ "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "ExplicitValueThenRemoved", + "logicalId": "Db", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::RDS::DBInstance" }, "category": "Best Practice", - "startLine": 48, + "startLine": 5, "startColumn": 3, - "endLine": 48, - "endColumn": 27, + "endLine": 5, + "endColumn": 5, "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "I3011", + "ruleId": "I3013", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", "source": "CFN_LINT", "entity": { - "logicalId": "ExplicitRemovedThenValue", + "logicalId": "Db", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::RDS::DBInstance" }, + "propertyPath": "Properties", "category": "Best Practice", - "startLine": 59, - "startColumn": 3, - "endLine": 59, - "endColumn": 27, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "startLine": 7, + "startColumn": 5, + "endLine": 7, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", "phase": "LINT" }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ExplicitRemovedThenValue", + "logicalId": "Db", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::RDS::DBInstance" }, + "propertyPath": "Properties.Engine", "category": "Best Practice", - "startLine": 59, - "startColumn": 3, - "endLine": 59, - "endColumn": 27, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "startLine": 8, + "startColumn": 7, + "endLine": 8, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } + }, + { + "ruleId": "I9003", + "severity": "INFO", + "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", + "source": "ENGINE", + "category": "Best Practice", + "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Db' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "Db", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 7, + "startColumn": 5, + "endLine": 7, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "bad/rds_public.yaml": { + "filePath": "bad/rds_public.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 2, + "informational": 8, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "W2501", + "severity": "WARN", + "message": "Property 'MasterUserPassword' should not be a hardcoded string - use a parameter with NoEcho or a dynamic reference", + "source": "CFN_LINT", + "entity": { + "logicalId": "Database", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.MasterUserPassword", + "category": "Security", + "startLine": 9, + "startColumn": 7, + "endLine": 9, + "endColumn": 25, + "ruleDescription": "Check if Password Properties are correctly configured", "phase": "LINT" }, + { + "ruleId": "W9011", + "severity": "WARN", + "message": "RDS instance has PubliclyAccessible set to true - consider restricting access", + "source": "ENGINE", + "entity": { + "logicalId": "Database", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.PubliclyAccessible", + "suggestedFix": "Set PubliclyAccessible to false", + "category": "Security", + "startLine": 11, + "startColumn": 7, + "endLine": 11, + "endColumn": 25, + "ruleDescription": "RDS instance PubliclyAccessible is true", + "phase": "LINT", + "context": { + "actualValue": true + } + }, { "ruleId": "I3011", "severity": "INFO", "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "DefaultValueThenRemoved", + "logicalId": "Database", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::RDS::DBInstance" }, "category": "Best Practice", - "startLine": 70, + "startLine": 3, "startColumn": 3, - "endLine": 70, - "endColumn": 26, + "endLine": 3, + "endColumn": 11, "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, @@ -80357,70 +79151,77 @@ "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "DefaultValueThenRemoved", + "logicalId": "Database", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::RDS::DBInstance" }, "category": "Best Practice", - "startLine": 70, + "startLine": 3, "startColumn": 3, - "endLine": 70, - "endColumn": 26, + "endLine": 3, + "endColumn": 11, "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "I3011", + "ruleId": "I3013", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", "source": "CFN_LINT", "entity": { - "logicalId": "DefaultRemovedThenValue", + "logicalId": "Database", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::RDS::DBInstance" }, + "propertyPath": "Properties", "category": "Best Practice", - "startLine": 80, - "startColumn": 3, - "endLine": 80, - "endColumn": 26, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", "phase": "LINT" }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "DefaultRemovedThenValue", + "logicalId": "Database", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::RDS::DBInstance" }, + "propertyPath": "Properties.Engine", "category": "Best Practice", - "startLine": 80, - "startColumn": 3, - "endLine": 80, - "endColumn": 26, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 7, + "startColumn": 7, + "endLine": 7, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'TableName' is create-only; updating it will cause resource replacement", + "message": "Property 'MasterUsername' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ExplicitProvisioned", + "logicalId": "Database", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.TableName", + "propertyPath": "Properties.MasterUsername", "category": "Best Practice", - "startLine": 11, + "startLine": 8, "startColumn": 7, - "endLine": 11, - "endColumn": 16, + "endLine": 8, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -80430,84 +79231,134 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'StorageEncrypted' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ExplicitProvisioned", + "logicalId": "Database", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.KeySchema", + "propertyPath": "Properties.StorageEncrypted", "category": "Best Practice", - "startLine": 13, + "startLine": 10, "startColumn": 7, - "endLine": 13, - "endColumn": 16, + "endLine": 10, + "endColumn": 23, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only" } }, + { + "ruleId": "I9003", + "severity": "INFO", + "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", + "source": "ENGINE", + "category": "Best Practice", + "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Database' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "Database", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "bad/redshift_internet_accessible.yaml": { + "filePath": "bad/redshift_internet_accessible.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 7, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 13, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'TableName' is create-only; updating it will cause resource replacement", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DefaultProvisioned", + "logicalId": "Subnet1", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.TableName", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 24, + "startLine": 6, "startColumn": 7, - "endLine": 24, - "endColumn": 16, + "endLine": 6, + "endColumn": 12, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'VPC'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DefaultProvisioned", + "logicalId": "Subnet1", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.KeySchema", + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 25, + "startLine": 7, "startColumn": 7, - "endLine": 25, + "endLine": 7, "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'TableName' is create-only; updating it will cause resource replacement", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "NullThroughput", + "logicalId": "VPC", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::VPC" }, - "propertyPath": "Properties.TableName", + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 36, + "startLine": 11, "startColumn": 7, - "endLine": 36, + "endLine": 11, "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", @@ -80518,169 +79369,144 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "NullThroughput", + "logicalId": "RouteTable1", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::RouteTable" }, - "propertyPath": "Properties.KeySchema", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 38, + "startLine": 21, "startColumn": 7, - "endLine": 38, - "endColumn": 16, + "endLine": 21, + "endColumn": 12, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'VPC'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ExplicitValueThenRemoved", + "logicalId": "SubnetRTAssoc", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::SubnetRouteTableAssociation" }, - "propertyPath": "Properties.KeySchema", + "propertyPath": "Properties.SubnetId", "category": "Best Practice", - "startLine": 53, + "startLine": 25, "startColumn": 7, - "endLine": 53, - "endColumn": 16, + "endLine": 25, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'Subnet1'", + "extra": { + "replacement_strategy": "delete_then_create" + } } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ExplicitRemovedThenValue", + "logicalId": "SubnetRTAssoc", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::SubnetRouteTableAssociation" }, - "propertyPath": "Properties.KeySchema", + "propertyPath": "Properties.RouteTableId", "category": "Best Practice", - "startLine": 64, + "startLine": 26, "startColumn": 7, - "endLine": 64, - "endColumn": 16, + "endLine": 26, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'RouteTable1'", + "extra": { + "replacement_strategy": "delete_then_create" + } } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DefaultValueThenRemoved", + "logicalId": "Route1", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::Route" }, - "propertyPath": "Properties.KeySchema", + "propertyPath": "Properties.RouteTableId", "category": "Best Practice", - "startLine": 74, + "startLine": 33, "startColumn": 7, - "endLine": 74, - "endColumn": 16, + "endLine": 33, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'RouteTable1'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'DestinationCidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DefaultRemovedThenValue", + "logicalId": "Route1", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::Route" }, - "propertyPath": "Properties.KeySchema", + "propertyPath": "Properties.DestinationCidrBlock", "category": "Best Practice", - "startLine": 84, + "startLine": 34, "startColumn": 7, - "endLine": 84, - "endColumn": 16, + "endLine": 34, + "endColumn": 27, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only" } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'ExplicitProvisioned' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "ExplicitProvisioned", - "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 10, - "startColumn": 5, - "endLine": 10, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'DefaultProvisioned' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "DefaultProvisioned", - "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 23, - "startColumn": 5, - "endLine": 23, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'NullThroughput' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", + "message": "Resource 'Subnet1' of type 'AWS::EC2::Subnet' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "NullThroughput", + "logicalId": "Subnet1", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::Subnet" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 35, + "startLine": 5, "startColumn": 5, - "endLine": 35, + "endLine": 5, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -80688,19 +79514,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'ExplicitValueThenRemoved' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", + "message": "Resource 'VPC' of type 'AWS::EC2::VPC' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ExplicitValueThenRemoved", + "logicalId": "VPC", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::VPC" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 50, + "startLine": 10, "startColumn": 5, - "endLine": 50, + "endLine": 10, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -80708,19 +79534,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'ExplicitRemovedThenValue' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", + "message": "Resource 'RedshiftSubnetGroup' of type 'AWS::Redshift::ClusterSubnetGroup' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ExplicitRemovedThenValue", + "logicalId": "RedshiftSubnetGroup", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::Redshift::ClusterSubnetGroup" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 61, + "startLine": 14, "startColumn": 5, - "endLine": 61, + "endLine": 14, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -80728,19 +79554,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'DefaultValueThenRemoved' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", + "message": "Resource 'RouteTable1' of type 'AWS::EC2::RouteTable' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "DefaultValueThenRemoved", + "logicalId": "RouteTable1", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::RouteTable" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 72, + "startLine": 20, "startColumn": 5, - "endLine": 72, + "endLine": 20, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -80748,35 +79574,35 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'DefaultRemovedThenValue' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", + "message": "Resource 'IGW' of type 'AWS::EC2::InternetGateway' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "DefaultRemovedThenValue", + "logicalId": "IGW", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::InternetGateway" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 82, + "startLine": 29, "startColumn": 5, - "endLine": 82, + "endLine": 29, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "bad/resources/dynamodb/undefined_attribute_definition.yaml": { - "filePath": "bad/resources/dynamodb/undefined_attribute_definition.yaml", + "bad/refs.yaml": { + "filePath": "bad/refs.yaml", "status": "OK", "metadata": { - "resourcesScanned": 1, + "resourcesScanned": 2, "counts": { - "fatal": 0, - "errors": 1, - "warnings": 0, - "informational": 4, + "fatal": 4, + "errors": 0, + "warnings": 2, + "informational": 17, "debug": 0 }, "suppressed": 0, @@ -80785,308 +79611,397 @@ }, "diagnostics": [ { - "ruleId": "E3039", - "severity": "ERROR", - "message": "AttributeDefinitions does not match KeySchema attributes. missing definitions: [Artist]", - "source": "CFN_LINT", + "ruleId": "F1018", + "severity": "FATAL", + "message": "Fn::Sub variable '${Package}' does not reference a valid resource, parameter, or pseudo-parameter", + "source": "SCHEMA", "entity": { - "logicalId": "dynamoDBTable", + "logicalId": "MyEC2Instance", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties", - "category": "Resource", - "startLine": 6, - "startColumn": 5, - "endLine": 6, + "propertyPath": "Properties.UserData", + "category": "Intrinsic Function", + "startLine": 21, + "startColumn": 7, + "endLine": 21, "endColumn": 15, - "ruleDescription": "AttributeDefinitions / KeySchemas mismatch", + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Sub variables must resolve", + "phase": "SCHEMA", + "context": { + "resolutionSource": "dynamic (Sub:yum install ${Package}\n)" + } + }, + { + "ruleId": "F1020", + "severity": "FATAL", + "message": "'pIops' is not one of ['AWS::AccountId', 'AWS::NoValue', 'AWS::NotificationARNs', 'AWS::Partition', 'AWS::Region', 'AWS::StackId', 'AWS::StackName', 'AWS::URLSuffix', 'AnotherInstance', 'MyEC2Instance']", + "source": "SCHEMA", + "entity": { + "logicalId": "MyEC2Instance", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Properties.BlockDeviceMappings.0.Ebs.Iops", + "suggestedFix": "Check that the Ref target exists as a resource, parameter, or pseudo-parameter", + "category": "Intrinsic Function", + "startLine": 15, + "startColumn": 13, + "endLine": 15, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Ref/GetAtt target must exist", + "phase": "SCHEMA" + }, + { + "ruleId": "F1020", + "severity": "FATAL", + "message": "'pIops' is not one of ['AWS::AccountId', 'AWS::NoValue', 'AWS::NotificationARNs', 'AWS::Partition', 'AWS::Region', 'AWS::StackId', 'AWS::StackName', 'AWS::URLSuffix', 'AnotherInstance', 'MyEC2Instance']", + "source": "SCHEMA", + "entity": { + "logicalId": "AnotherInstance", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Properties.BlockDeviceMappings.0.Ebs.Iops", + "suggestedFix": "Check that the Ref target exists as a resource, parameter, or pseudo-parameter", + "category": "Intrinsic Function", + "startLine": 34, + "startColumn": 13, + "endLine": 34, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Ref/GetAtt target must exist", + "phase": "SCHEMA" + }, + { + "ruleId": "F1020", + "severity": "FATAL", + "message": "'httpdPackage' is not one of ['AWS::AccountId', 'AWS::NoValue', 'AWS::NotificationARNs', 'AWS::Partition', 'AWS::Region', 'AWS::StackId', 'AWS::StackName', 'AWS::URLSuffix', 'AnotherInstance', 'MyEC2Instance']", + "source": "SCHEMA", + "entity": { + "logicalId": "AnotherInstance", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Properties.UserData", + "suggestedFix": "Check that the Ref target exists as a resource, parameter, or pseudo-parameter", + "category": "Intrinsic Function", + "startLine": 40, + "startColumn": 7, + "endLine": 40, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Ref/GetAtt target must exist", + "phase": "SCHEMA", + "context": { + "resolutionSource": "dynamic (Sub:yum install ${myPackage} ${Package})" + } + }, + { + "ruleId": "W9010", + "severity": "WARN", + "message": "Hardcoded AMI ID - use a parameter or mapping for portability", + "source": "ENGINE", + "entity": { + "logicalId": "MyEC2Instance", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Properties.ImageId", + "category": "Security", + "startLine": 7, + "startColumn": 7, + "endLine": 7, + "endColumn": 14, + "ruleDescription": "Hardcoded AMI ID", "phase": "LINT" }, { - "ruleId": "I3011", + "ruleId": "W9010", + "severity": "WARN", + "message": "Hardcoded AMI ID - use a parameter or mapping for portability", + "source": "ENGINE", + "entity": { + "logicalId": "AnotherInstance", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Properties.ImageId", + "category": "Security", + "startLine": 26, + "startColumn": 7, + "endLine": 26, + "endColumn": 14, + "ruleDescription": "Hardcoded AMI ID", + "phase": "LINT" + }, + { + "ruleId": "I3100", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "message": "Previous generation instance type 't1.micro' - consider upgrading", "source": "CFN_LINT", "entity": { - "logicalId": "dynamoDBTable", + "logicalId": "MyEC2Instance", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::Instance" }, + "propertyPath": "Properties.InstanceType", + "suggestedFix": "Upgrade to a current generation instance type", "category": "Best Practice", - "startLine": 4, - "startColumn": 3, - "endLine": 4, - "endColumn": 16, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "startLine": 8, + "startColumn": 7, + "endLine": 8, + "endColumn": 19, + "ruleDescription": "Checks for legacy instance type generations", "phase": "LINT" }, { - "ruleId": "I3011", + "ruleId": "I3100", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "message": "Previous generation instance type 't1.micro' - consider upgrading", "source": "CFN_LINT", "entity": { - "logicalId": "dynamoDBTable", + "logicalId": "AnotherInstance", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::Instance" }, + "propertyPath": "Properties.InstanceType", + "suggestedFix": "Upgrade to a current generation instance type", "category": "Best Practice", - "startLine": 4, - "startColumn": 3, - "endLine": 4, - "endColumn": 16, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "startLine": 27, + "startColumn": 7, + "endLine": 27, + "endColumn": 19, + "ruleDescription": "Checks for legacy instance type generations", "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "dynamoDBTable", + "logicalId": "MyEC2Instance", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.KeySchema", + "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 10, + "startLine": 7, "startColumn": 7, - "endLine": 10, - "endColumn": 16, + "endLine": 7, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only" } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'dynamoDBTable' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", + "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "dynamoDBTable", + "logicalId": "MyEC2Instance", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 6, - "startColumn": 5, - "endLine": 6, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "bad/resources/dynamodb/unused_attribute_definition_1.yaml": { - "filePath": "bad/resources/dynamodb/unused_attribute_definition_1.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 0, - "informational": 4, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "E3039", - "severity": "ERROR", - "message": "AttributeDefinitions does not match KeySchema attributes. unused definitions: [Sales]", - "source": "CFN_LINT", - "entity": { - "logicalId": "dynamoDBTable", - "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" - }, - "propertyPath": "Properties", - "category": "Resource", - "startLine": 6, - "startColumn": 5, - "endLine": 6, - "endColumn": 15, - "ruleDescription": "AttributeDefinitions / KeySchemas mismatch", - "phase": "LINT" + "startLine": 8, + "startColumn": 7, + "endLine": 8, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'KeyName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "dynamoDBTable", + "logicalId": "MyEC2Instance", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::Instance" }, + "propertyPath": "Properties.KeyName", "category": "Best Practice", - "startLine": 4, - "startColumn": 3, - "endLine": 4, - "endColumn": 16, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 9, + "startColumn": 7, + "endLine": 9, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'BlockDeviceMappings' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "dynamoDBTable", + "logicalId": "MyEC2Instance", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::Instance" }, + "propertyPath": "Properties.BlockDeviceMappings", "category": "Best Practice", - "startLine": 4, - "startColumn": 3, - "endLine": 4, - "endColumn": 16, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 10, + "startColumn": 7, + "endLine": 10, + "endColumn": 26, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'NetworkInterfaces' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "dynamoDBTable", + "logicalId": "MyEC2Instance", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.KeySchema", + "propertyPath": "Properties.NetworkInterfaces", "category": "Best Practice", - "startLine": 14, + "startLine": 18, "startColumn": 7, - "endLine": 14, - "endColumn": 16, + "endLine": 18, + "endColumn": 24, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only" } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'dynamoDBTable' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", + "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "dynamoDBTable", + "logicalId": "MyEC2Instance", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 6, - "startColumn": 5, - "endLine": 6, + "startLine": 21, + "startColumn": 7, + "endLine": 21, "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "bad/resources/dynamodb/unused_attribute_definition_2.yaml": { - "filePath": "bad/resources/dynamodb/unused_attribute_definition_2.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 0, - "informational": 4, - "debug": 0 + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only", + "resolutionSource": "dynamic (Sub:yum install ${Package}\n)" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "E3039", - "severity": "ERROR", - "message": "AttributeDefinitions does not match KeySchema attributes. unused definitions: [Sales]", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "dynamoDBTable", + "logicalId": "AnotherInstance", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties", - "category": "Resource", - "startLine": 6, - "startColumn": 5, - "endLine": 6, - "endColumn": 15, - "ruleDescription": "AttributeDefinitions / KeySchemas mismatch", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Best Practice", + "startLine": 26, + "startColumn": 7, + "endLine": 26, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "dynamoDBTable", + "logicalId": "AnotherInstance", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::Instance" }, + "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 4, - "startColumn": 3, - "endLine": 4, - "endColumn": 16, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 27, + "startColumn": 7, + "endLine": 27, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'KeyName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "dynamoDBTable", + "logicalId": "AnotherInstance", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::Instance" }, + "propertyPath": "Properties.KeyName", "category": "Best Practice", - "startLine": 4, - "startColumn": 3, - "endLine": 4, - "endColumn": 16, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 28, + "startColumn": 7, + "endLine": 28, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'BlockDeviceMappings' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "dynamoDBTable", + "logicalId": "AnotherInstance", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.KeySchema", + "propertyPath": "Properties.BlockDeviceMappings", "category": "Best Practice", - "startLine": 14, + "startLine": 29, "startColumn": 7, - "endLine": 14, - "endColumn": 16, + "endLine": 29, + "endColumn": 26, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -81094,100 +80009,77 @@ } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'dynamoDBTable' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", + "message": "Property 'NetworkInterfaces' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "dynamoDBTable", + "logicalId": "AnotherInstance", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.NetworkInterfaces", "category": "Best Practice", - "startLine": 6, - "startColumn": 5, - "endLine": 6, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "bad/resources/ecs/fargate_conditional_properties.yaml": { - "filePath": "bad/resources/ecs/fargate_conditional_properties.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 2, - "counts": { - "fatal": 0, - "errors": 2, - "warnings": 0, - "informational": 2, - "debug": 0 + "startLine": 37, + "startColumn": 7, + "endLine": 37, + "endColumn": 24, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "E3048", - "severity": "ERROR", - "message": "Fargate does not support PlacementConstraints", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "PlacementInFargateBranch", + "logicalId": "AnotherInstance", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.PlacementConstraints", - "suggestedFix": "Remove PlacementConstraints for Fargate tasks", - "category": "Resource", - "startLine": 15, - "startColumn": 5, - "endLine": 15, + "propertyPath": "Properties.UserData", + "category": "Best Practice", + "startLine": 40, + "startColumn": 7, + "endLine": 40, "endColumn": 15, - "ruleDescription": "Validate ECS Fargate tasks have required properties and values", - "phase": "LINT" + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only", + "resolutionSource": "dynamic (Sub:yum install ${myPackage} ${Package})" + } }, { - "ruleId": "E3048", - "severity": "ERROR", - "message": "Fargate does not support log driver 'syslog'. Supported drivers: ['awslogs', 'splunk', 'awsfirelens']", - "source": "CFN_LINT", - "entity": { - "logicalId": "InvalidDriverInFargateBranch", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.ContainerDefinitions.0.LogConfiguration.LogDriver", - "suggestedFix": "Use 'awslogs', 'splunk', or 'awsfirelens'", - "category": "Resource", - "startLine": 36, - "startColumn": 5, - "endLine": 36, - "endColumn": 15, - "ruleDescription": "Validate ECS Fargate tasks have required properties and values", + "ruleId": "I9003", + "severity": "INFO", + "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", + "source": "ENGINE", + "category": "Best Practice", + "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'PlacementInFargateBranch' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", + "message": "Resource 'MyEC2Instance' of type 'AWS::EC2::Instance' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "PlacementInFargateBranch", + "logicalId": "MyEC2Instance", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 15, + "startLine": 6, "startColumn": 5, - "endLine": 15, + "endLine": 6, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -81195,551 +80087,496 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'InvalidDriverInFargateBranch' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", + "message": "Resource 'AnotherInstance' of type 'AWS::EC2::Instance' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "InvalidDriverInFargateBranch", + "logicalId": "AnotherInstance", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 36, + "startLine": 25, "startColumn": 5, - "endLine": 36, + "endLine": 25, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "bad/resources/ecs/fargate_numeric_spellings_e3047.yaml": { - "filePath": "bad/resources/ecs/fargate_numeric_spellings_e3047.yaml", + "bad/resource_policy_no_statement.yaml": { + "filePath": "bad/resource_policy_no_statement.yaml", "status": "OK", "metadata": { - "resourcesScanned": 6, + "resourcesScanned": 1, "counts": { "fatal": 0, - "errors": 9, + "errors": 1, "warnings": 0, - "informational": 36, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "E3047", - "severity": "ERROR", - "message": "Cpu '2e0 vCPU' is not compatible with Memory '4 GB' for Fargate", - "source": "CFN_LINT", - "entity": { - "logicalId": "ScientificCpuNotation", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.Cpu", - "suggestedFix": "Use a valid Fargate CPU/memory combination (e.g., Cpu: 256 with Memory: 512, 1024, or 2048)", - "category": "Resource", - "startLine": 8, - "startColumn": 7, - "endLine": 8, - "endColumn": 10, - "ruleDescription": "Validate ECS Fargate tasks have the right combination of CPU and memory", - "phase": "LINT", - "context": { - "extra": { - "cpu": "2e0 vCPU", - "memory": "4 GB" - } - } - }, - { - "ruleId": "E3047", - "severity": "ERROR", - "message": "Cpu '2 vCPU' is not compatible with Memory '4e0 GB' for Fargate", - "source": "CFN_LINT", - "entity": { - "logicalId": "ScientificMemoryNotation", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.Cpu", - "suggestedFix": "Use a valid Fargate CPU/memory combination (e.g., Cpu: 256 with Memory: 512, 1024, or 2048)", - "category": "Resource", - "startLine": 20, - "startColumn": 7, - "endLine": 20, - "endColumn": 10, - "ruleDescription": "Validate ECS Fargate tasks have the right combination of CPU and memory", - "phase": "LINT", - "context": { - "extra": { - "cpu": "2 vCPU", - "memory": "4e0 GB" - } - } - }, - { - "ruleId": "E3047", - "severity": "ERROR", - "message": "Cpu ' 2 vCPU' is not compatible with Memory '4 GB' for Fargate", - "source": "CFN_LINT", - "entity": { - "logicalId": "LeadingCpuWhitespace", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.Cpu", - "suggestedFix": "Use a valid Fargate CPU/memory combination (e.g., Cpu: 256 with Memory: 512, 1024, or 2048)", - "category": "Resource", - "startLine": 32, - "startColumn": 7, - "endLine": 32, - "endColumn": 10, - "ruleDescription": "Validate ECS Fargate tasks have the right combination of CPU and memory", - "phase": "LINT", - "context": { - "extra": { - "cpu": " 2 vCPU", - "memory": "4 GB" - } - } - }, - { - "ruleId": "E3047", - "severity": "ERROR", - "message": "Cpu '2 vCPU ' is not compatible with Memory '4 GB' for Fargate", - "source": "CFN_LINT", - "entity": { - "logicalId": "TrailingCpuWhitespace", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.Cpu", - "suggestedFix": "Use a valid Fargate CPU/memory combination (e.g., Cpu: 256 with Memory: 512, 1024, or 2048)", - "category": "Resource", - "startLine": 44, - "startColumn": 7, - "endLine": 44, - "endColumn": 10, - "ruleDescription": "Validate ECS Fargate tasks have the right combination of CPU and memory", - "phase": "LINT", - "context": { - "extra": { - "cpu": "2 vCPU ", - "memory": "4 GB" - } - } - }, - { - "ruleId": "E3047", - "severity": "ERROR", - "message": "Cpu '2 vCPU' is not compatible with Memory ' 4 GB' for Fargate", - "source": "CFN_LINT", - "entity": { - "logicalId": "LeadingMemoryWhitespace", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.Cpu", - "suggestedFix": "Use a valid Fargate CPU/memory combination (e.g., Cpu: 256 with Memory: 512, 1024, or 2048)", - "category": "Resource", - "startLine": 56, - "startColumn": 7, - "endLine": 56, - "endColumn": 10, - "ruleDescription": "Validate ECS Fargate tasks have the right combination of CPU and memory", - "phase": "LINT", - "context": { - "extra": { - "cpu": "2 vCPU", - "memory": " 4 GB" - } - } - }, - { - "ruleId": "E3047", - "severity": "ERROR", - "message": "Cpu '2 vCPU' is not compatible with Memory '4 GB ' for Fargate", - "source": "CFN_LINT", - "entity": { - "logicalId": "TrailingMemoryWhitespace", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.Cpu", - "suggestedFix": "Use a valid Fargate CPU/memory combination (e.g., Cpu: 256 with Memory: 512, 1024, or 2048)", - "category": "Resource", - "startLine": 68, - "startColumn": 7, - "endLine": 68, - "endColumn": 10, - "ruleDescription": "Validate ECS Fargate tasks have the right combination of CPU and memory", - "phase": "LINT", - "context": { - "extra": { - "cpu": "2 vCPU", - "memory": "4 GB " - } - } + "informational": 3, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "E3048", + "ruleId": "E3512", "severity": "ERROR", - "message": "Fargate Cpu value '2e0 vCPU' is not valid. Valid sizes are ['256', '512', '1024', '2048', '4096', '8192', '16384', '32768'] CPU units or ['0.25', '0.5', '1', '2', '4', '8', '16', '32'] vCPU.", + "message": "Resource-based policy must have a Statement property", "source": "CFN_LINT", "entity": { - "logicalId": "ScientificCpuNotation", + "logicalId": "Policy", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::KMS::Key" }, - "propertyPath": "Properties.Cpu", - "suggestedFix": "Use a valid Fargate Cpu size in CPU units or vCPU", + "propertyPath": "Properties.KeyPolicy", + "suggestedFix": "Add a Statement array to the policy document", "category": "Resource", - "startLine": 8, + "startLine": 6, "startColumn": 7, - "endLine": 8, - "endColumn": 10, - "ruleDescription": "Validate ECS Fargate tasks have required properties and values", + "endLine": 6, + "endColumn": 16, + "ruleDescription": "Validate resource based IAM policies", "phase": "LINT" }, { - "ruleId": "E3048", - "severity": "ERROR", - "message": "Fargate Cpu value ' 2 vCPU' is not valid. Valid sizes are ['256', '512', '1024', '2048', '4096', '8192', '16384', '32768'] CPU units or ['0.25', '0.5', '1', '2', '4', '8', '16', '32'] vCPU.", + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "LeadingCpuWhitespace", + "logicalId": "Policy", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::KMS::Key" }, - "propertyPath": "Properties.Cpu", - "suggestedFix": "Use a valid Fargate Cpu size in CPU units or vCPU", - "category": "Resource", - "startLine": 32, - "startColumn": 7, - "endLine": 32, - "endColumn": 10, - "ruleDescription": "Validate ECS Fargate tasks have required properties and values", + "category": "Best Practice", + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 9, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "E3048", - "severity": "ERROR", - "message": "Fargate Cpu value '2 vCPU ' is not valid. Valid sizes are ['256', '512', '1024', '2048', '4096', '8192', '16384', '32768'] CPU units or ['0.25', '0.5', '1', '2', '4', '8', '16', '32'] vCPU.", + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "TrailingCpuWhitespace", + "logicalId": "Policy", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::KMS::Key" }, - "propertyPath": "Properties.Cpu", - "suggestedFix": "Use a valid Fargate Cpu size in CPU units or vCPU", - "category": "Resource", - "startLine": 44, - "startColumn": 7, - "endLine": 44, - "endColumn": 10, - "ruleDescription": "Validate ECS Fargate tasks have required properties and values", + "category": "Best Practice", + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 9, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", + "message": "Resource 'Policy' of type 'AWS::KMS::Key' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ScientificCpuNotation", + "logicalId": "Policy", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::KMS::Key" }, - "propertyPath": "Properties.RequiresCompatibilities", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "bad/resources/backup/test_backup_plan_lifecycle_rule.yml": { + "filePath": "bad/resources/backup/test_backup_plan_lifecycle_rule.yml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 0, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [] + }, + "bad/resources/cloudformation/stack_nested.yaml": { + "filePath": "bad/resources/cloudformation/stack_nested.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 0, + "counts": { + "fatal": 1, + "errors": 0, + "warnings": 2, + "informational": 0, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "F0001", + "severity": "FATAL", + "message": "Resources section must exist and be non-empty", + "source": "SCHEMA", + "category": "Structure", "startLine": 6, - "startColumn": 7, + "startColumn": 1, "endLine": 6, - "endColumn": 30, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "endColumn": 10, + "ruleDescription": "Resources section must exist and be non-empty", + "phase": "SCHEMA" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'One' is not referenced anywhere in the template", + "source": "CFN_LINT", "entity": { - "logicalId": "ScientificCpuNotation", + "logicalId": "One", + "entityType": "Parameter" + }, + "propertyPath": "Parameters/One", + "category": "Best Practice", + "startLine": 2, + "startColumn": 3, + "endLine": 2, + "endColumn": 6, + "ruleDescription": "Check if Parameters are Used", + "phase": "LINT" + }, + { + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'Two' is not referenced anywhere in the template", + "source": "CFN_LINT", + "entity": { + "logicalId": "Two", + "entityType": "Parameter" + }, + "propertyPath": "Parameters/Two", + "category": "Best Practice", + "startLine": 4, + "startColumn": 3, + "endLine": 4, + "endColumn": 6, + "ruleDescription": "Check if Parameters are Used", + "phase": "LINT" + } + ] + }, + "bad/resources/cloudformation/stacks.yaml": { + "filePath": "bad/resources/cloudformation/stacks.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 2, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 2, + "informational": 6, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "W3002", + "severity": "WARN", + "message": "This code may only work with 'package' cli command", + "source": "CFN_LINT", + "entity": { + "logicalId": "StackNormal", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::CloudFormation::Stack" }, - "propertyPath": "Properties.NetworkMode", + "propertyPath": "Properties.TemplateURL", "category": "Best Practice", - "startLine": 7, + "startLine": 9, "startColumn": 7, - "endLine": 7, + "endLine": 9, "endColumn": 18, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "ruleDescription": "Warn when properties are configured to only work with the package command", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W3002", + "severity": "WARN", + "message": "This code may only work with 'package' cli command", + "source": "CFN_LINT", "entity": { - "logicalId": "ScientificCpuNotation", + "logicalId": "Stack3", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::CloudFormation::Stack" }, - "propertyPath": "Properties.Cpu", + "propertyPath": "Properties.TemplateURL", "category": "Best Practice", - "startLine": 8, + "startLine": 17, "startColumn": 7, - "endLine": 8, - "endColumn": 10, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "endLine": 17, + "endColumn": 18, + "ruleDescription": "Warn when properties are configured to only work with the package command", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'Memory' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "ScientificCpuNotation", + "logicalId": "StackNormal", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::CloudFormation::Stack" }, - "propertyPath": "Properties.Memory", "category": "Best Practice", - "startLine": 9, - "startColumn": 7, - "endLine": 9, - "endColumn": 13, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 6, + "startColumn": 3, + "endLine": 6, + "endColumn": 14, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "ScientificCpuNotation", + "logicalId": "StackNormal", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::CloudFormation::Stack" }, - "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 10, - "startColumn": 7, - "endLine": 10, - "endColumn": 27, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 6, + "startColumn": 3, + "endLine": 6, + "endColumn": 14, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "ScientificMemoryNotation", + "logicalId": "Stack3", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::CloudFormation::Stack" }, - "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 18, - "startColumn": 7, - "endLine": 18, - "endColumn": 30, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 14, + "startColumn": 3, + "endLine": 14, + "endColumn": 9, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "ScientificMemoryNotation", + "logicalId": "Stack3", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::CloudFormation::Stack" }, - "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 19, - "startColumn": 7, - "endLine": 19, - "endColumn": 18, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 14, + "startColumn": 3, + "endLine": 14, + "endColumn": 9, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", + "message": "Resource 'StackNormal' of type 'AWS::CloudFormation::Stack' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ScientificMemoryNotation", + "logicalId": "StackNormal", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::CloudFormation::Stack" }, - "propertyPath": "Properties.Cpu", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 20, - "startColumn": 7, - "endLine": 20, - "endColumn": 10, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 8, + "startColumn": 5, + "endLine": 8, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Memory' is create-only; updating it will cause resource replacement", + "message": "Resource 'Stack3' of type 'AWS::CloudFormation::Stack' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ScientificMemoryNotation", + "logicalId": "Stack3", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::CloudFormation::Stack" }, - "propertyPath": "Properties.Memory", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 21, - "startColumn": 7, - "endLine": 21, - "endColumn": 13, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 16, + "startColumn": 5, + "endLine": 16, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "bad/resources/codepipeline/stages_second_stage.yaml": { + "filePath": "bad/resources/codepipeline/stages_second_stage.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 2, + "errors": 1, + "warnings": 1, + "informational": 2, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "F1020", + "severity": "FATAL", + "message": "'Github' is not one of ['AWS::AccountId', 'AWS::NoValue', 'AWS::NotificationARNs', 'AWS::Partition', 'AWS::Region', 'AWS::StackId', 'AWS::StackName', 'AWS::URLSuffix', 'TestPipeline']", + "source": "SCHEMA", "entity": { - "logicalId": "ScientificMemoryNotation", + "logicalId": "TestPipeline", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::CodePipeline::Pipeline" }, - "propertyPath": "Properties.ContainerDefinitions", - "category": "Best Practice", - "startLine": 22, + "propertyPath": "Properties.Stages.1.Actions.0.Name", + "suggestedFix": "Check that the Ref target exists as a resource, parameter, or pseudo-parameter", + "category": "Intrinsic Function", + "startLine": 32, + "startColumn": 15, + "endLine": 32, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-codepipeline", + "ruleDescription": "Ref/GetAtt target must exist", + "phase": "SCHEMA" + }, + { + "ruleId": "F3031", + "severity": "FATAL", + "message": "'arn:aws:iam:::role/AWSCodePipelineRole' does not match pattern 'arn:aws(-[\\w]+)*:iam::[0-9]{12}:role/.*'", + "source": "SCHEMA", + "entity": { + "logicalId": "TestPipeline", + "entityType": "Resource", + "resourceType": "AWS::CodePipeline::Pipeline" + }, + "propertyPath": "Properties.RoleArn", + "category": "Schema", + "startLine": 12, "startColumn": 7, - "endLine": 22, - "endColumn": 27, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", + "endLine": 12, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-codepipeline", + "ruleDescription": "Value does not match pattern", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "actualValue": "arn:aws:iam:::role/AWSCodePipelineRole", + "expectedConstraint": "arn:aws(-[\\w]+)*:iam::[0-9]{12}:role/.*" } }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E1156", + "severity": "ERROR", + "message": "'arn:aws:iam:::role/AWSCodePipelineRole' does not match format 'AWS::IAM::Role.Arn'", + "source": "CFN_LINT", "entity": { - "logicalId": "LeadingCpuWhitespace", + "logicalId": "TestPipeline", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::CodePipeline::Pipeline" }, - "propertyPath": "Properties.RequiresCompatibilities", - "category": "Best Practice", - "startLine": 30, + "propertyPath": "Properties.RoleArn", + "category": "Intrinsic Function", + "startLine": 12, "startColumn": 7, - "endLine": 30, - "endColumn": 30, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", + "endLine": 12, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-codepipeline", + "ruleDescription": "Validate IAM role ARN format", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "actualValue": "arn:aws:iam:::role/AWSCodePipelineRole" } }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", + "ruleId": "W9002", + "severity": "WARN", + "message": "Property 'RoleArn' has a hardcoded ARN - use Ref, GetAtt, or a parameter instead", "source": "ENGINE", "entity": { - "logicalId": "LeadingCpuWhitespace", + "logicalId": "TestPipeline", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::CodePipeline::Pipeline" }, - "propertyPath": "Properties.NetworkMode", + "propertyPath": "Properties.RoleArn", "category": "Best Practice", - "startLine": 31, + "startLine": 12, "startColumn": 7, - "endLine": 31, - "endColumn": 18, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "endLine": 12, + "endColumn": 14, + "ruleDescription": "Hardcoded ARN property", + "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", + "message": "Property 'Name' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "LeadingCpuWhitespace", + "logicalId": "TestPipeline", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::CodePipeline::Pipeline" }, - "propertyPath": "Properties.Cpu", + "propertyPath": "Properties.Name", "category": "Best Practice", - "startLine": 32, + "startLine": 8, "startColumn": 7, - "endLine": 32, - "endColumn": 10, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "endLine": 8, + "endColumn": 11, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-codepipeline", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -81747,68 +80584,80 @@ } }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Memory' is create-only; updating it will cause resource replacement", + "message": "Resource 'TestPipeline' of type 'AWS::CodePipeline::Pipeline' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "LeadingCpuWhitespace", + "logicalId": "TestPipeline", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::CodePipeline::Pipeline" }, - "propertyPath": "Properties.Memory", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 33, - "startColumn": 7, - "endLine": 33, - "endColumn": 13, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 7, + "startColumn": 5, + "endLine": 7, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "bad/resources/creation_policy_unsupported_e3055.yaml": { + "filePath": "bad/resources/creation_policy_unsupported_e3055.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 1, + "warnings": 0, + "informational": 2, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E3055", + "severity": "ERROR", + "message": "CreationPolicy is not supported on resource type 'AWS::S3::Bucket'", + "source": "CFN_LINT", "entity": { - "logicalId": "LeadingCpuWhitespace", + "logicalId": "MyBucket", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.ContainerDefinitions", - "category": "Best Practice", - "startLine": 34, - "startColumn": 7, - "endLine": 34, - "endColumn": 27, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "propertyPath": "CreationPolicy", + "suggestedFix": "Remove CreationPolicy or change resource type to one of: AWS::AppStream::Fleet, AWS::AutoScaling::AutoScalingGroup, AWS::CloudFormation::WaitCondition, AWS::EC2::Instance", + "category": "Resource", + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 19, + "ruleDescription": "Check CreationPolicy values for Resources", + "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "TrailingCpuWhitespace", + "logicalId": "MyBucket", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.RequiresCompatibilities", + "propertyPath": "Properties.BucketName", "category": "Best Practice", - "startLine": 42, + "startLine": 10, "startColumn": 7, - "endLine": 42, - "endColumn": 30, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "endLine": 10, + "endColumn": 17, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -81816,343 +80665,370 @@ } }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", + "message": "Resource 'MyBucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "TrailingCpuWhitespace", + "logicalId": "MyBucket", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.NetworkMode", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 43, - "startColumn": 7, - "endLine": 43, - "endColumn": 18, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 9, + "startColumn": 5, + "endLine": 9, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "bad/resources/dynamodb/attributes_transform_e3639.yaml": { + "filePath": "bad/resources/dynamodb/attributes_transform_e3639.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 3, + "counts": { + "fatal": 4, + "errors": 3, + "warnings": 0, + "informational": 12, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "F1101", + "severity": "FATAL", + "message": "Fn::Transform: Fn::Transform value must be an object", + "source": "SCHEMA", "entity": { - "logicalId": "TrailingCpuWhitespace", + "logicalId": "DDBTableTransformAttributeDefinitions", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.Cpu", - "category": "Best Practice", - "startLine": 44, - "startColumn": 7, - "endLine": 44, - "endColumn": 10, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "propertyPath": "Properties.AttributeDefinitions.Fn::Transform", + "category": "Structure", + "startLine": 11, + "startColumn": 9, + "endLine": 11, + "endColumn": 22, + "ruleDescription": "Invalid YAML/JSON syntax", + "phase": "PARSE" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Memory' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "F1101", + "severity": "FATAL", + "message": "Fn::Transform: Fn::Transform value must be an object", + "source": "SCHEMA", "entity": { - "logicalId": "TrailingCpuWhitespace", + "logicalId": "DDBTableTransformKeySchema", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.Memory", - "category": "Best Practice", - "startLine": 45, - "startColumn": 7, - "endLine": 45, - "endColumn": 13, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "propertyPath": "Properties.KeySchema.Fn::Transform", + "category": "Structure", + "startLine": 25, + "startColumn": 9, + "endLine": 25, + "endColumn": 22, + "ruleDescription": "Invalid YAML/JSON syntax", + "phase": "PARSE" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "F1101", + "severity": "FATAL", + "message": "Fn::Transform: Fn::Transform value must be an object", + "source": "SCHEMA", "entity": { - "logicalId": "TrailingCpuWhitespace", + "logicalId": "DDBTableTransformBoth", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.ContainerDefinitions", - "category": "Best Practice", - "startLine": 46, - "startColumn": 7, - "endLine": 46, - "endColumn": 27, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "propertyPath": "Properties.AttributeDefinitions.Fn::Transform", + "category": "Structure", + "startLine": 33, + "startColumn": 9, + "endLine": 33, + "endColumn": 22, + "ruleDescription": "Invalid YAML/JSON syntax", + "phase": "PARSE" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "F1101", + "severity": "FATAL", + "message": "Fn::Transform: Fn::Transform value must be an object", + "source": "SCHEMA", "entity": { - "logicalId": "LeadingMemoryWhitespace", + "logicalId": "DDBTableTransformBoth", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.RequiresCompatibilities", - "category": "Best Practice", - "startLine": 54, - "startColumn": 7, - "endLine": 54, - "endColumn": 30, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "propertyPath": "Properties.KeySchema.Fn::Transform", + "category": "Structure", + "startLine": 38, + "startColumn": 9, + "endLine": 38, + "endColumn": 22, + "ruleDescription": "Invalid YAML/JSON syntax", + "phase": "PARSE" }, { - "ruleId": "I9001", + "ruleId": "E3639", + "severity": "ERROR", + "message": "ProvisionedThroughput is required when BillingMode defaults to 'PROVISIONED'", + "source": "CFN_LINT", + "entity": { + "logicalId": "DDBTableTransformAttributeDefinitions", + "entityType": "Resource", + "resourceType": "AWS::DynamoDB::Table" + }, + "propertyPath": "Properties.ProvisionedThroughput", + "suggestedFix": "Add ProvisionedThroughput or set BillingMode to 'PAY_PER_REQUEST'", + "category": "Resource", + "startLine": 9, + "startColumn": 5, + "endLine": 9, + "endColumn": 15, + "ruleDescription": "Validate DynamoDB table ProvisionedThroughput is set when BillingMode is PROVISIONED", + "phase": "LINT" + }, + { + "ruleId": "E3639", + "severity": "ERROR", + "message": "ProvisionedThroughput is required when BillingMode defaults to 'PROVISIONED'", + "source": "CFN_LINT", + "entity": { + "logicalId": "DDBTableTransformKeySchema", + "entityType": "Resource", + "resourceType": "AWS::DynamoDB::Table" + }, + "propertyPath": "Properties.ProvisionedThroughput", + "suggestedFix": "Add ProvisionedThroughput or set BillingMode to 'PAY_PER_REQUEST'", + "category": "Resource", + "startLine": 20, + "startColumn": 5, + "endLine": 20, + "endColumn": 15, + "ruleDescription": "Validate DynamoDB table ProvisionedThroughput is set when BillingMode is PROVISIONED", + "phase": "LINT" + }, + { + "ruleId": "E3639", + "severity": "ERROR", + "message": "ProvisionedThroughput is required when BillingMode defaults to 'PROVISIONED'", + "source": "CFN_LINT", + "entity": { + "logicalId": "DDBTableTransformBoth", + "entityType": "Resource", + "resourceType": "AWS::DynamoDB::Table" + }, + "propertyPath": "Properties.ProvisionedThroughput", + "suggestedFix": "Add ProvisionedThroughput or set BillingMode to 'PAY_PER_REQUEST'", + "category": "Resource", + "startLine": 31, + "startColumn": 5, + "endLine": 31, + "endColumn": 15, + "ruleDescription": "Validate DynamoDB table ProvisionedThroughput is set when BillingMode is PROVISIONED", + "phase": "LINT" + }, + { + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "LeadingMemoryWhitespace", + "logicalId": "DDBTableTransformAttributeDefinitions", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 55, - "startColumn": 7, - "endLine": 55, - "endColumn": 18, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 7, + "startColumn": 3, + "endLine": 7, + "endColumn": 40, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "LeadingMemoryWhitespace", + "logicalId": "DDBTableTransformAttributeDefinitions", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.Cpu", "category": "Best Practice", - "startLine": 56, - "startColumn": 7, - "endLine": 56, - "endColumn": 10, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 7, + "startColumn": 3, + "endLine": 7, + "endColumn": 40, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'Memory' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "LeadingMemoryWhitespace", + "logicalId": "DDBTableTransformKeySchema", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.Memory", "category": "Best Practice", - "startLine": 57, - "startColumn": 7, - "endLine": 57, - "endColumn": 13, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 18, + "startColumn": 3, + "endLine": 18, + "endColumn": 29, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "LeadingMemoryWhitespace", + "logicalId": "DDBTableTransformKeySchema", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 58, - "startColumn": 7, - "endLine": 58, - "endColumn": 27, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 18, + "startColumn": 3, + "endLine": 18, + "endColumn": 29, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "TrailingMemoryWhitespace", + "logicalId": "DDBTableTransformBoth", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 66, - "startColumn": 7, - "endLine": 66, - "endColumn": 30, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 29, + "startColumn": 3, + "endLine": 29, + "endColumn": 24, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "TrailingMemoryWhitespace", + "logicalId": "DDBTableTransformBoth", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 67, - "startColumn": 7, - "endLine": 67, - "endColumn": 18, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 29, + "startColumn": 3, + "endLine": 29, + "endColumn": 24, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", + "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "TrailingMemoryWhitespace", + "logicalId": "DDBTableTransformAttributeDefinitions", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.Cpu", + "propertyPath": "Properties.KeySchema", "category": "Best Practice", - "startLine": 68, + "startLine": 15, "startColumn": 7, - "endLine": 68, - "endColumn": 10, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "endLine": 15, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Memory' is create-only; updating it will cause resource replacement", + "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "TrailingMemoryWhitespace", + "logicalId": "DDBTableTransformKeySchema", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.Memory", + "propertyPath": "Properties.KeySchema", "category": "Best Practice", - "startLine": 69, + "startLine": 24, "startColumn": 7, - "endLine": 69, - "endColumn": 13, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "endLine": 24, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", + "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "TrailingMemoryWhitespace", + "logicalId": "DDBTableTransformBoth", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.ContainerDefinitions", + "propertyPath": "Properties.KeySchema", "category": "Best Practice", - "startLine": 70, + "startLine": 37, "startColumn": 7, - "endLine": 70, - "endColumn": 27, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "endLine": 37, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'ScientificCpuNotation' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", + "message": "Resource 'DDBTableTransformAttributeDefinitions' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ScientificCpuNotation", + "logicalId": "DDBTableTransformAttributeDefinitions", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 5, + "startLine": 9, "startColumn": 5, - "endLine": 5, + "endLine": 9, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -82160,19 +81036,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'ScientificMemoryNotation' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", + "message": "Resource 'DDBTableTransformKeySchema' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ScientificMemoryNotation", + "logicalId": "DDBTableTransformKeySchema", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 17, + "startLine": 20, "startColumn": 5, - "endLine": 17, + "endLine": 20, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -82180,39 +81056,268 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'LeadingCpuWhitespace' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", + "message": "Resource 'DDBTableTransformBoth' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "LeadingCpuWhitespace", + "logicalId": "DDBTableTransformBoth", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 29, + "startLine": 31, "startColumn": 5, - "endLine": 29, + "endLine": 31, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "bad/resources/dynamodb/conditional_scenarios.yaml": { + "filePath": "bad/resources/dynamodb/conditional_scenarios.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 3, + "counts": { + "fatal": 0, + "errors": 3, + "warnings": 0, + "informational": 11, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "E3039", + "severity": "ERROR", + "message": "AttributeDefinitions does not match KeySchema attributes. unused definitions: [gsi_key]", + "source": "CFN_LINT", + "entity": { + "logicalId": "ConditionalGSI", + "entityType": "Resource", + "resourceType": "AWS::DynamoDB::Table" + }, + "propertyPath": "Properties", + "category": "Resource", + "startLine": 22, + "startColumn": 5, + "endLine": 22, + "endColumn": 15, + "ruleDescription": "AttributeDefinitions / KeySchemas mismatch", + "phase": "LINT" + }, + { + "ruleId": "E3039", + "severity": "ERROR", + "message": "AttributeDefinitions does not match KeySchema attributes. unused definitions: [lsi_key]", + "source": "CFN_LINT", + "entity": { + "logicalId": "ConditionalLSI", + "entityType": "Resource", + "resourceType": "AWS::DynamoDB::Table" + }, + "propertyPath": "Properties", + "category": "Resource", + "startLine": 37, + "startColumn": 5, + "endLine": 37, + "endColumn": 15, + "ruleDescription": "AttributeDefinitions / KeySchemas mismatch", + "phase": "LINT" + }, + { + "ruleId": "E3639", + "severity": "ERROR", + "message": "ProvisionedThroughput is required when BillingMode defaults to 'PROVISIONED'", + "source": "CFN_LINT", + "entity": { + "logicalId": "MissingDefaultThroughput", + "entityType": "Resource", + "resourceType": "AWS::DynamoDB::Table" + }, + "propertyPath": "Properties.ProvisionedThroughput", + "suggestedFix": "Add ProvisionedThroughput or set BillingMode to 'PAY_PER_REQUEST'", + "category": "Resource", + "startLine": 12, + "startColumn": 5, + "endLine": 12, + "endColumn": 15, + "ruleDescription": "Validate DynamoDB table ProvisionedThroughput is set when BillingMode is PROVISIONED", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "MissingDefaultThroughput", + "entityType": "Resource", + "resourceType": "AWS::DynamoDB::Table" + }, + "category": "Best Practice", + "startLine": 10, + "startColumn": 3, + "endLine": 10, + "endColumn": 27, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "MissingDefaultThroughput", + "entityType": "Resource", + "resourceType": "AWS::DynamoDB::Table" + }, + "category": "Best Practice", + "startLine": 10, + "startColumn": 3, + "endLine": 10, + "endColumn": 27, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "ConditionalGSI", + "entityType": "Resource", + "resourceType": "AWS::DynamoDB::Table" + }, + "category": "Best Practice", + "startLine": 20, + "startColumn": 3, + "endLine": 20, + "endColumn": 17, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "ConditionalGSI", + "entityType": "Resource", + "resourceType": "AWS::DynamoDB::Table" + }, + "category": "Best Practice", + "startLine": 20, + "startColumn": 3, + "endLine": 20, + "endColumn": 17, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "ConditionalLSI", + "entityType": "Resource", + "resourceType": "AWS::DynamoDB::Table" + }, + "category": "Best Practice", + "startLine": 35, + "startColumn": 3, + "endLine": 35, + "endColumn": 17, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "ConditionalLSI", + "entityType": "Resource", + "resourceType": "AWS::DynamoDB::Table" + }, + "category": "Best Practice", + "startLine": 35, + "startColumn": 3, + "endLine": 35, + "endColumn": 17, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConditionalGSI", + "entityType": "Resource", + "resourceType": "AWS::DynamoDB::Table" + }, + "propertyPath": "Properties.KeySchema", + "category": "Best Practice", + "startLine": 27, + "startColumn": 7, + "endLine": 27, + "endColumn": 16, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConditionalLSI", + "entityType": "Resource", + "resourceType": "AWS::DynamoDB::Table" + }, + "propertyPath": "Properties.KeySchema", + "category": "Best Practice", + "startLine": 43, + "startColumn": 7, + "endLine": 43, + "endColumn": 16, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'TrailingCpuWhitespace' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", + "message": "Resource 'MissingDefaultThroughput' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "TrailingCpuWhitespace", + "logicalId": "MissingDefaultThroughput", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 41, + "startLine": 12, "startColumn": 5, - "endLine": 41, + "endLine": 12, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -82220,19 +81325,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'LeadingMemoryWhitespace' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", + "message": "Resource 'ConditionalGSI' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "LeadingMemoryWhitespace", + "logicalId": "ConditionalGSI", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 53, + "startLine": 22, "startColumn": 5, - "endLine": 53, + "endLine": 22, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -82240,35 +81345,35 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'TrailingMemoryWhitespace' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", + "message": "Resource 'ConditionalLSI' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "TrailingMemoryWhitespace", + "logicalId": "ConditionalLSI", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 65, + "startLine": 37, "startColumn": 5, - "endLine": 65, + "endLine": 37, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "bad/resources/ecs/fargate_properties_e3048.yaml": { - "filePath": "bad/resources/ecs/fargate_properties_e3048.yaml", + "bad/resources/dynamodb/provisioned_throughput_e3639.yaml": { + "filePath": "bad/resources/dynamodb/provisioned_throughput_e3639.yaml", "status": "OK", "metadata": { - "resourcesScanned": 14, + "resourcesScanned": 7, "counts": { - "fatal": 0, - "errors": 17, + "fatal": 1, + "errors": 7, "warnings": 0, - "informational": 94, + "informational": 31, "debug": 0 }, "suppressed": 0, @@ -82277,581 +81382,433 @@ }, "diagnostics": [ { - "ruleId": "E3047", - "severity": "ERROR", - "message": "Cpu '128' is not compatible with Memory '512' for Fargate", - "source": "CFN_LINT", - "entity": { - "logicalId": "FargateInvalidCpu", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.Cpu", - "suggestedFix": "Use a valid Fargate CPU/memory combination (e.g., Cpu: 256 with Memory: 512, 1024, or 2048)", - "category": "Resource", - "startLine": 42, - "startColumn": 7, - "endLine": 42, - "endColumn": 10, - "ruleDescription": "Validate ECS Fargate tasks have the right combination of CPU and memory", - "phase": "LINT", - "context": { - "extra": { - "cpu": "128", - "memory": "512" - } - } - }, - { - "ruleId": "E3047", - "severity": "ERROR", - "message": "Cpu '3 vCPU' is not compatible with Memory '512' for Fargate", - "source": "CFN_LINT", - "entity": { - "logicalId": "FargateConditionalInvalidCpu", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.Cpu", - "suggestedFix": "Use a valid Fargate CPU/memory combination (e.g., Cpu: 256 with Memory: 512, 1024, or 2048)", - "category": "Resource", - "startLine": 165, - "startColumn": 7, - "endLine": 165, - "endColumn": 10, - "ruleDescription": "Validate ECS Fargate tasks have the right combination of CPU and memory", - "phase": "LINT", - "context": { - "extra": { - "cpu": "256", - "memory": "512" - } - } - }, - { - "ruleId": "E3048", - "severity": "ERROR", - "message": "Fargate requires Cpu to be specified", - "source": "CFN_LINT", - "entity": { - "logicalId": "FargateMissingAll", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties", - "suggestedFix": "Set Cpu to a valid Fargate value (256, 512, 1024, 2048, 4096, 8192, 16384, or 32768)", - "category": "Resource", - "startLine": 10, - "startColumn": 5, - "endLine": 10, - "endColumn": 15, - "ruleDescription": "Validate ECS Fargate tasks have required properties and values", - "phase": "LINT" - }, - { - "ruleId": "E3048", - "severity": "ERROR", - "message": "Fargate requires Memory to be specified", - "source": "CFN_LINT", + "ruleId": "F3003", + "severity": "FATAL", + "message": "'ProvisionedThroughput' is a required property (from extension)", + "source": "SCHEMA", "entity": { - "logicalId": "FargateMissingAll", + "logicalId": "ExplicitProvisioned", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, "propertyPath": "Properties", - "suggestedFix": "Set Memory to a valid Fargate value", - "category": "Resource", + "suggestedFix": "Add 'ProvisionedThroughput'", + "category": "Schema", "startLine": 10, "startColumn": 5, "endLine": 10, "endColumn": 15, - "ruleDescription": "Validate ECS Fargate tasks have required properties and values", - "phase": "LINT" + "ruleDescription": "Required property missing", + "phase": "SCHEMA" }, { - "ruleId": "E3048", + "ruleId": "E3639", "severity": "ERROR", - "message": "Fargate requires NetworkMode to be specified as 'awsvpc'", + "message": "ProvisionedThroughput is required when BillingMode is 'PROVISIONED'", "source": "CFN_LINT", "entity": { - "logicalId": "FargateMissingAll", + "logicalId": "ExplicitProvisioned", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties", - "suggestedFix": "Set NetworkMode to 'awsvpc'", + "propertyPath": "Properties.ProvisionedThroughput", + "suggestedFix": "Add ProvisionedThroughput or set BillingMode to 'PAY_PER_REQUEST'", "category": "Resource", "startLine": 10, "startColumn": 5, "endLine": 10, "endColumn": 15, - "ruleDescription": "Validate ECS Fargate tasks have required properties and values", - "phase": "LINT" - }, - { - "ruleId": "E3048", - "severity": "ERROR", - "message": "Fargate requires NetworkMode 'awsvpc', got 'bridge'", - "source": "CFN_LINT", - "entity": { - "logicalId": "FargateWrongNetworkMode", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.NetworkMode", - "suggestedFix": "Set NetworkMode to 'awsvpc'", - "category": "Resource", - "startLine": 26, - "startColumn": 7, - "endLine": 26, - "endColumn": 18, - "ruleDescription": "Validate ECS Fargate tasks have required properties and values", + "ruleDescription": "Validate DynamoDB table ProvisionedThroughput is set when BillingMode is PROVISIONED", "phase": "LINT" }, { - "ruleId": "E3048", + "ruleId": "E3639", "severity": "ERROR", - "message": "Fargate Cpu value '128' is not valid. Valid sizes are ['256', '512', '1024', '2048', '4096', '8192', '16384', '32768'] CPU units or ['0.25', '0.5', '1', '2', '4', '8', '16', '32'] vCPU.", + "message": "ProvisionedThroughput is required when BillingMode defaults to 'PROVISIONED'", "source": "CFN_LINT", "entity": { - "logicalId": "FargateInvalidCpu", + "logicalId": "DefaultProvisioned", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.Cpu", - "suggestedFix": "Use a valid Fargate Cpu size in CPU units or vCPU", + "propertyPath": "Properties.ProvisionedThroughput", + "suggestedFix": "Add ProvisionedThroughput or set BillingMode to 'PAY_PER_REQUEST'", "category": "Resource", - "startLine": 42, - "startColumn": 7, - "endLine": 42, - "endColumn": 10, - "ruleDescription": "Validate ECS Fargate tasks have required properties and values", + "startLine": 23, + "startColumn": 5, + "endLine": 23, + "endColumn": 15, + "ruleDescription": "Validate DynamoDB table ProvisionedThroughput is set when BillingMode is PROVISIONED", "phase": "LINT" }, { - "ruleId": "E3048", + "ruleId": "E3639", "severity": "ERROR", - "message": "Fargate does not support PlacementConstraints", + "message": "ProvisionedThroughput is required when BillingMode is 'PROVISIONED'", "source": "CFN_LINT", "entity": { - "logicalId": "FargatePlacementConstraints", + "logicalId": "NullThroughput", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.PlacementConstraints", - "suggestedFix": "Remove PlacementConstraints for Fargate tasks", + "propertyPath": "Properties.ProvisionedThroughput", + "suggestedFix": "Add ProvisionedThroughput or set BillingMode to 'PAY_PER_REQUEST'", "category": "Resource", - "startLine": 59, + "startLine": 44, "startColumn": 7, - "endLine": 59, - "endColumn": 27, - "ruleDescription": "Validate ECS Fargate tasks have required properties and values", + "endLine": 44, + "endColumn": 28, + "ruleDescription": "Validate DynamoDB table ProvisionedThroughput is set when BillingMode is PROVISIONED", "phase": "LINT" }, { - "ruleId": "E3048", + "ruleId": "E3639", "severity": "ERROR", - "message": "Fargate does not support log driver 'syslog'. Supported drivers: ['awslogs', 'splunk', 'awsfirelens']", + "message": "ProvisionedThroughput is required when BillingMode is 'PROVISIONED'", "source": "CFN_LINT", "entity": { - "logicalId": "FargateUnsupportedLogDriver", + "logicalId": "ExplicitValueThenRemoved", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.ContainerDefinitions.0.LogConfiguration.LogDriver", - "suggestedFix": "Use 'awslogs', 'splunk', or 'awsfirelens'", + "propertyPath": "Properties.ProvisionedThroughput", + "suggestedFix": "Add ProvisionedThroughput or set BillingMode to 'PAY_PER_REQUEST'", "category": "Resource", - "startLine": 82, - "startColumn": 13, - "endLine": 82, - "endColumn": 22, - "ruleDescription": "Validate ECS Fargate tasks have required properties and values", + "startLine": 54, + "startColumn": 7, + "endLine": 54, + "endColumn": 28, + "ruleDescription": "Validate DynamoDB table ProvisionedThroughput is set when BillingMode is PROVISIONED", "phase": "LINT" }, { - "ruleId": "E3048", + "ruleId": "E3639", "severity": "ERROR", - "message": "Fargate requires Cpu to be specified", + "message": "ProvisionedThroughput is required when BillingMode is 'PROVISIONED'", "source": "CFN_LINT", "entity": { - "logicalId": "FargateNullCpu", + "logicalId": "ExplicitRemovedThenValue", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties", - "suggestedFix": "Set Cpu to a valid Fargate value (256, 512, 1024, 2048, 4096, 8192, 16384, or 32768)", + "propertyPath": "Properties.ProvisionedThroughput", + "suggestedFix": "Add ProvisionedThroughput or set BillingMode to 'PAY_PER_REQUEST'", "category": "Resource", - "startLine": 87, - "startColumn": 5, - "endLine": 87, - "endColumn": 15, - "ruleDescription": "Validate ECS Fargate tasks have required properties and values", + "startLine": 65, + "startColumn": 7, + "endLine": 65, + "endColumn": 28, + "ruleDescription": "Validate DynamoDB table ProvisionedThroughput is set when BillingMode is PROVISIONED", "phase": "LINT" }, { - "ruleId": "E3048", + "ruleId": "E3639", "severity": "ERROR", - "message": "Fargate requires NetworkMode to be specified as 'awsvpc'", + "message": "ProvisionedThroughput is required when BillingMode defaults to 'PROVISIONED'", "source": "CFN_LINT", "entity": { - "logicalId": "FargateConditionalNetworkMode", + "logicalId": "DefaultValueThenRemoved", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties", - "suggestedFix": "Set NetworkMode to 'awsvpc'", + "propertyPath": "Properties.ProvisionedThroughput", + "suggestedFix": "Add ProvisionedThroughput or set BillingMode to 'PAY_PER_REQUEST'", "category": "Resource", - "startLine": 119, - "startColumn": 5, - "endLine": 119, - "endColumn": 15, - "ruleDescription": "Validate ECS Fargate tasks have required properties and values", + "startLine": 75, + "startColumn": 7, + "endLine": 75, + "endColumn": 28, + "ruleDescription": "Validate DynamoDB table ProvisionedThroughput is set when BillingMode is PROVISIONED", "phase": "LINT" }, { - "ruleId": "E3048", + "ruleId": "E3639", "severity": "ERROR", - "message": "Fargate requires Cpu to be specified", + "message": "ProvisionedThroughput is required when BillingMode defaults to 'PROVISIONED'", "source": "CFN_LINT", "entity": { - "logicalId": "FargateConditionalCpu", + "logicalId": "DefaultRemovedThenValue", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties", - "suggestedFix": "Set Cpu to a valid Fargate value (256, 512, 1024, 2048, 4096, 8192, 16384, or 32768)", + "propertyPath": "Properties.ProvisionedThroughput", + "suggestedFix": "Add ProvisionedThroughput or set BillingMode to 'PAY_PER_REQUEST'", "category": "Resource", - "startLine": 133, - "startColumn": 5, - "endLine": 133, - "endColumn": 15, - "ruleDescription": "Validate ECS Fargate tasks have required properties and values", + "startLine": 85, + "startColumn": 7, + "endLine": 85, + "endColumn": 28, + "ruleDescription": "Validate DynamoDB table ProvisionedThroughput is set when BillingMode is PROVISIONED", "phase": "LINT" }, { - "ruleId": "E3048", - "severity": "ERROR", - "message": "Fargate requires Memory to be specified", + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "FargateConditionalMemory", + "logicalId": "ExplicitProvisioned", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties", - "suggestedFix": "Set Memory to a valid Fargate value", - "category": "Resource", - "startLine": 147, - "startColumn": 5, - "endLine": 147, - "endColumn": 15, - "ruleDescription": "Validate ECS Fargate tasks have required properties and values", + "category": "Best Practice", + "startLine": 8, + "startColumn": 3, + "endLine": 8, + "endColumn": 22, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "E3048", - "severity": "ERROR", - "message": "Fargate Cpu value '3 vCPU' is not valid. Valid sizes are ['256', '512', '1024', '2048', '4096', '8192', '16384', '32768'] CPU units or ['0.25', '0.5', '1', '2', '4', '8', '16', '32'] vCPU.", + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "FargateConditionalInvalidCpu", + "logicalId": "ExplicitProvisioned", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.Cpu", - "suggestedFix": "Use a valid Fargate Cpu size in CPU units or vCPU", - "category": "Resource", - "startLine": 165, - "startColumn": 7, - "endLine": 165, - "endColumn": 10, - "ruleDescription": "Validate ECS Fargate tasks have required properties and values", + "category": "Best Practice", + "startLine": 8, + "startColumn": 3, + "endLine": 8, + "endColumn": 22, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "E3048", - "severity": "ERROR", - "message": "Fargate does not support PlacementConstraints", + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "FargateConditionalPlacementConstraints", + "logicalId": "DefaultProvisioned", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.PlacementConstraints", - "suggestedFix": "Remove PlacementConstraints for Fargate tasks", - "category": "Resource", - "startLine": 181, - "startColumn": 7, - "endLine": 181, - "endColumn": 27, - "ruleDescription": "Validate ECS Fargate tasks have required properties and values", + "category": "Best Practice", + "startLine": 21, + "startColumn": 3, + "endLine": 21, + "endColumn": 21, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "E3048", - "severity": "ERROR", - "message": "Fargate requires NetworkMode to be specified as 'awsvpc'", + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "ConditionalFargateThenEc2MissingNetworkMode", + "logicalId": "DefaultProvisioned", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties", - "suggestedFix": "Set NetworkMode to 'awsvpc'", - "category": "Resource", - "startLine": 191, - "startColumn": 5, - "endLine": 191, - "endColumn": 15, - "ruleDescription": "Validate ECS Fargate tasks have required properties and values", + "category": "Best Practice", + "startLine": 21, + "startColumn": 3, + "endLine": 21, + "endColumn": 21, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "E3048", - "severity": "ERROR", - "message": "Fargate requires NetworkMode to be specified as 'awsvpc'", + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "ConditionalEc2ThenFargateMissingNetworkMode", + "logicalId": "NullThroughput", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties", - "suggestedFix": "Set NetworkMode to 'awsvpc'", - "category": "Resource", - "startLine": 202, - "startColumn": 5, - "endLine": 202, - "endColumn": 15, - "ruleDescription": "Validate ECS Fargate tasks have required properties and values", + "category": "Best Practice", + "startLine": 33, + "startColumn": 3, + "endLine": 33, + "endColumn": 17, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'Family' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "FargateMissingAll", + "logicalId": "NullThroughput", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.Family", "category": "Best Practice", - "startLine": 11, - "startColumn": 7, - "endLine": 11, - "endColumn": 13, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 33, + "startColumn": 3, + "endLine": 33, + "endColumn": 17, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "FargateMissingAll", + "logicalId": "ExplicitValueThenRemoved", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 12, - "startColumn": 7, - "endLine": 12, - "endColumn": 30, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 48, + "startColumn": 3, + "endLine": 48, + "endColumn": 27, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "FargateMissingAll", + "logicalId": "ExplicitValueThenRemoved", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 14, - "startColumn": 7, - "endLine": 14, + "startLine": 48, + "startColumn": 3, + "endLine": 48, "endColumn": 27, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'Family' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "FargateWrongNetworkMode", + "logicalId": "ExplicitRemovedThenValue", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.Family", "category": "Best Practice", - "startLine": 23, - "startColumn": 7, - "endLine": 23, - "endColumn": 13, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 59, + "startColumn": 3, + "endLine": 59, + "endColumn": 27, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "FargateWrongNetworkMode", + "logicalId": "ExplicitRemovedThenValue", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 24, - "startColumn": 7, - "endLine": 24, - "endColumn": 30, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 59, + "startColumn": 3, + "endLine": 59, + "endColumn": 27, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "FargateWrongNetworkMode", + "logicalId": "DefaultValueThenRemoved", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 26, - "startColumn": 7, - "endLine": 26, - "endColumn": 18, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 70, + "startColumn": 3, + "endLine": 70, + "endColumn": 26, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "FargateWrongNetworkMode", + "logicalId": "DefaultValueThenRemoved", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.Cpu", "category": "Best Practice", - "startLine": 27, - "startColumn": 7, - "endLine": 27, - "endColumn": 10, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 70, + "startColumn": 3, + "endLine": 70, + "endColumn": 26, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'Memory' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "FargateWrongNetworkMode", + "logicalId": "DefaultRemovedThenValue", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.Memory", "category": "Best Practice", - "startLine": 28, - "startColumn": 7, - "endLine": 28, - "endColumn": 13, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 80, + "startColumn": 3, + "endLine": 80, + "endColumn": 26, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "FargateWrongNetworkMode", + "logicalId": "DefaultRemovedThenValue", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 29, - "startColumn": 7, - "endLine": 29, - "endColumn": 27, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 80, + "startColumn": 3, + "endLine": 80, + "endColumn": 26, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Family' is create-only; updating it will cause resource replacement", + "message": "Property 'TableName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FargateInvalidCpu", + "logicalId": "ExplicitProvisioned", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.Family", + "propertyPath": "Properties.TableName", "category": "Best Practice", - "startLine": 38, + "startLine": 11, "startColumn": 7, - "endLine": 38, - "endColumn": 13, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "endLine": 11, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -82861,43 +81818,41 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", + "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FargateInvalidCpu", + "logicalId": "ExplicitProvisioned", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.RequiresCompatibilities", + "propertyPath": "Properties.KeySchema", "category": "Best Practice", - "startLine": 39, + "startLine": 13, "startColumn": 7, - "endLine": 39, - "endColumn": 30, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "endLine": 13, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", + "message": "Property 'TableName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FargateInvalidCpu", + "logicalId": "DefaultProvisioned", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.NetworkMode", + "propertyPath": "Properties.TableName", "category": "Best Practice", - "startLine": 41, + "startLine": 24, "startColumn": 7, - "endLine": 41, - "endColumn": 18, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "endLine": 24, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -82907,43 +81862,41 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", + "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FargateInvalidCpu", + "logicalId": "DefaultProvisioned", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.Cpu", + "propertyPath": "Properties.KeySchema", "category": "Best Practice", - "startLine": 42, + "startLine": 25, "startColumn": 7, - "endLine": 42, - "endColumn": 10, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "endLine": 25, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Memory' is create-only; updating it will cause resource replacement", + "message": "Property 'TableName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FargateInvalidCpu", + "logicalId": "NullThroughput", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.Memory", + "propertyPath": "Properties.TableName", "category": "Best Practice", - "startLine": 43, + "startLine": 36, "startColumn": 7, - "endLine": 43, - "endColumn": 13, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "endLine": 36, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -82953,787 +81906,934 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", + "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FargateInvalidCpu", + "logicalId": "NullThroughput", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.ContainerDefinitions", + "propertyPath": "Properties.KeySchema", "category": "Best Practice", - "startLine": 44, + "startLine": 38, "startColumn": 7, - "endLine": 44, - "endColumn": 27, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "endLine": 38, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Family' is create-only; updating it will cause resource replacement", + "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FargatePlacementConstraints", + "logicalId": "ExplicitValueThenRemoved", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.Family", + "propertyPath": "Properties.KeySchema", "category": "Best Practice", "startLine": 53, "startColumn": 7, "endLine": 53, - "endColumn": 13, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", + "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FargatePlacementConstraints", + "logicalId": "ExplicitRemovedThenValue", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.RequiresCompatibilities", + "propertyPath": "Properties.KeySchema", "category": "Best Practice", - "startLine": 54, + "startLine": 64, "startColumn": 7, - "endLine": 54, - "endColumn": 30, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "endLine": 64, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", + "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FargatePlacementConstraints", + "logicalId": "DefaultValueThenRemoved", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.NetworkMode", + "propertyPath": "Properties.KeySchema", "category": "Best Practice", - "startLine": 56, + "startLine": 74, "startColumn": 7, - "endLine": 56, - "endColumn": 18, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "endLine": 74, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", + "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FargatePlacementConstraints", + "logicalId": "DefaultRemovedThenValue", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.Cpu", + "propertyPath": "Properties.KeySchema", "category": "Best Practice", - "startLine": 57, + "startLine": 84, "startColumn": 7, - "endLine": 57, - "endColumn": 10, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "endLine": 84, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Memory' is create-only; updating it will cause resource replacement", + "message": "Resource 'ExplicitProvisioned' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "FargatePlacementConstraints", + "logicalId": "ExplicitProvisioned", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.Memory", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 58, - "startColumn": 7, - "endLine": 58, - "endColumn": 13, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 10, + "startColumn": 5, + "endLine": 10, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'PlacementConstraints' is create-only; updating it will cause resource replacement", + "message": "Resource 'DefaultProvisioned' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "FargatePlacementConstraints", + "logicalId": "DefaultProvisioned", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.PlacementConstraints", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 59, - "startColumn": 7, - "endLine": 59, - "endColumn": 27, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 23, + "startColumn": 5, + "endLine": 23, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", + "message": "Resource 'NullThroughput' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "FargatePlacementConstraints", + "logicalId": "NullThroughput", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.ContainerDefinitions", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 62, - "startColumn": 7, - "endLine": 62, - "endColumn": 27, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 35, + "startColumn": 5, + "endLine": 35, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Family' is create-only; updating it will cause resource replacement", + "message": "Resource 'ExplicitValueThenRemoved' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "FargateUnsupportedLogDriver", + "logicalId": "ExplicitValueThenRemoved", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.Family", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 71, - "startColumn": 7, - "endLine": 71, - "endColumn": 13, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 50, + "startColumn": 5, + "endLine": 50, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", + "message": "Resource 'ExplicitRemovedThenValue' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "FargateUnsupportedLogDriver", + "logicalId": "ExplicitRemovedThenValue", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.RequiresCompatibilities", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 61, + "startColumn": 5, + "endLine": 61, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'DefaultValueThenRemoved' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "DefaultValueThenRemoved", + "entityType": "Resource", + "resourceType": "AWS::DynamoDB::Table" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", "startLine": 72, - "startColumn": 7, + "startColumn": 5, "endLine": 72, - "endColumn": 30, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", + "message": "Resource 'DefaultRemovedThenValue' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "FargateUnsupportedLogDriver", + "logicalId": "DefaultRemovedThenValue", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.NetworkMode", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 74, - "startColumn": 7, - "endLine": 74, - "endColumn": 18, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 82, + "startColumn": 5, + "endLine": 82, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "bad/resources/dynamodb/undefined_attribute_definition.yaml": { + "filePath": "bad/resources/dynamodb/undefined_attribute_definition.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 1, + "warnings": 0, + "informational": 4, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9001", + "ruleId": "E3039", + "severity": "ERROR", + "message": "AttributeDefinitions does not match KeySchema attributes. missing definitions: [Artist]", + "source": "CFN_LINT", + "entity": { + "logicalId": "dynamoDBTable", + "entityType": "Resource", + "resourceType": "AWS::DynamoDB::Table" + }, + "propertyPath": "Properties", + "category": "Resource", + "startLine": 6, + "startColumn": 5, + "endLine": 6, + "endColumn": 15, + "ruleDescription": "AttributeDefinitions / KeySchemas mismatch", + "phase": "LINT" + }, + { + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "FargateUnsupportedLogDriver", + "logicalId": "dynamoDBTable", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.Cpu", "category": "Best Practice", - "startLine": 75, - "startColumn": 7, - "endLine": 75, - "endColumn": 10, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 4, + "startColumn": 3, + "endLine": 4, + "endColumn": 16, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'Memory' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "FargateUnsupportedLogDriver", + "logicalId": "dynamoDBTable", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.Memory", "category": "Best Practice", - "startLine": 76, - "startColumn": 7, - "endLine": 76, - "endColumn": 13, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 4, + "startColumn": 3, + "endLine": 4, + "endColumn": 16, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", + "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FargateUnsupportedLogDriver", + "logicalId": "dynamoDBTable", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.ContainerDefinitions", + "propertyPath": "Properties.KeySchema", "category": "Best Practice", - "startLine": 77, + "startLine": 10, "startColumn": 7, - "endLine": 77, - "endColumn": 27, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "endLine": 10, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Family' is create-only; updating it will cause resource replacement", + "message": "Resource 'dynamoDBTable' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "FargateNullCpu", + "logicalId": "dynamoDBTable", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.Family", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 88, - "startColumn": 7, - "endLine": 88, - "endColumn": 13, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 6, + "startColumn": 5, + "endLine": 6, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "bad/resources/dynamodb/unused_attribute_definition_1.yaml": { + "filePath": "bad/resources/dynamodb/unused_attribute_definition_1.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 1, + "warnings": 0, + "informational": 4, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "E3039", + "severity": "ERROR", + "message": "AttributeDefinitions does not match KeySchema attributes. unused definitions: [Sales]", + "source": "CFN_LINT", + "entity": { + "logicalId": "dynamoDBTable", + "entityType": "Resource", + "resourceType": "AWS::DynamoDB::Table" + }, + "propertyPath": "Properties", + "category": "Resource", + "startLine": 6, + "startColumn": 5, + "endLine": 6, + "endColumn": 15, + "ruleDescription": "AttributeDefinitions / KeySchemas mismatch", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "dynamoDBTable", + "entityType": "Resource", + "resourceType": "AWS::DynamoDB::Table" + }, + "category": "Best Practice", + "startLine": 4, + "startColumn": 3, + "endLine": 4, + "endColumn": 16, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "dynamoDBTable", + "entityType": "Resource", + "resourceType": "AWS::DynamoDB::Table" + }, + "category": "Best Practice", + "startLine": 4, + "startColumn": 3, + "endLine": 4, + "endColumn": 16, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", + "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FargateNullCpu", + "logicalId": "dynamoDBTable", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.RequiresCompatibilities", + "propertyPath": "Properties.KeySchema", "category": "Best Practice", - "startLine": 89, + "startLine": 14, "startColumn": 7, - "endLine": 89, - "endColumn": 30, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "endLine": 14, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", + "message": "Resource 'dynamoDBTable' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "FargateNullCpu", + "logicalId": "dynamoDBTable", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.NetworkMode", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 91, - "startColumn": 7, - "endLine": 91, - "endColumn": 18, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 6, + "startColumn": 5, + "endLine": 6, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "bad/resources/dynamodb/unused_attribute_definition_2.yaml": { + "filePath": "bad/resources/dynamodb/unused_attribute_definition_2.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 1, + "warnings": 0, + "informational": 4, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "E3039", + "severity": "ERROR", + "message": "AttributeDefinitions does not match KeySchema attributes. unused definitions: [Sales]", + "source": "CFN_LINT", + "entity": { + "logicalId": "dynamoDBTable", + "entityType": "Resource", + "resourceType": "AWS::DynamoDB::Table" + }, + "propertyPath": "Properties", + "category": "Resource", + "startLine": 6, + "startColumn": 5, + "endLine": 6, + "endColumn": 15, + "ruleDescription": "AttributeDefinitions / KeySchemas mismatch", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "FargateNullCpu", + "logicalId": "dynamoDBTable", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.Cpu", "category": "Best Practice", - "startLine": 92, - "startColumn": 7, - "endLine": 92, - "endColumn": 10, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Fn::If on condition 'UseConstraints'" - } + "startLine": 4, + "startColumn": 3, + "endLine": 4, + "endColumn": 16, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'Memory' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "FargateNullCpu", + "logicalId": "dynamoDBTable", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.Memory", "category": "Best Practice", - "startLine": 93, - "startColumn": 7, - "endLine": 93, - "endColumn": 13, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 4, + "startColumn": 3, + "endLine": 4, + "endColumn": 16, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", + "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FargateNullCpu", + "logicalId": "dynamoDBTable", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.ContainerDefinitions", + "propertyPath": "Properties.KeySchema", "category": "Best Practice", - "startLine": 94, + "startLine": 14, "startColumn": 7, - "endLine": 94, - "endColumn": 27, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "endLine": 14, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Family' is create-only; updating it will cause resource replacement", + "message": "Resource 'dynamoDBTable' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "FargateNullPC", + "logicalId": "dynamoDBTable", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.Family", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 103, - "startColumn": 7, - "endLine": 103, - "endColumn": 13, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 6, + "startColumn": 5, + "endLine": 6, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "bad/resources/ecs/fargate_conditional_properties.yaml": { + "filePath": "bad/resources/ecs/fargate_conditional_properties.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 2, + "counts": { + "fatal": 0, + "errors": 2, + "warnings": 0, + "informational": 2, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E3048", + "severity": "ERROR", + "message": "Fargate does not support PlacementConstraints", + "source": "CFN_LINT", "entity": { - "logicalId": "FargateNullPC", + "logicalId": "PlacementInFargateBranch", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.RequiresCompatibilities", - "category": "Best Practice", - "startLine": 104, - "startColumn": 7, - "endLine": 104, - "endColumn": 30, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "propertyPath": "Properties.PlacementConstraints", + "suggestedFix": "Remove PlacementConstraints for Fargate tasks", + "category": "Resource", + "startLine": 15, + "startColumn": 5, + "endLine": 15, + "endColumn": 15, + "ruleDescription": "Validate ECS Fargate tasks have required properties and values", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E3048", + "severity": "ERROR", + "message": "Fargate does not support log driver 'syslog'. Supported drivers: ['awslogs', 'splunk', 'awsfirelens']", + "source": "CFN_LINT", "entity": { - "logicalId": "FargateNullPC", + "logicalId": "InvalidDriverInFargateBranch", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.NetworkMode", - "category": "Best Practice", - "startLine": 106, - "startColumn": 7, - "endLine": 106, - "endColumn": 18, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "propertyPath": "Properties.ContainerDefinitions.0.LogConfiguration.LogDriver", + "suggestedFix": "Use 'awslogs', 'splunk', or 'awsfirelens'", + "category": "Resource", + "startLine": 36, + "startColumn": 5, + "endLine": 36, + "endColumn": 15, + "ruleDescription": "Validate ECS Fargate tasks have required properties and values", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", + "message": "Resource 'PlacementInFargateBranch' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "FargateNullPC", + "logicalId": "PlacementInFargateBranch", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Cpu", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 107, - "startColumn": 7, - "endLine": 107, - "endColumn": 10, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 15, + "startColumn": 5, + "endLine": 15, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Memory' is create-only; updating it will cause resource replacement", + "message": "Resource 'InvalidDriverInFargateBranch' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "FargateNullPC", + "logicalId": "InvalidDriverInFargateBranch", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Memory", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 108, - "startColumn": 7, - "endLine": 108, - "endColumn": 13, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 36, + "startColumn": 5, + "endLine": 36, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "bad/resources/ecs/fargate_numeric_spellings_e3047.yaml": { + "filePath": "bad/resources/ecs/fargate_numeric_spellings_e3047.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 6, + "counts": { + "fatal": 0, + "errors": 9, + "warnings": 0, + "informational": 36, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'PlacementConstraints' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E3047", + "severity": "ERROR", + "message": "Cpu '2e0 vCPU' is not compatible with Memory '4 GB' for Fargate", + "source": "CFN_LINT", "entity": { - "logicalId": "FargateNullPC", + "logicalId": "ScientificCpuNotation", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.PlacementConstraints", - "category": "Best Practice", - "startLine": 109, + "propertyPath": "Properties.Cpu", + "suggestedFix": "Use a valid Fargate CPU/memory combination (e.g., Cpu: 256 with Memory: 512, 1024, or 2048)", + "category": "Resource", + "startLine": 8, "startColumn": 7, - "endLine": 109, - "endColumn": 27, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", + "endLine": 8, + "endColumn": 10, + "ruleDescription": "Validate ECS Fargate tasks have the right combination of CPU and memory", + "phase": "LINT", "context": { - "lifecycle": "create-only", - "resolutionSource": "Fn::If on condition 'UseConstraints'" + "extra": { + "cpu": "2e0 vCPU", + "memory": "4 GB" + } } }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E3047", + "severity": "ERROR", + "message": "Cpu '2 vCPU' is not compatible with Memory '4e0 GB' for Fargate", + "source": "CFN_LINT", "entity": { - "logicalId": "FargateNullPC", + "logicalId": "ScientificMemoryNotation", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.ContainerDefinitions", - "category": "Best Practice", - "startLine": 110, + "propertyPath": "Properties.Cpu", + "suggestedFix": "Use a valid Fargate CPU/memory combination (e.g., Cpu: 256 with Memory: 512, 1024, or 2048)", + "category": "Resource", + "startLine": 20, "startColumn": 7, - "endLine": 110, - "endColumn": 27, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", + "endLine": 20, + "endColumn": 10, + "ruleDescription": "Validate ECS Fargate tasks have the right combination of CPU and memory", + "phase": "LINT", "context": { - "lifecycle": "create-only" + "extra": { + "cpu": "2 vCPU", + "memory": "4e0 GB" + } } }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Family' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E3047", + "severity": "ERROR", + "message": "Cpu ' 2 vCPU' is not compatible with Memory '4 GB' for Fargate", + "source": "CFN_LINT", "entity": { - "logicalId": "FargateConditionalNetworkMode", + "logicalId": "LeadingCpuWhitespace", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Family", - "category": "Best Practice", - "startLine": 120, + "propertyPath": "Properties.Cpu", + "suggestedFix": "Use a valid Fargate CPU/memory combination (e.g., Cpu: 256 with Memory: 512, 1024, or 2048)", + "category": "Resource", + "startLine": 32, "startColumn": 7, - "endLine": 120, - "endColumn": 13, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", + "endLine": 32, + "endColumn": 10, + "ruleDescription": "Validate ECS Fargate tasks have the right combination of CPU and memory", + "phase": "LINT", "context": { - "lifecycle": "create-only" + "extra": { + "cpu": " 2 vCPU", + "memory": "4 GB" + } } }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E3047", + "severity": "ERROR", + "message": "Cpu '2 vCPU ' is not compatible with Memory '4 GB' for Fargate", + "source": "CFN_LINT", "entity": { - "logicalId": "FargateConditionalNetworkMode", + "logicalId": "TrailingCpuWhitespace", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.RequiresCompatibilities", - "category": "Best Practice", - "startLine": 121, + "propertyPath": "Properties.Cpu", + "suggestedFix": "Use a valid Fargate CPU/memory combination (e.g., Cpu: 256 with Memory: 512, 1024, or 2048)", + "category": "Resource", + "startLine": 44, "startColumn": 7, - "endLine": 121, - "endColumn": 30, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", + "endLine": 44, + "endColumn": 10, + "ruleDescription": "Validate ECS Fargate tasks have the right combination of CPU and memory", + "phase": "LINT", "context": { - "lifecycle": "create-only" + "extra": { + "cpu": "2 vCPU ", + "memory": "4 GB" + } } }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E3047", + "severity": "ERROR", + "message": "Cpu '2 vCPU' is not compatible with Memory ' 4 GB' for Fargate", + "source": "CFN_LINT", "entity": { - "logicalId": "FargateConditionalNetworkMode", + "logicalId": "LeadingMemoryWhitespace", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.NetworkMode", - "category": "Best Practice", - "startLine": 122, + "propertyPath": "Properties.Cpu", + "suggestedFix": "Use a valid Fargate CPU/memory combination (e.g., Cpu: 256 with Memory: 512, 1024, or 2048)", + "category": "Resource", + "startLine": 56, "startColumn": 7, - "endLine": 122, - "endColumn": 18, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", + "endLine": 56, + "endColumn": 10, + "ruleDescription": "Validate ECS Fargate tasks have the right combination of CPU and memory", + "phase": "LINT", "context": { - "lifecycle": "create-only", - "resolutionSource": "Fn::If on condition 'UseConstraints'" + "extra": { + "cpu": "2 vCPU", + "memory": " 4 GB" + } } }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E3047", + "severity": "ERROR", + "message": "Cpu '2 vCPU' is not compatible with Memory '4 GB ' for Fargate", + "source": "CFN_LINT", "entity": { - "logicalId": "FargateConditionalNetworkMode", + "logicalId": "TrailingMemoryWhitespace", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Cpu", - "category": "Best Practice", - "startLine": 123, + "suggestedFix": "Use a valid Fargate CPU/memory combination (e.g., Cpu: 256 with Memory: 512, 1024, or 2048)", + "category": "Resource", + "startLine": 68, "startColumn": 7, - "endLine": 123, + "endLine": 68, "endColumn": 10, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", + "ruleDescription": "Validate ECS Fargate tasks have the right combination of CPU and memory", + "phase": "LINT", "context": { - "lifecycle": "create-only" + "extra": { + "cpu": "2 vCPU", + "memory": "4 GB " + } } }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Memory' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E3048", + "severity": "ERROR", + "message": "Fargate Cpu value '2e0 vCPU' is not valid. Valid sizes are ['256', '512', '1024', '2048', '4096', '8192', '16384', '32768'] CPU units or ['0.25', '0.5', '1', '2', '4', '8', '16', '32'] vCPU.", + "source": "CFN_LINT", "entity": { - "logicalId": "FargateConditionalNetworkMode", + "logicalId": "ScientificCpuNotation", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Memory", - "category": "Best Practice", - "startLine": 124, + "propertyPath": "Properties.Cpu", + "suggestedFix": "Use a valid Fargate Cpu size in CPU units or vCPU", + "category": "Resource", + "startLine": 8, "startColumn": 7, - "endLine": 124, - "endColumn": 13, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "endLine": 8, + "endColumn": 10, + "ruleDescription": "Validate ECS Fargate tasks have required properties and values", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E3048", + "severity": "ERROR", + "message": "Fargate Cpu value ' 2 vCPU' is not valid. Valid sizes are ['256', '512', '1024', '2048', '4096', '8192', '16384', '32768'] CPU units or ['0.25', '0.5', '1', '2', '4', '8', '16', '32'] vCPU.", + "source": "CFN_LINT", "entity": { - "logicalId": "FargateConditionalNetworkMode", + "logicalId": "LeadingCpuWhitespace", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.ContainerDefinitions", - "category": "Best Practice", - "startLine": 125, + "propertyPath": "Properties.Cpu", + "suggestedFix": "Use a valid Fargate Cpu size in CPU units or vCPU", + "category": "Resource", + "startLine": 32, "startColumn": 7, - "endLine": 125, - "endColumn": 27, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "endLine": 32, + "endColumn": 10, + "ruleDescription": "Validate ECS Fargate tasks have required properties and values", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Family' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E3048", + "severity": "ERROR", + "message": "Fargate Cpu value '2 vCPU ' is not valid. Valid sizes are ['256', '512', '1024', '2048', '4096', '8192', '16384', '32768'] CPU units or ['0.25', '0.5', '1', '2', '4', '8', '16', '32'] vCPU.", + "source": "CFN_LINT", "entity": { - "logicalId": "FargateConditionalCpu", + "logicalId": "TrailingCpuWhitespace", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Family", - "category": "Best Practice", - "startLine": 134, + "propertyPath": "Properties.Cpu", + "suggestedFix": "Use a valid Fargate Cpu size in CPU units or vCPU", + "category": "Resource", + "startLine": 44, "startColumn": 7, - "endLine": 134, - "endColumn": 13, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "endLine": 44, + "endColumn": 10, + "ruleDescription": "Validate ECS Fargate tasks have required properties and values", + "phase": "LINT" }, { "ruleId": "I9001", @@ -83741,15 +82841,15 @@ "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FargateConditionalCpu", + "logicalId": "ScientificCpuNotation", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 135, + "startLine": 6, "startColumn": 7, - "endLine": 135, + "endLine": 6, "endColumn": 30, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -83764,15 +82864,15 @@ "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FargateConditionalCpu", + "logicalId": "ScientificCpuNotation", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 136, + "startLine": 7, "startColumn": 7, - "endLine": 136, + "endLine": 7, "endColumn": 18, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -83787,22 +82887,21 @@ "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FargateConditionalCpu", + "logicalId": "ScientificCpuNotation", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Cpu", "category": "Best Practice", - "startLine": 137, + "startLine": 8, "startColumn": 7, - "endLine": 137, + "endLine": 8, "endColumn": 10, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Fn::If on condition 'UseConstraints'" + "lifecycle": "create-only" } }, { @@ -83811,15 +82910,15 @@ "message": "Property 'Memory' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FargateConditionalCpu", + "logicalId": "ScientificCpuNotation", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Memory", "category": "Best Practice", - "startLine": 138, + "startLine": 9, "startColumn": 7, - "endLine": 138, + "endLine": 9, "endColumn": 13, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -83834,15 +82933,15 @@ "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FargateConditionalCpu", + "logicalId": "ScientificCpuNotation", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 139, + "startLine": 10, "startColumn": 7, - "endLine": 139, + "endLine": 10, "endColumn": 27, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -83851,44 +82950,21 @@ "lifecycle": "create-only" } }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Family' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "FargateConditionalMemory", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.Family", - "category": "Best Practice", - "startLine": 148, - "startColumn": 7, - "endLine": 148, - "endColumn": 13, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, { "ruleId": "I9001", "severity": "INFO", "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FargateConditionalMemory", + "logicalId": "ScientificMemoryNotation", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 149, + "startLine": 18, "startColumn": 7, - "endLine": 149, + "endLine": 18, "endColumn": 30, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -83903,15 +82979,15 @@ "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FargateConditionalMemory", + "logicalId": "ScientificMemoryNotation", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 150, + "startLine": 19, "startColumn": 7, - "endLine": 150, + "endLine": 19, "endColumn": 18, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -83926,15 +83002,15 @@ "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FargateConditionalMemory", + "logicalId": "ScientificMemoryNotation", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Cpu", "category": "Best Practice", - "startLine": 151, + "startLine": 20, "startColumn": 7, - "endLine": 151, + "endLine": 20, "endColumn": 10, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -83949,22 +83025,21 @@ "message": "Property 'Memory' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FargateConditionalMemory", + "logicalId": "ScientificMemoryNotation", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Memory", "category": "Best Practice", - "startLine": 152, + "startLine": 21, "startColumn": 7, - "endLine": 152, + "endLine": 21, "endColumn": 13, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Fn::If on condition 'UseConstraints'" + "lifecycle": "create-only" } }, { @@ -83973,15 +83048,15 @@ "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FargateConditionalMemory", + "logicalId": "ScientificMemoryNotation", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 153, + "startLine": 22, "startColumn": 7, - "endLine": 153, + "endLine": 22, "endColumn": 27, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -83990,44 +83065,21 @@ "lifecycle": "create-only" } }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Family' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "FargateConditionalInvalidCpu", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.Family", - "category": "Best Practice", - "startLine": 162, - "startColumn": 7, - "endLine": 162, - "endColumn": 13, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, { "ruleId": "I9001", "severity": "INFO", "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FargateConditionalInvalidCpu", + "logicalId": "LeadingCpuWhitespace", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 163, + "startLine": 30, "startColumn": 7, - "endLine": 163, + "endLine": 30, "endColumn": 30, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -84042,15 +83094,15 @@ "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FargateConditionalInvalidCpu", + "logicalId": "LeadingCpuWhitespace", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 164, + "startLine": 31, "startColumn": 7, - "endLine": 164, + "endLine": 31, "endColumn": 18, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -84065,22 +83117,21 @@ "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FargateConditionalInvalidCpu", + "logicalId": "LeadingCpuWhitespace", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Cpu", "category": "Best Practice", - "startLine": 165, + "startLine": 32, "startColumn": 7, - "endLine": 165, + "endLine": 32, "endColumn": 10, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Fn::If on condition 'UseConstraints'" + "lifecycle": "create-only" } }, { @@ -84089,15 +83140,15 @@ "message": "Property 'Memory' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FargateConditionalInvalidCpu", + "logicalId": "LeadingCpuWhitespace", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Memory", "category": "Best Practice", - "startLine": 166, + "startLine": 33, "startColumn": 7, - "endLine": 166, + "endLine": 33, "endColumn": 13, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -84112,15 +83163,15 @@ "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FargateConditionalInvalidCpu", + "logicalId": "LeadingCpuWhitespace", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 167, + "startLine": 34, "startColumn": 7, - "endLine": 167, + "endLine": 34, "endColumn": 27, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -84129,44 +83180,21 @@ "lifecycle": "create-only" } }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Family' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "FargateConditionalPlacementConstraints", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.Family", - "category": "Best Practice", - "startLine": 176, - "startColumn": 7, - "endLine": 176, - "endColumn": 13, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, { "ruleId": "I9001", "severity": "INFO", "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FargateConditionalPlacementConstraints", + "logicalId": "TrailingCpuWhitespace", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 177, + "startLine": 42, "startColumn": 7, - "endLine": 177, + "endLine": 42, "endColumn": 30, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -84181,15 +83209,15 @@ "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FargateConditionalPlacementConstraints", + "logicalId": "TrailingCpuWhitespace", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 178, + "startLine": 43, "startColumn": 7, - "endLine": 178, + "endLine": 43, "endColumn": 18, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -84204,15 +83232,15 @@ "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FargateConditionalPlacementConstraints", + "logicalId": "TrailingCpuWhitespace", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Cpu", "category": "Best Practice", - "startLine": 179, + "startLine": 44, "startColumn": 7, - "endLine": 179, + "endLine": 44, "endColumn": 10, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -84227,15 +83255,15 @@ "message": "Property 'Memory' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FargateConditionalPlacementConstraints", + "logicalId": "TrailingCpuWhitespace", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Memory", "category": "Best Practice", - "startLine": 180, + "startLine": 45, "startColumn": 7, - "endLine": 180, + "endLine": 45, "endColumn": 13, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -84247,43 +83275,42 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'PlacementConstraints' is create-only; updating it will cause resource replacement", + "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FargateConditionalPlacementConstraints", + "logicalId": "TrailingCpuWhitespace", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.PlacementConstraints", + "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 181, + "startLine": 46, "startColumn": 7, - "endLine": 181, + "endLine": 46, "endColumn": 27, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Fn::If on condition 'UseConstraints'" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", + "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FargateConditionalPlacementConstraints", + "logicalId": "LeadingMemoryWhitespace", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.ContainerDefinitions", + "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 182, + "startLine": 54, "startColumn": 7, - "endLine": 182, - "endColumn": 27, + "endLine": 54, + "endColumn": 30, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", @@ -84294,25 +83321,24 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", + "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConditionalFargateThenEc2MissingNetworkMode", + "logicalId": "LeadingMemoryWhitespace", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.RequiresCompatibilities", + "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 192, + "startLine": 55, "startColumn": 7, - "endLine": 192, - "endColumn": 30, + "endLine": 55, + "endColumn": 18, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Fn::If on condition 'UseConstraints'" + "lifecycle": "create-only" } }, { @@ -84321,15 +83347,15 @@ "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConditionalFargateThenEc2MissingNetworkMode", + "logicalId": "LeadingMemoryWhitespace", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Cpu", "category": "Best Practice", - "startLine": 193, + "startLine": 56, "startColumn": 7, - "endLine": 193, + "endLine": 56, "endColumn": 10, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -84344,15 +83370,15 @@ "message": "Property 'Memory' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConditionalFargateThenEc2MissingNetworkMode", + "logicalId": "LeadingMemoryWhitespace", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Memory", "category": "Best Practice", - "startLine": 194, + "startLine": 57, "startColumn": 7, - "endLine": 194, + "endLine": 57, "endColumn": 13, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -84367,15 +83393,15 @@ "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConditionalFargateThenEc2MissingNetworkMode", + "logicalId": "LeadingMemoryWhitespace", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 195, + "startLine": 58, "startColumn": 7, - "endLine": 195, + "endLine": 58, "endColumn": 27, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -84390,43 +83416,19 @@ "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConditionalEc2ThenFargateMissingNetworkMode", + "logicalId": "TrailingMemoryWhitespace", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 203, + "startLine": 66, "startColumn": 7, - "endLine": 203, + "endLine": 66, "endColumn": 30, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Fn::If on condition 'UseConstraints'" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "ConditionalEc2ThenFargateMissingNetworkMode", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.Cpu", - "category": "Best Practice", - "startLine": 204, - "startColumn": 7, - "endLine": 204, - "endColumn": 10, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", "context": { "lifecycle": "create-only" } @@ -84434,19 +83436,19 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Memory' is create-only; updating it will cause resource replacement", + "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConditionalEc2ThenFargateMissingNetworkMode", + "logicalId": "TrailingMemoryWhitespace", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Memory", + "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 205, + "startLine": 67, "startColumn": 7, - "endLine": 205, - "endColumn": 13, + "endLine": 67, + "endColumn": 18, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", @@ -84457,202 +83459,88 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "ConditionalEc2ThenFargateMissingNetworkMode", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.ContainerDefinitions", - "category": "Best Practice", - "startLine": 206, - "startColumn": 7, - "endLine": 206, - "endColumn": 27, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'FargateMissingAll' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "FargateMissingAll", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 10, - "startColumn": 5, - "endLine": 10, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'FargateWrongNetworkMode' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "FargateWrongNetworkMode", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 22, - "startColumn": 5, - "endLine": 22, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'FargateInvalidCpu' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "FargateInvalidCpu", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 37, - "startColumn": 5, - "endLine": 37, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'FargatePlacementConstraints' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "FargatePlacementConstraints", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 52, - "startColumn": 5, - "endLine": 52, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'FargateUnsupportedLogDriver' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "FargateUnsupportedLogDriver", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 70, - "startColumn": 5, - "endLine": 70, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'FargateNullCpu' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", + "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FargateNullCpu", + "logicalId": "TrailingMemoryWhitespace", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.Cpu", "category": "Best Practice", - "startLine": 87, - "startColumn": 5, - "endLine": 87, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 68, + "startColumn": 7, + "endLine": 68, + "endColumn": 10, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'FargateNullPC' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", + "message": "Property 'Memory' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FargateNullPC", + "logicalId": "TrailingMemoryWhitespace", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.Memory", "category": "Best Practice", - "startLine": 102, - "startColumn": 5, - "endLine": 102, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 69, + "startColumn": 7, + "endLine": 69, + "endColumn": 13, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'FargateConditionalNetworkMode' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", + "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FargateConditionalNetworkMode", + "logicalId": "TrailingMemoryWhitespace", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 119, - "startColumn": 5, - "endLine": 119, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 70, + "startColumn": 7, + "endLine": 70, + "endColumn": 27, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'FargateConditionalCpu' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", + "message": "Resource 'ScientificCpuNotation' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "FargateConditionalCpu", + "logicalId": "ScientificCpuNotation", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 133, + "startLine": 5, "startColumn": 5, - "endLine": 133, + "endLine": 5, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -84660,19 +83548,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'FargateConditionalMemory' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", + "message": "Resource 'ScientificMemoryNotation' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "FargateConditionalMemory", + "logicalId": "ScientificMemoryNotation", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 147, + "startLine": 17, "startColumn": 5, - "endLine": 147, + "endLine": 17, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -84680,19 +83568,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'FargateConditionalInvalidCpu' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", + "message": "Resource 'LeadingCpuWhitespace' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "FargateConditionalInvalidCpu", + "logicalId": "LeadingCpuWhitespace", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 161, + "startLine": 29, "startColumn": 5, - "endLine": 161, + "endLine": 29, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -84700,19 +83588,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'FargateConditionalPlacementConstraints' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", + "message": "Resource 'TrailingCpuWhitespace' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "FargateConditionalPlacementConstraints", + "logicalId": "TrailingCpuWhitespace", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 175, + "startLine": 41, "startColumn": 5, - "endLine": 175, + "endLine": 41, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -84720,19 +83608,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'ConditionalFargateThenEc2MissingNetworkMode' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", + "message": "Resource 'LeadingMemoryWhitespace' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ConditionalFargateThenEc2MissingNetworkMode", + "logicalId": "LeadingMemoryWhitespace", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 191, + "startLine": 53, "startColumn": 5, - "endLine": 191, + "endLine": 53, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -84740,35 +83628,35 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'ConditionalEc2ThenFargateMissingNetworkMode' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", + "message": "Resource 'TrailingMemoryWhitespace' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ConditionalEc2ThenFargateMissingNetworkMode", + "logicalId": "TrailingMemoryWhitespace", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 202, + "startLine": 65, "startColumn": 5, - "endLine": 202, + "endLine": 65, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "bad/resources/ecs/fargate_task_sizes_e3047.yaml": { - "filePath": "bad/resources/ecs/fargate_task_sizes_e3047.yaml", + "bad/resources/ecs/fargate_properties_e3048.yaml": { + "filePath": "bad/resources/ecs/fargate_properties_e3048.yaml", "status": "OK", "metadata": { - "resourcesScanned": 9, + "resourcesScanned": 14, "counts": { "fatal": 0, - "errors": 11, - "warnings": 4, - "informational": 63, + "errors": 17, + "warnings": 0, + "informational": 94, "debug": 0 }, "suppressed": 0, @@ -84779,236 +83667,274 @@ { "ruleId": "E3047", "severity": "ERROR", - "message": "Cpu '8 vCPU' is not compatible with Memory '17 GB' for Fargate", + "message": "Cpu '128' is not compatible with Memory '512' for Fargate", "source": "CFN_LINT", "entity": { - "logicalId": "EightVcpuInvalidStep", + "logicalId": "FargateInvalidCpu", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Cpu", "suggestedFix": "Use a valid Fargate CPU/memory combination (e.g., Cpu: 256 with Memory: 512, 1024, or 2048)", "category": "Resource", - "startLine": 11, + "startLine": 42, "startColumn": 7, - "endLine": 11, + "endLine": 42, "endColumn": 10, "ruleDescription": "Validate ECS Fargate tasks have the right combination of CPU and memory", "phase": "LINT", "context": { "extra": { - "cpu": "8 vCPU", - "memory": "17 GB" + "cpu": "128", + "memory": "512" } } }, { "ruleId": "E3047", "severity": "ERROR", - "message": "Cpu 16384 is not compatible with Memory 36864 for Fargate", + "message": "Cpu '3 vCPU' is not compatible with Memory '512' for Fargate", "source": "CFN_LINT", "entity": { - "logicalId": "SixteenVcpuInvalidStep", + "logicalId": "FargateConditionalInvalidCpu", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Cpu", "suggestedFix": "Use a valid Fargate CPU/memory combination (e.g., Cpu: 256 with Memory: 512, 1024, or 2048)", "category": "Resource", - "startLine": 24, + "startLine": 165, "startColumn": 7, - "endLine": 24, + "endLine": 165, "endColumn": 10, "ruleDescription": "Validate ECS Fargate tasks have the right combination of CPU and memory", "phase": "LINT", "context": { "extra": { - "cpu": 16384, - "memory": 36864 + "cpu": "256", + "memory": "512" } } }, { - "ruleId": "E3047", + "ruleId": "E3048", "severity": "ERROR", - "message": "Cpu '32 vCPU' is not compatible with Memory '64 GB' for Fargate", + "message": "Fargate requires Cpu to be specified", "source": "CFN_LINT", "entity": { - "logicalId": "ThirtyTwoVcpuUnsupportedSixtyFourGb", + "logicalId": "FargateMissingAll", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Cpu", - "suggestedFix": "Use a valid Fargate CPU/memory combination (e.g., Cpu: 256 with Memory: 512, 1024, or 2048)", + "propertyPath": "Properties", + "suggestedFix": "Set Cpu to a valid Fargate value (256, 512, 1024, 2048, 4096, 8192, 16384, or 32768)", "category": "Resource", - "startLine": 37, - "startColumn": 7, - "endLine": 37, - "endColumn": 10, - "ruleDescription": "Validate ECS Fargate tasks have the right combination of CPU and memory", - "phase": "LINT", - "context": { - "extra": { - "cpu": "32 vCPU", - "memory": "64 GB" - } - } + "startLine": 10, + "startColumn": 5, + "endLine": 10, + "endColumn": 15, + "ruleDescription": "Validate ECS Fargate tasks have required properties and values", + "phase": "LINT" }, { - "ruleId": "E3047", + "ruleId": "E3048", "severity": "ERROR", - "message": "Cpu 32768 is not compatible with Memory 245760 for Fargate", + "message": "Fargate requires Memory to be specified", "source": "CFN_LINT", "entity": { - "logicalId": "ThirtyTwoVcpuUnsupportedTwoFortyGb", + "logicalId": "FargateMissingAll", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Cpu", - "suggestedFix": "Use a valid Fargate CPU/memory combination (e.g., Cpu: 256 with Memory: 512, 1024, or 2048)", + "propertyPath": "Properties", + "suggestedFix": "Set Memory to a valid Fargate value", "category": "Resource", - "startLine": 50, - "startColumn": 7, - "endLine": 50, - "endColumn": 10, - "ruleDescription": "Validate ECS Fargate tasks have the right combination of CPU and memory", - "phase": "LINT", - "context": { - "extra": { - "cpu": 32768, - "memory": 245760 - } - } + "startLine": 10, + "startColumn": 5, + "endLine": 10, + "endColumn": 15, + "ruleDescription": "Validate ECS Fargate tasks have required properties and values", + "phase": "LINT" }, { - "ruleId": "E3047", + "ruleId": "E3048", "severity": "ERROR", - "message": "Cpu '3 vCPU' is not compatible with Memory '4 GB' for Fargate", + "message": "Fargate requires NetworkMode to be specified as 'awsvpc'", "source": "CFN_LINT", "entity": { - "logicalId": "MalformedCpuUnits", + "logicalId": "FargateMissingAll", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Cpu", - "suggestedFix": "Use a valid Fargate CPU/memory combination (e.g., Cpu: 256 with Memory: 512, 1024, or 2048)", + "propertyPath": "Properties", + "suggestedFix": "Set NetworkMode to 'awsvpc'", "category": "Resource", - "startLine": 63, - "startColumn": 7, - "endLine": 63, - "endColumn": 10, - "ruleDescription": "Validate ECS Fargate tasks have the right combination of CPU and memory", - "phase": "LINT", - "context": { - "extra": { - "cpu": "3 vCPU", - "memory": "4 GB" - } - } + "startLine": 10, + "startColumn": 5, + "endLine": 10, + "endColumn": 15, + "ruleDescription": "Validate ECS Fargate tasks have required properties and values", + "phase": "LINT" }, { - "ruleId": "E3047", + "ruleId": "E3048", "severity": "ERROR", - "message": "Cpu '0512' is not compatible with Memory '1 GB' for Fargate", + "message": "Fargate requires NetworkMode 'awsvpc', got 'bridge'", "source": "CFN_LINT", "entity": { - "logicalId": "NonCanonicalCpuUnits", + "logicalId": "FargateWrongNetworkMode", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Cpu", - "suggestedFix": "Use a valid Fargate CPU/memory combination (e.g., Cpu: 256 with Memory: 512, 1024, or 2048)", + "propertyPath": "Properties.NetworkMode", + "suggestedFix": "Set NetworkMode to 'awsvpc'", "category": "Resource", - "startLine": 76, + "startLine": 26, "startColumn": 7, - "endLine": 76, - "endColumn": 10, - "ruleDescription": "Validate ECS Fargate tasks have the right combination of CPU and memory", - "phase": "LINT", - "context": { - "extra": { - "cpu": "0512", - "memory": "1 GB" - } - } + "endLine": 26, + "endColumn": 18, + "ruleDescription": "Validate ECS Fargate tasks have required properties and values", + "phase": "LINT" }, { - "ruleId": "E3047", + "ruleId": "E3048", "severity": "ERROR", - "message": "Cpu '8192' is not compatible with Memory '9223372036854775807 GB' for Fargate", + "message": "Fargate Cpu value '128' is not valid. Valid sizes are ['256', '512', '1024', '2048', '4096', '8192', '16384', '32768'] CPU units or ['0.25', '0.5', '1', '2', '4', '8', '16', '32'] vCPU.", "source": "CFN_LINT", "entity": { - "logicalId": "OverflowingMemoryUnits", + "logicalId": "FargateInvalidCpu", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Cpu", - "suggestedFix": "Use a valid Fargate CPU/memory combination (e.g., Cpu: 256 with Memory: 512, 1024, or 2048)", + "suggestedFix": "Use a valid Fargate Cpu size in CPU units or vCPU", "category": "Resource", - "startLine": 89, + "startLine": 42, "startColumn": 7, - "endLine": 89, + "endLine": 42, "endColumn": 10, - "ruleDescription": "Validate ECS Fargate tasks have the right combination of CPU and memory", - "phase": "LINT", - "context": { - "extra": { - "cpu": "8192", - "memory": "9223372036854775807 GB" - } - } + "ruleDescription": "Validate ECS Fargate tasks have required properties and values", + "phase": "LINT" }, { - "ruleId": "E3047", + "ruleId": "E3048", "severity": "ERROR", - "message": "Cpu '512' is not compatible with Memory '512' for Fargate", + "message": "Fargate does not support PlacementConstraints", "source": "CFN_LINT", "entity": { - "logicalId": "CpuInvalidThenValid", + "logicalId": "FargatePlacementConstraints", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Cpu", - "suggestedFix": "Use a valid Fargate CPU/memory combination (e.g., Cpu: 256 with Memory: 512, 1024, or 2048)", + "propertyPath": "Properties.PlacementConstraints", + "suggestedFix": "Remove PlacementConstraints for Fargate tasks", "category": "Resource", - "startLine": 102, + "startLine": 59, "startColumn": 7, - "endLine": 102, - "endColumn": 10, - "ruleDescription": "Validate ECS Fargate tasks have the right combination of CPU and memory", - "phase": "LINT", - "context": { - "extra": { - "cpu": "512", - "memory": "512" - } - } + "endLine": 59, + "endColumn": 27, + "ruleDescription": "Validate ECS Fargate tasks have required properties and values", + "phase": "LINT" }, { - "ruleId": "E3047", + "ruleId": "E3048", "severity": "ERROR", - "message": "Cpu '512' is not compatible with Memory '512' for Fargate", + "message": "Fargate does not support log driver 'syslog'. Supported drivers: ['awslogs', 'splunk', 'awsfirelens']", "source": "CFN_LINT", "entity": { - "logicalId": "CpuValidThenInvalid", + "logicalId": "FargateUnsupportedLogDriver", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Cpu", - "suggestedFix": "Use a valid Fargate CPU/memory combination (e.g., Cpu: 256 with Memory: 512, 1024, or 2048)", + "propertyPath": "Properties.ContainerDefinitions.0.LogConfiguration.LogDriver", + "suggestedFix": "Use 'awslogs', 'splunk', or 'awsfirelens'", "category": "Resource", - "startLine": 115, - "startColumn": 7, - "endLine": 115, - "endColumn": 10, - "ruleDescription": "Validate ECS Fargate tasks have the right combination of CPU and memory", - "phase": "LINT", - "context": { - "extra": { - "cpu": "256", - "memory": "512" - } - } + "startLine": 82, + "startColumn": 13, + "endLine": 82, + "endColumn": 22, + "ruleDescription": "Validate ECS Fargate tasks have required properties and values", + "phase": "LINT" + }, + { + "ruleId": "E3048", + "severity": "ERROR", + "message": "Fargate requires Cpu to be specified", + "source": "CFN_LINT", + "entity": { + "logicalId": "FargateNullCpu", + "entityType": "Resource", + "resourceType": "AWS::ECS::TaskDefinition" + }, + "propertyPath": "Properties", + "suggestedFix": "Set Cpu to a valid Fargate value (256, 512, 1024, 2048, 4096, 8192, 16384, or 32768)", + "category": "Resource", + "startLine": 87, + "startColumn": 5, + "endLine": 87, + "endColumn": 15, + "ruleDescription": "Validate ECS Fargate tasks have required properties and values", + "phase": "LINT" + }, + { + "ruleId": "E3048", + "severity": "ERROR", + "message": "Fargate requires NetworkMode to be specified as 'awsvpc'", + "source": "CFN_LINT", + "entity": { + "logicalId": "FargateConditionalNetworkMode", + "entityType": "Resource", + "resourceType": "AWS::ECS::TaskDefinition" + }, + "propertyPath": "Properties", + "suggestedFix": "Set NetworkMode to 'awsvpc'", + "category": "Resource", + "startLine": 119, + "startColumn": 5, + "endLine": 119, + "endColumn": 15, + "ruleDescription": "Validate ECS Fargate tasks have required properties and values", + "phase": "LINT" + }, + { + "ruleId": "E3048", + "severity": "ERROR", + "message": "Fargate requires Cpu to be specified", + "source": "CFN_LINT", + "entity": { + "logicalId": "FargateConditionalCpu", + "entityType": "Resource", + "resourceType": "AWS::ECS::TaskDefinition" + }, + "propertyPath": "Properties", + "suggestedFix": "Set Cpu to a valid Fargate value (256, 512, 1024, 2048, 4096, 8192, 16384, or 32768)", + "category": "Resource", + "startLine": 133, + "startColumn": 5, + "endLine": 133, + "endColumn": 15, + "ruleDescription": "Validate ECS Fargate tasks have required properties and values", + "phase": "LINT" + }, + { + "ruleId": "E3048", + "severity": "ERROR", + "message": "Fargate requires Memory to be specified", + "source": "CFN_LINT", + "entity": { + "logicalId": "FargateConditionalMemory", + "entityType": "Resource", + "resourceType": "AWS::ECS::TaskDefinition" + }, + "propertyPath": "Properties", + "suggestedFix": "Set Memory to a valid Fargate value", + "category": "Resource", + "startLine": 147, + "startColumn": 5, + "endLine": 147, + "endColumn": 15, + "ruleDescription": "Validate ECS Fargate tasks have required properties and values", + "phase": "LINT" }, { "ruleId": "E3048", @@ -85016,16 +83942,16 @@ "message": "Fargate Cpu value '3 vCPU' is not valid. Valid sizes are ['256', '512', '1024', '2048', '4096', '8192', '16384', '32768'] CPU units or ['0.25', '0.5', '1', '2', '4', '8', '16', '32'] vCPU.", "source": "CFN_LINT", "entity": { - "logicalId": "MalformedCpuUnits", + "logicalId": "FargateConditionalInvalidCpu", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Cpu", "suggestedFix": "Use a valid Fargate Cpu size in CPU units or vCPU", "category": "Resource", - "startLine": 63, + "startLine": 165, "startColumn": 7, - "endLine": 63, + "endLine": 165, "endColumn": 10, "ruleDescription": "Validate ECS Fargate tasks have required properties and values", "phase": "LINT" @@ -85033,102 +83959,131 @@ { "ruleId": "E3048", "severity": "ERROR", - "message": "Fargate Cpu value '0512' is not valid. Valid sizes are ['256', '512', '1024', '2048', '4096', '8192', '16384', '32768'] CPU units or ['0.25', '0.5', '1', '2', '4', '8', '16', '32'] vCPU.", + "message": "Fargate does not support PlacementConstraints", "source": "CFN_LINT", "entity": { - "logicalId": "NonCanonicalCpuUnits", + "logicalId": "FargateConditionalPlacementConstraints", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Cpu", - "suggestedFix": "Use a valid Fargate Cpu size in CPU units or vCPU", + "propertyPath": "Properties.PlacementConstraints", + "suggestedFix": "Remove PlacementConstraints for Fargate tasks", "category": "Resource", - "startLine": 76, + "startLine": 181, "startColumn": 7, - "endLine": 76, - "endColumn": 10, + "endLine": 181, + "endColumn": 27, "ruleDescription": "Validate ECS Fargate tasks have required properties and values", "phase": "LINT" }, { - "ruleId": "W9003", - "severity": "WARN", - "message": "16384 is not of type 'string' - automatically coerced (number to string)", + "ruleId": "E3048", + "severity": "ERROR", + "message": "Fargate requires NetworkMode to be specified as 'awsvpc'", "source": "CFN_LINT", "entity": { - "logicalId": "SixteenVcpuInvalidStep", + "logicalId": "ConditionalFargateThenEc2MissingNetworkMode", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Cpu", - "category": "Best Practice", - "startLine": 24, - "startColumn": 7, - "endLine": 24, - "endColumn": 10, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Property type coercion warning", - "phase": "SCHEMA" + "propertyPath": "Properties", + "suggestedFix": "Set NetworkMode to 'awsvpc'", + "category": "Resource", + "startLine": 191, + "startColumn": 5, + "endLine": 191, + "endColumn": 15, + "ruleDescription": "Validate ECS Fargate tasks have required properties and values", + "phase": "LINT" }, { - "ruleId": "W9003", - "severity": "WARN", - "message": "36864 is not of type 'string' - automatically coerced (number to string)", + "ruleId": "E3048", + "severity": "ERROR", + "message": "Fargate requires NetworkMode to be specified as 'awsvpc'", "source": "CFN_LINT", "entity": { - "logicalId": "SixteenVcpuInvalidStep", + "logicalId": "ConditionalEc2ThenFargateMissingNetworkMode", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Memory", + "propertyPath": "Properties", + "suggestedFix": "Set NetworkMode to 'awsvpc'", + "category": "Resource", + "startLine": 202, + "startColumn": 5, + "endLine": 202, + "endColumn": 15, + "ruleDescription": "Validate ECS Fargate tasks have required properties and values", + "phase": "LINT" + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Family' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "FargateMissingAll", + "entityType": "Resource", + "resourceType": "AWS::ECS::TaskDefinition" + }, + "propertyPath": "Properties.Family", "category": "Best Practice", - "startLine": 25, + "startLine": 11, "startColumn": 7, - "endLine": 25, + "endLine": 11, "endColumn": 13, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Property type coercion warning", - "phase": "SCHEMA" + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W9003", - "severity": "WARN", - "message": "32768 is not of type 'string' - automatically coerced (number to string)", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ThirtyTwoVcpuUnsupportedTwoFortyGb", + "logicalId": "FargateMissingAll", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Cpu", + "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 50, + "startLine": 12, "startColumn": 7, - "endLine": 50, - "endColumn": 10, + "endLine": 12, + "endColumn": 30, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Property type coercion warning", - "phase": "SCHEMA" + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W9003", - "severity": "WARN", - "message": "245760 is not of type 'string' - automatically coerced (number to string)", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ThirtyTwoVcpuUnsupportedTwoFortyGb", + "logicalId": "FargateMissingAll", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Memory", + "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 51, + "startLine": 14, "startColumn": 7, - "endLine": 51, - "endColumn": 13, + "endLine": 14, + "endColumn": 27, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Property type coercion warning", - "phase": "SCHEMA" + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { "ruleId": "I9001", @@ -85136,15 +84091,15 @@ "message": "Property 'Family' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "EightVcpuInvalidStep", + "logicalId": "FargateWrongNetworkMode", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Family", "category": "Best Practice", - "startLine": 8, + "startLine": 23, "startColumn": 7, - "endLine": 8, + "endLine": 23, "endColumn": 13, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -85159,15 +84114,15 @@ "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "EightVcpuInvalidStep", + "logicalId": "FargateWrongNetworkMode", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 9, + "startLine": 24, "startColumn": 7, - "endLine": 9, + "endLine": 24, "endColumn": 30, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -85182,15 +84137,15 @@ "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "EightVcpuInvalidStep", + "logicalId": "FargateWrongNetworkMode", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 10, + "startLine": 26, "startColumn": 7, - "endLine": 10, + "endLine": 26, "endColumn": 18, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -85205,15 +84160,15 @@ "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "EightVcpuInvalidStep", + "logicalId": "FargateWrongNetworkMode", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Cpu", "category": "Best Practice", - "startLine": 11, + "startLine": 27, "startColumn": 7, - "endLine": 11, + "endLine": 27, "endColumn": 10, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -85228,15 +84183,15 @@ "message": "Property 'Memory' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "EightVcpuInvalidStep", + "logicalId": "FargateWrongNetworkMode", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Memory", "category": "Best Practice", - "startLine": 12, + "startLine": 28, "startColumn": 7, - "endLine": 12, + "endLine": 28, "endColumn": 13, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -85251,15 +84206,15 @@ "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "EightVcpuInvalidStep", + "logicalId": "FargateWrongNetworkMode", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 13, + "startLine": 29, "startColumn": 7, - "endLine": 13, + "endLine": 29, "endColumn": 27, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -85274,15 +84229,15 @@ "message": "Property 'Family' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SixteenVcpuInvalidStep", + "logicalId": "FargateInvalidCpu", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Family", "category": "Best Practice", - "startLine": 21, + "startLine": 38, "startColumn": 7, - "endLine": 21, + "endLine": 38, "endColumn": 13, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -85297,15 +84252,15 @@ "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SixteenVcpuInvalidStep", + "logicalId": "FargateInvalidCpu", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 22, + "startLine": 39, "startColumn": 7, - "endLine": 22, + "endLine": 39, "endColumn": 30, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -85320,15 +84275,15 @@ "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SixteenVcpuInvalidStep", + "logicalId": "FargateInvalidCpu", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 23, + "startLine": 41, "startColumn": 7, - "endLine": 23, + "endLine": 41, "endColumn": 18, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -85343,15 +84298,15 @@ "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SixteenVcpuInvalidStep", + "logicalId": "FargateInvalidCpu", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Cpu", "category": "Best Practice", - "startLine": 24, + "startLine": 42, "startColumn": 7, - "endLine": 24, + "endLine": 42, "endColumn": 10, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -85366,15 +84321,15 @@ "message": "Property 'Memory' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SixteenVcpuInvalidStep", + "logicalId": "FargateInvalidCpu", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Memory", "category": "Best Practice", - "startLine": 25, + "startLine": 43, "startColumn": 7, - "endLine": 25, + "endLine": 43, "endColumn": 13, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -85389,15 +84344,15 @@ "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SixteenVcpuInvalidStep", + "logicalId": "FargateInvalidCpu", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 26, + "startLine": 44, "startColumn": 7, - "endLine": 26, + "endLine": 44, "endColumn": 27, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -85412,15 +84367,15 @@ "message": "Property 'Family' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ThirtyTwoVcpuUnsupportedSixtyFourGb", + "logicalId": "FargatePlacementConstraints", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Family", "category": "Best Practice", - "startLine": 34, + "startLine": 53, "startColumn": 7, - "endLine": 34, + "endLine": 53, "endColumn": 13, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -85435,15 +84390,15 @@ "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ThirtyTwoVcpuUnsupportedSixtyFourGb", + "logicalId": "FargatePlacementConstraints", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 35, + "startLine": 54, "startColumn": 7, - "endLine": 35, + "endLine": 54, "endColumn": 30, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -85458,15 +84413,15 @@ "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ThirtyTwoVcpuUnsupportedSixtyFourGb", + "logicalId": "FargatePlacementConstraints", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 36, + "startLine": 56, "startColumn": 7, - "endLine": 36, + "endLine": 56, "endColumn": 18, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -85481,15 +84436,15 @@ "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ThirtyTwoVcpuUnsupportedSixtyFourGb", + "logicalId": "FargatePlacementConstraints", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Cpu", "category": "Best Practice", - "startLine": 37, + "startLine": 57, "startColumn": 7, - "endLine": 37, + "endLine": 57, "endColumn": 10, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -85504,15 +84459,15 @@ "message": "Property 'Memory' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ThirtyTwoVcpuUnsupportedSixtyFourGb", + "logicalId": "FargatePlacementConstraints", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Memory", "category": "Best Practice", - "startLine": 38, + "startLine": 58, "startColumn": 7, - "endLine": 38, + "endLine": 58, "endColumn": 13, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -85521,21 +84476,44 @@ "lifecycle": "create-only" } }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'PlacementConstraints' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "FargatePlacementConstraints", + "entityType": "Resource", + "resourceType": "AWS::ECS::TaskDefinition" + }, + "propertyPath": "Properties.PlacementConstraints", + "category": "Best Practice", + "startLine": 59, + "startColumn": 7, + "endLine": 59, + "endColumn": 27, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, { "ruleId": "I9001", "severity": "INFO", "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ThirtyTwoVcpuUnsupportedSixtyFourGb", + "logicalId": "FargatePlacementConstraints", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 39, + "startLine": 62, "startColumn": 7, - "endLine": 39, + "endLine": 62, "endColumn": 27, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -85550,15 +84528,15 @@ "message": "Property 'Family' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ThirtyTwoVcpuUnsupportedTwoFortyGb", + "logicalId": "FargateUnsupportedLogDriver", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Family", "category": "Best Practice", - "startLine": 47, + "startLine": 71, "startColumn": 7, - "endLine": 47, + "endLine": 71, "endColumn": 13, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -85573,15 +84551,15 @@ "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ThirtyTwoVcpuUnsupportedTwoFortyGb", + "logicalId": "FargateUnsupportedLogDriver", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 48, + "startLine": 72, "startColumn": 7, - "endLine": 48, + "endLine": 72, "endColumn": 30, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -85596,15 +84574,15 @@ "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ThirtyTwoVcpuUnsupportedTwoFortyGb", + "logicalId": "FargateUnsupportedLogDriver", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 49, + "startLine": 74, "startColumn": 7, - "endLine": 49, + "endLine": 74, "endColumn": 18, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -85619,15 +84597,15 @@ "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ThirtyTwoVcpuUnsupportedTwoFortyGb", + "logicalId": "FargateUnsupportedLogDriver", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Cpu", "category": "Best Practice", - "startLine": 50, + "startLine": 75, "startColumn": 7, - "endLine": 50, + "endLine": 75, "endColumn": 10, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -85642,15 +84620,15 @@ "message": "Property 'Memory' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ThirtyTwoVcpuUnsupportedTwoFortyGb", + "logicalId": "FargateUnsupportedLogDriver", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Memory", "category": "Best Practice", - "startLine": 51, + "startLine": 76, "startColumn": 7, - "endLine": 51, + "endLine": 76, "endColumn": 13, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -85665,15 +84643,15 @@ "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ThirtyTwoVcpuUnsupportedTwoFortyGb", + "logicalId": "FargateUnsupportedLogDriver", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 52, + "startLine": 77, "startColumn": 7, - "endLine": 52, + "endLine": 77, "endColumn": 27, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -85688,15 +84666,15 @@ "message": "Property 'Family' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MalformedCpuUnits", + "logicalId": "FargateNullCpu", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Family", "category": "Best Practice", - "startLine": 60, + "startLine": 88, "startColumn": 7, - "endLine": 60, + "endLine": 88, "endColumn": 13, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -85711,15 +84689,15 @@ "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MalformedCpuUnits", + "logicalId": "FargateNullCpu", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 61, + "startLine": 89, "startColumn": 7, - "endLine": 61, + "endLine": 89, "endColumn": 30, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -85734,15 +84712,15 @@ "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MalformedCpuUnits", + "logicalId": "FargateNullCpu", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 62, + "startLine": 91, "startColumn": 7, - "endLine": 62, + "endLine": 91, "endColumn": 18, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -85757,21 +84735,22 @@ "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MalformedCpuUnits", + "logicalId": "FargateNullCpu", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Cpu", "category": "Best Practice", - "startLine": 63, + "startLine": 92, "startColumn": 7, - "endLine": 63, + "endLine": 92, "endColumn": 10, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "Fn::If on condition 'UseConstraints'" } }, { @@ -85780,15 +84759,15 @@ "message": "Property 'Memory' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MalformedCpuUnits", + "logicalId": "FargateNullCpu", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Memory", "category": "Best Practice", - "startLine": 64, + "startLine": 93, "startColumn": 7, - "endLine": 64, + "endLine": 93, "endColumn": 13, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -85803,15 +84782,15 @@ "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MalformedCpuUnits", + "logicalId": "FargateNullCpu", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 65, + "startLine": 94, "startColumn": 7, - "endLine": 65, + "endLine": 94, "endColumn": 27, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -85826,15 +84805,15 @@ "message": "Property 'Family' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "NonCanonicalCpuUnits", + "logicalId": "FargateNullPC", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Family", "category": "Best Practice", - "startLine": 73, + "startLine": 103, "startColumn": 7, - "endLine": 73, + "endLine": 103, "endColumn": 13, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -85849,15 +84828,15 @@ "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "NonCanonicalCpuUnits", + "logicalId": "FargateNullPC", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 74, + "startLine": 104, "startColumn": 7, - "endLine": 74, + "endLine": 104, "endColumn": 30, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -85872,15 +84851,15 @@ "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "NonCanonicalCpuUnits", + "logicalId": "FargateNullPC", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 75, + "startLine": 106, "startColumn": 7, - "endLine": 75, + "endLine": 106, "endColumn": 18, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -85895,15 +84874,15 @@ "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "NonCanonicalCpuUnits", + "logicalId": "FargateNullPC", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Cpu", "category": "Best Practice", - "startLine": 76, + "startLine": 107, "startColumn": 7, - "endLine": 76, + "endLine": 107, "endColumn": 10, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -85918,15 +84897,15 @@ "message": "Property 'Memory' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "NonCanonicalCpuUnits", + "logicalId": "FargateNullPC", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Memory", "category": "Best Practice", - "startLine": 77, + "startLine": 108, "startColumn": 7, - "endLine": 77, + "endLine": 108, "endColumn": 13, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -85935,21 +84914,45 @@ "lifecycle": "create-only" } }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'PlacementConstraints' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "FargateNullPC", + "entityType": "Resource", + "resourceType": "AWS::ECS::TaskDefinition" + }, + "propertyPath": "Properties.PlacementConstraints", + "category": "Best Practice", + "startLine": 109, + "startColumn": 7, + "endLine": 109, + "endColumn": 27, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Fn::If on condition 'UseConstraints'" + } + }, { "ruleId": "I9001", "severity": "INFO", "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "NonCanonicalCpuUnits", + "logicalId": "FargateNullPC", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 78, + "startLine": 110, "startColumn": 7, - "endLine": 78, + "endLine": 110, "endColumn": 27, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -85964,15 +84967,15 @@ "message": "Property 'Family' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "OverflowingMemoryUnits", + "logicalId": "FargateConditionalNetworkMode", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Family", "category": "Best Practice", - "startLine": 86, + "startLine": 120, "startColumn": 7, - "endLine": 86, + "endLine": 120, "endColumn": 13, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -85987,15 +84990,15 @@ "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "OverflowingMemoryUnits", + "logicalId": "FargateConditionalNetworkMode", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 87, + "startLine": 121, "startColumn": 7, - "endLine": 87, + "endLine": 121, "endColumn": 30, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -86010,21 +85013,22 @@ "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "OverflowingMemoryUnits", + "logicalId": "FargateConditionalNetworkMode", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 88, + "startLine": 122, "startColumn": 7, - "endLine": 88, + "endLine": 122, "endColumn": 18, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "Fn::If on condition 'UseConstraints'" } }, { @@ -86033,15 +85037,15 @@ "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "OverflowingMemoryUnits", + "logicalId": "FargateConditionalNetworkMode", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Cpu", "category": "Best Practice", - "startLine": 89, + "startLine": 123, "startColumn": 7, - "endLine": 89, + "endLine": 123, "endColumn": 10, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -86056,15 +85060,15 @@ "message": "Property 'Memory' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "OverflowingMemoryUnits", + "logicalId": "FargateConditionalNetworkMode", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Memory", "category": "Best Practice", - "startLine": 90, + "startLine": 124, "startColumn": 7, - "endLine": 90, + "endLine": 124, "endColumn": 13, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -86079,15 +85083,15 @@ "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "OverflowingMemoryUnits", + "logicalId": "FargateConditionalNetworkMode", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 91, + "startLine": 125, "startColumn": 7, - "endLine": 91, + "endLine": 125, "endColumn": 27, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -86102,15 +85106,15 @@ "message": "Property 'Family' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "CpuInvalidThenValid", + "logicalId": "FargateConditionalCpu", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Family", "category": "Best Practice", - "startLine": 99, + "startLine": 134, "startColumn": 7, - "endLine": 99, + "endLine": 134, "endColumn": 13, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -86125,15 +85129,15 @@ "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "CpuInvalidThenValid", + "logicalId": "FargateConditionalCpu", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 100, + "startLine": 135, "startColumn": 7, - "endLine": 100, + "endLine": 135, "endColumn": 30, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -86148,15 +85152,15 @@ "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "CpuInvalidThenValid", + "logicalId": "FargateConditionalCpu", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 101, + "startLine": 136, "startColumn": 7, - "endLine": 101, + "endLine": 136, "endColumn": 18, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -86171,22 +85175,22 @@ "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "CpuInvalidThenValid", + "logicalId": "FargateConditionalCpu", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Cpu", "category": "Best Practice", - "startLine": 102, + "startLine": 137, "startColumn": 7, - "endLine": 102, + "endLine": 137, "endColumn": 10, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "Fn::If on condition 'UseFirst'" + "resolutionSource": "Fn::If on condition 'UseConstraints'" } }, { @@ -86195,15 +85199,15 @@ "message": "Property 'Memory' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "CpuInvalidThenValid", + "logicalId": "FargateConditionalCpu", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Memory", "category": "Best Practice", - "startLine": 103, + "startLine": 138, "startColumn": 7, - "endLine": 103, + "endLine": 138, "endColumn": 13, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -86218,15 +85222,15 @@ "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "CpuInvalidThenValid", + "logicalId": "FargateConditionalCpu", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 104, + "startLine": 139, "startColumn": 7, - "endLine": 104, + "endLine": 139, "endColumn": 27, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -86241,15 +85245,15 @@ "message": "Property 'Family' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "CpuValidThenInvalid", + "logicalId": "FargateConditionalMemory", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Family", "category": "Best Practice", - "startLine": 112, + "startLine": 148, "startColumn": 7, - "endLine": 112, + "endLine": 148, "endColumn": 13, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -86264,15 +85268,15 @@ "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "CpuValidThenInvalid", + "logicalId": "FargateConditionalMemory", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 113, + "startLine": 149, "startColumn": 7, - "endLine": 113, + "endLine": 149, "endColumn": 30, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -86287,15 +85291,15 @@ "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "CpuValidThenInvalid", + "logicalId": "FargateConditionalMemory", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 114, + "startLine": 150, "startColumn": 7, - "endLine": 114, + "endLine": 150, "endColumn": 18, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -86310,22 +85314,21 @@ "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "CpuValidThenInvalid", + "logicalId": "FargateConditionalMemory", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Cpu", "category": "Best Practice", - "startLine": 115, + "startLine": 151, "startColumn": 7, - "endLine": 115, + "endLine": 151, "endColumn": 10, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Fn::If on condition 'UseFirst'" + "lifecycle": "create-only" } }, { @@ -86334,21 +85337,22 @@ "message": "Property 'Memory' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "CpuValidThenInvalid", + "logicalId": "FargateConditionalMemory", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Memory", "category": "Best Practice", - "startLine": 116, + "startLine": 152, "startColumn": 7, - "endLine": 116, + "endLine": 152, "endColumn": 13, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "Fn::If on condition 'UseConstraints'" } }, { @@ -86357,484 +85361,458 @@ "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "CpuValidThenInvalid", + "logicalId": "FargateConditionalMemory", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 117, + "startLine": 153, "startColumn": 7, - "endLine": 117, + "endLine": 153, "endColumn": 27, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'EightVcpuInvalidStep' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "EightVcpuInvalidStep", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 7, - "startColumn": 5, - "endLine": 7, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'SixteenVcpuInvalidStep' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "SixteenVcpuInvalidStep", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 20, - "startColumn": 5, - "endLine": 20, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'ThirtyTwoVcpuUnsupportedSixtyFourGb' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "ThirtyTwoVcpuUnsupportedSixtyFourGb", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 33, - "startColumn": 5, - "endLine": 33, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'ThirtyTwoVcpuUnsupportedTwoFortyGb' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "ThirtyTwoVcpuUnsupportedTwoFortyGb", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 46, - "startColumn": 5, - "endLine": 46, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'MalformedCpuUnits' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", + "message": "Property 'Family' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MalformedCpuUnits", + "logicalId": "FargateConditionalInvalidCpu", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.Family", "category": "Best Practice", - "startLine": 59, - "startColumn": 5, - "endLine": 59, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 162, + "startColumn": 7, + "endLine": 162, + "endColumn": 13, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'NonCanonicalCpuUnits' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", + "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "NonCanonicalCpuUnits", + "logicalId": "FargateConditionalInvalidCpu", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 72, - "startColumn": 5, - "endLine": 72, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 163, + "startColumn": 7, + "endLine": 163, + "endColumn": 30, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'OverflowingMemoryUnits' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", + "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "OverflowingMemoryUnits", + "logicalId": "FargateConditionalInvalidCpu", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 85, - "startColumn": 5, - "endLine": 85, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 164, + "startColumn": 7, + "endLine": 164, + "endColumn": 18, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'CpuInvalidThenValid' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", + "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "CpuInvalidThenValid", + "logicalId": "FargateConditionalInvalidCpu", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.Cpu", "category": "Best Practice", - "startLine": 98, - "startColumn": 5, - "endLine": 98, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 165, + "startColumn": 7, + "endLine": 165, + "endColumn": 10, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Fn::If on condition 'UseConstraints'" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'CpuValidThenInvalid' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", + "message": "Property 'Memory' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "CpuValidThenInvalid", + "logicalId": "FargateConditionalInvalidCpu", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.Memory", "category": "Best Practice", - "startLine": 111, - "startColumn": 5, - "endLine": 111, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "bad/resources/elasticache/cache_cluster_failover.yaml": { - "filePath": "bad/resources/elasticache/cache_cluster_failover.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 7, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 30, - "debug": 0 + "startLine": 166, + "startColumn": 7, + "endLine": 166, + "endColumn": 13, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "BasicReplicationGroup", + "logicalId": "FargateConditionalInvalidCpu", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::ECS::TaskDefinition" }, + "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 34, - "startColumn": 3, - "endLine": 34, - "endColumn": 24, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 167, + "startColumn": 7, + "endLine": 167, + "endColumn": 27, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'Family' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "BasicReplicationGroup", + "logicalId": "FargateConditionalPlacementConstraints", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::ECS::TaskDefinition" }, + "propertyPath": "Properties.Family", "category": "Best Practice", - "startLine": 34, - "startColumn": 3, - "endLine": 34, - "endColumn": 24, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 176, + "startColumn": 7, + "endLine": 176, + "endColumn": 13, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "SecondReplicationGroup", + "logicalId": "FargateConditionalPlacementConstraints", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::ECS::TaskDefinition" }, + "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 53, - "startColumn": 3, - "endLine": 53, - "endColumn": 25, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 177, + "startColumn": 7, + "endLine": 177, + "endColumn": 30, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "SecondReplicationGroup", + "logicalId": "FargateConditionalPlacementConstraints", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::ECS::TaskDefinition" }, + "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 53, - "startColumn": 3, - "endLine": 53, - "endColumn": 25, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 178, + "startColumn": 7, + "endLine": 178, + "endColumn": 18, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ThirdReplicationGroup", + "logicalId": "FargateConditionalPlacementConstraints", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::ECS::TaskDefinition" }, + "propertyPath": "Properties.Cpu", "category": "Best Practice", - "startLine": 72, - "startColumn": 3, - "endLine": 72, - "endColumn": 24, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 179, + "startColumn": 7, + "endLine": 179, + "endColumn": 10, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'Memory' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ThirdReplicationGroup", + "logicalId": "FargateConditionalPlacementConstraints", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::ECS::TaskDefinition" }, + "propertyPath": "Properties.Memory", "category": "Best Practice", - "startLine": 72, - "startColumn": 3, - "endLine": 72, - "endColumn": 24, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 180, + "startColumn": 7, + "endLine": 180, + "endColumn": 13, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'PlacementConstraints' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "FourtReplicationGroup", + "logicalId": "FargateConditionalPlacementConstraints", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::ECS::TaskDefinition" }, + "propertyPath": "Properties.PlacementConstraints", "category": "Best Practice", - "startLine": 89, - "startColumn": 3, - "endLine": 89, - "endColumn": 24, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 181, + "startColumn": 7, + "endLine": 181, + "endColumn": 27, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Fn::If on condition 'UseConstraints'" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "FourtReplicationGroup", + "logicalId": "FargateConditionalPlacementConstraints", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::ECS::TaskDefinition" }, + "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 89, - "startColumn": 3, - "endLine": 89, - "endColumn": 24, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 182, + "startColumn": 7, + "endLine": 182, + "endColumn": 27, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3100", + "ruleId": "I9001", "severity": "INFO", - "message": "Previous generation instance type 'cache.r3.large' - consider upgrading", - "source": "CFN_LINT", + "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "BasicReplicationGroup", + "logicalId": "ConditionalFargateThenEc2MissingNetworkMode", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.CacheNodeType", - "suggestedFix": "Upgrade to a current generation instance type", + "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 40, + "startLine": 192, "startColumn": 7, - "endLine": 40, - "endColumn": 20, - "ruleDescription": "Checks for legacy instance type generations", - "phase": "LINT" + "endLine": 192, + "endColumn": 30, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Fn::If on condition 'UseConstraints'" + } }, { - "ruleId": "I3100", + "ruleId": "I9001", "severity": "INFO", - "message": "Previous generation instance type 'cache.r3.large' - consider upgrading", - "source": "CFN_LINT", + "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "SecondReplicationGroup", + "logicalId": "ConditionalFargateThenEc2MissingNetworkMode", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.CacheNodeType", - "suggestedFix": "Upgrade to a current generation instance type", + "propertyPath": "Properties.Cpu", "category": "Best Practice", - "startLine": 59, + "startLine": 193, "startColumn": 7, - "endLine": 59, - "endColumn": 20, - "ruleDescription": "Checks for legacy instance type generations", - "phase": "LINT" + "endLine": 193, + "endColumn": 10, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3100", + "ruleId": "I9001", "severity": "INFO", - "message": "Previous generation instance type 'cache.r3.large' - consider upgrading", - "source": "CFN_LINT", + "message": "Property 'Memory' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ThirdReplicationGroup", + "logicalId": "ConditionalFargateThenEc2MissingNetworkMode", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.CacheNodeType", - "suggestedFix": "Upgrade to a current generation instance type", + "propertyPath": "Properties.Memory", "category": "Best Practice", - "startLine": 78, + "startLine": 194, "startColumn": 7, - "endLine": 78, - "endColumn": 20, - "ruleDescription": "Checks for legacy instance type generations", - "phase": "LINT" + "endLine": 194, + "endColumn": 13, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3100", + "ruleId": "I9001", "severity": "INFO", - "message": "Previous generation instance type 'cache.r3.large' - consider upgrading", - "source": "CFN_LINT", + "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "FourtReplicationGroup", + "logicalId": "ConditionalFargateThenEc2MissingNetworkMode", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.CacheNodeType", - "suggestedFix": "Upgrade to a current generation instance type", + "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 95, + "startLine": 195, "startColumn": 7, - "endLine": 95, - "endColumn": 20, - "ruleDescription": "Checks for legacy instance type generations", - "phase": "LINT" + "endLine": 195, + "endColumn": 27, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'CacheParameterGroupFamily' is create-only; updating it will cause resource replacement", + "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MyParameterGroup", + "logicalId": "ConditionalEc2ThenFargateMissingNetworkMode", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ParameterGroup" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.CacheParameterGroupFamily", + "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 14, + "startLine": 203, "startColumn": 7, - "endLine": 14, - "endColumn": 32, + "endLine": 203, + "endColumn": 30, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "Fn::If on condition 'UseConstraints'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'CacheParameterGroupFamily' is create-only; updating it will cause resource replacement", + "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MyClusterParameterGroup", + "logicalId": "ConditionalEc2ThenFargateMissingNetworkMode", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ParameterGroup" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.CacheParameterGroupFamily", + "propertyPath": "Properties.Cpu", "category": "Best Practice", - "startLine": 22, + "startLine": 204, "startColumn": 7, - "endLine": 22, - "endColumn": 32, + "endLine": 204, + "endColumn": 10, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -86844,19 +85822,20 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'CacheParameterGroupFamily' is create-only; updating it will cause resource replacement", + "message": "Property 'Memory' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MyNonClusterParameterGroup", + "logicalId": "ConditionalEc2ThenFargateMissingNetworkMode", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ParameterGroup" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.CacheParameterGroupFamily", + "propertyPath": "Properties.Memory", "category": "Best Practice", - "startLine": 30, + "startLine": 205, "startColumn": 7, - "endLine": 30, - "endColumn": 32, + "endLine": 205, + "endColumn": 13, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -86866,20 +85845,20 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'CacheSubnetGroupName' is create-only; updating it will cause resource replacement", + "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "BasicReplicationGroup", + "logicalId": "ConditionalEc2ThenFargateMissingNetworkMode", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.CacheSubnetGroupName", + "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 41, + "startLine": 206, "startColumn": 7, - "endLine": 41, + "endLine": 206, "endColumn": 27, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-elasticache", + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -86887,182 +85866,161 @@ } }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Port' is create-only; updating it will cause resource replacement", + "message": "Resource 'FargateMissingAll' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "BasicReplicationGroup", + "logicalId": "FargateMissingAll", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Port", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 46, - "startColumn": 7, - "endLine": 46, - "endColumn": 11, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-elasticache", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 10, + "startColumn": 5, + "endLine": 10, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'CacheSubnetGroupName' is create-only; updating it will cause resource replacement", + "message": "Resource 'FargateWrongNetworkMode' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "SecondReplicationGroup", + "logicalId": "FargateWrongNetworkMode", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.CacheSubnetGroupName", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 60, - "startColumn": 7, - "endLine": 60, - "endColumn": 27, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-elasticache", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 22, + "startColumn": 5, + "endLine": 22, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Port' is create-only; updating it will cause resource replacement", + "message": "Resource 'FargateInvalidCpu' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "SecondReplicationGroup", + "logicalId": "FargateInvalidCpu", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Port", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 64, - "startColumn": 7, - "endLine": 64, - "endColumn": 11, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-elasticache", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 37, + "startColumn": 5, + "endLine": 37, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'CacheSubnetGroupName' is create-only; updating it will cause resource replacement", + "message": "Resource 'FargatePlacementConstraints' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ThirdReplicationGroup", + "logicalId": "FargatePlacementConstraints", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.CacheSubnetGroupName", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 79, - "startColumn": 7, - "endLine": 79, - "endColumn": 27, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-elasticache", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 52, + "startColumn": 5, + "endLine": 52, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Port' is create-only; updating it will cause resource replacement", + "message": "Resource 'FargateUnsupportedLogDriver' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ThirdReplicationGroup", + "logicalId": "FargateUnsupportedLogDriver", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Port", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 82, - "startColumn": 7, - "endLine": 82, - "endColumn": 11, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-elasticache", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 70, + "startColumn": 5, + "endLine": 70, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'CacheSubnetGroupName' is create-only; updating it will cause resource replacement", + "message": "Resource 'FargateNullCpu' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "FourtReplicationGroup", + "logicalId": "FargateNullCpu", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.CacheSubnetGroupName", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 96, - "startColumn": 7, - "endLine": 96, - "endColumn": 27, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-elasticache", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 87, + "startColumn": 5, + "endLine": 87, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Port' is create-only; updating it will cause resource replacement", + "message": "Resource 'FargateNullPC' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "FourtReplicationGroup", + "logicalId": "FargateNullPC", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Port", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 100, - "startColumn": 7, - "endLine": 100, - "endColumn": 11, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-elasticache", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 102, + "startColumn": 5, + "endLine": 102, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'MyParameterGroup' of type 'AWS::ElastiCache::ParameterGroup' supports Tags but none are configured", + "message": "Resource 'FargateConditionalNetworkMode' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "MyParameterGroup", + "logicalId": "FargateConditionalNetworkMode", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ParameterGroup" + "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 12, + "startLine": 119, "startColumn": 5, - "endLine": 12, + "endLine": 119, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -87070,19 +86028,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'MyClusterParameterGroup' of type 'AWS::ElastiCache::ParameterGroup' supports Tags but none are configured", + "message": "Resource 'FargateConditionalCpu' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "MyClusterParameterGroup", + "logicalId": "FargateConditionalCpu", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ParameterGroup" + "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 20, + "startLine": 133, "startColumn": 5, - "endLine": 20, + "endLine": 133, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -87090,19 +86048,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'MyNonClusterParameterGroup' of type 'AWS::ElastiCache::ParameterGroup' supports Tags but none are configured", + "message": "Resource 'FargateConditionalMemory' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "MyNonClusterParameterGroup", + "logicalId": "FargateConditionalMemory", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ParameterGroup" + "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 28, + "startLine": 147, "startColumn": 5, - "endLine": 28, + "endLine": 147, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -87110,19 +86068,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'BasicReplicationGroup' of type 'AWS::ElastiCache::ReplicationGroup' supports Tags but none are configured", + "message": "Resource 'FargateConditionalInvalidCpu' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "BasicReplicationGroup", + "logicalId": "FargateConditionalInvalidCpu", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 36, + "startLine": 161, "startColumn": 5, - "endLine": 36, + "endLine": 161, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -87130,19 +86088,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'SecondReplicationGroup' of type 'AWS::ElastiCache::ReplicationGroup' supports Tags but none are configured", + "message": "Resource 'FargateConditionalPlacementConstraints' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "SecondReplicationGroup", + "logicalId": "FargateConditionalPlacementConstraints", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 55, + "startLine": 175, "startColumn": 5, - "endLine": 55, + "endLine": 175, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -87150,19 +86108,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'ThirdReplicationGroup' of type 'AWS::ElastiCache::ReplicationGroup' supports Tags but none are configured", + "message": "Resource 'ConditionalFargateThenEc2MissingNetworkMode' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ThirdReplicationGroup", + "logicalId": "ConditionalFargateThenEc2MissingNetworkMode", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 74, + "startLine": 191, "startColumn": 5, - "endLine": 74, + "endLine": 191, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -87170,35 +86128,35 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'FourtReplicationGroup' of type 'AWS::ElastiCache::ReplicationGroup' supports Tags but none are configured", + "message": "Resource 'ConditionalEc2ThenFargateMissingNetworkMode' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "FourtReplicationGroup", + "logicalId": "ConditionalEc2ThenFargateMissingNetworkMode", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 91, + "startLine": 202, "startColumn": 5, - "endLine": 91, + "endLine": 202, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "bad/resources/iam/iam_policy.yaml": { - "filePath": "bad/resources/iam/iam_policy.yaml", + "bad/resources/ecs/fargate_task_sizes_e3047.yaml": { + "filePath": "bad/resources/ecs/fargate_task_sizes_e3047.yaml", "status": "OK", "metadata": { - "resourcesScanned": 4, + "resourcesScanned": 9, "counts": { - "fatal": 4, - "errors": 17, - "warnings": 1, - "informational": 2, + "fatal": 0, + "errors": 11, + "warnings": 4, + "informational": 63, "debug": 0 }, "suppressed": 0, @@ -87207,510 +86165,652 @@ }, "diagnostics": [ { - "ruleId": "F3003", - "severity": "FATAL", - "message": "'PolicyName' is a required property", - "source": "SCHEMA", + "ruleId": "E3047", + "severity": "ERROR", + "message": "Cpu '8 vCPU' is not compatible with Memory '17 GB' for Fargate", + "source": "CFN_LINT", "entity": { - "logicalId": "rIamPolicy", + "logicalId": "EightVcpuInvalidStep", "entityType": "Resource", - "resourceType": "AWS::IAM::Policy" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties", - "suggestedFix": "Add the required property 'PolicyName'", - "category": "Schema", - "startLine": 37, - "startColumn": 5, - "endLine": 37, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", - "ruleDescription": "Required property missing", - "phase": "SCHEMA" + "propertyPath": "Properties.Cpu", + "suggestedFix": "Use a valid Fargate CPU/memory combination (e.g., Cpu: 256 with Memory: 512, 1024, or 2048)", + "category": "Resource", + "startLine": 11, + "startColumn": 7, + "endLine": 11, + "endColumn": 10, + "ruleDescription": "Validate ECS Fargate tasks have the right combination of CPU and memory", + "phase": "LINT", + "context": { + "extra": { + "cpu": "8 vCPU", + "memory": "17 GB" + } + } }, { - "ruleId": "F3012", - "severity": "FATAL", - "message": "[{'__conditional': 'cCondition', '__if_true': {'Statement': {}}, '__if_false': {'Statement': []}}] is not of type 'object'", - "source": "SCHEMA", + "ruleId": "E3047", + "severity": "ERROR", + "message": "Cpu 16384 is not compatible with Memory 36864 for Fargate", + "source": "CFN_LINT", "entity": { - "logicalId": "rIamPolicy", + "logicalId": "SixteenVcpuInvalidStep", "entityType": "Resource", - "resourceType": "AWS::IAM::Policy" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.PolicyDocument", - "category": "Schema", - "startLine": 38, + "propertyPath": "Properties.Cpu", + "suggestedFix": "Use a valid Fargate CPU/memory combination (e.g., Cpu: 256 with Memory: 512, 1024, or 2048)", + "category": "Resource", + "startLine": 24, "startColumn": 7, - "endLine": 38, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", - "ruleDescription": "Property type mismatch", - "phase": "SCHEMA", + "endLine": 24, + "endColumn": 10, + "ruleDescription": "Validate ECS Fargate tasks have the right combination of CPU and memory", + "phase": "LINT", "context": { - "actualValue": [ - { - "Statement": {} - } - ], - "expectedConstraint": "object" + "extra": { + "cpu": 16384, + "memory": 36864 + } } }, { - "ruleId": "F3017", - "severity": "FATAL", - "message": "Value is not valid under any of the 3 anyOf schemas for AWS::IAM::Policy (0 branches matched; at least one is required). Required property combinations: ['Groups'] or ['Roles'] or ['Users']. Branch failures: branch 1: 'Users' is a required property; branch 2: 'Groups' is a required property; branch 3: 'Roles' is a required property.", - "source": "SCHEMA", + "ruleId": "E3047", + "severity": "ERROR", + "message": "Cpu '32 vCPU' is not compatible with Memory '64 GB' for Fargate", + "source": "CFN_LINT", "entity": { - "logicalId": "rIamPolicy", + "logicalId": "ThirtyTwoVcpuUnsupportedSixtyFourGb", "entityType": "Resource", - "resourceType": "AWS::IAM::Policy" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties", - "category": "Schema", + "propertyPath": "Properties.Cpu", + "suggestedFix": "Use a valid Fargate CPU/memory combination (e.g., Cpu: 256 with Memory: 512, 1024, or 2048)", + "category": "Resource", "startLine": 37, - "startColumn": 5, + "startColumn": 7, "endLine": 37, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", - "ruleDescription": "Value not valid under anyOf", - "phase": "SCHEMA", + "endColumn": 10, + "ruleDescription": "Validate ECS Fargate tasks have the right combination of CPU and memory", + "phase": "LINT", "context": { - "expectedConstraint": "at least one anyOf branch", "extra": { - "branchCount": 3, - "branchFailures": [ - { - "branch": 1, - "reasons": [ - { - "message": "'Users' is a required property", - "propertyPath": "Properties" - } - ] - }, - { - "branch": 2, - "reasons": [ - { - "message": "'Groups' is a required property", - "propertyPath": "Properties" - } - ] - }, - { - "branch": 3, - "reasons": [ - { - "message": "'Roles' is a required property", - "propertyPath": "Properties" - } - ] - } - ], - "compositionKind": "anyOf", - "matchCount": 0, - "matchOutcome": "zeroMatches", - "validPropertyCombinations": [ - [ - "Groups" - ], - [ - "Roles" - ], - [ - "Users" - ] - ] + "cpu": "32 vCPU", + "memory": "64 GB" } } }, { - "ruleId": "F3033", - "severity": "FATAL", - "message": "length 91 exceeds maximum 64", - "source": "SCHEMA", + "ruleId": "E3047", + "severity": "ERROR", + "message": "Cpu 32768 is not compatible with Memory 245760 for Fargate", + "source": "CFN_LINT", "entity": { - "logicalId": "rIamRole", + "logicalId": "ThirtyTwoVcpuUnsupportedTwoFortyGb", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.RoleName", - "category": "Schema", - "startLine": 9, + "propertyPath": "Properties.Cpu", + "suggestedFix": "Use a valid Fargate CPU/memory combination (e.g., Cpu: 256 with Memory: 512, 1024, or 2048)", + "category": "Resource", + "startLine": 50, "startColumn": 7, - "endLine": 9, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", - "ruleDescription": "String length out of bounds", - "phase": "SCHEMA", + "endLine": 50, + "endColumn": 10, + "ruleDescription": "Validate ECS Fargate tasks have the right combination of CPU and memory", + "phase": "LINT", "context": { - "actualValue": "jeAoXmadgEUYzfalKtuYjeAoXmadgEUYzfalKtuYjeAoXmadgEUYzfalKtuYjeAoXmadgEUYzfalKtuYBadRoleName", "extra": { - "actual_length": 91, - "max_length": 64, - "min_length": 1 + "cpu": 32768, + "memory": 245760 } } }, { - "ruleId": "E1028", + "ruleId": "E3047", "severity": "ERROR", - "message": "Fn::If condition 'cCondition' does not exist in Conditions section", - "source": "SCHEMA", + "message": "Cpu '3 vCPU' is not compatible with Memory '4 GB' for Fargate", + "source": "CFN_LINT", "entity": { - "logicalId": "rIamPolicy", + "logicalId": "MalformedCpuUnits", "entityType": "Resource", - "resourceType": "AWS::IAM::Policy" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.PolicyDocument.0.Fn::If.0", - "category": "Intrinsic Function", - "startLine": 40, - "startColumn": 11, - "endLine": 40, - "endColumn": 12, - "ruleDescription": "Fn::If condition must exist in Conditions section", - "phase": "PARSE" + "propertyPath": "Properties.Cpu", + "suggestedFix": "Use a valid Fargate CPU/memory combination (e.g., Cpu: 256 with Memory: 512, 1024, or 2048)", + "category": "Resource", + "startLine": 63, + "startColumn": 7, + "endLine": 63, + "endColumn": 10, + "ruleDescription": "Validate ECS Fargate tasks have the right combination of CPU and memory", + "phase": "LINT", + "context": { + "extra": { + "cpu": "3 vCPU", + "memory": "4 GB" + } + } }, { - "ruleId": "E3510", + "ruleId": "E3047", "severity": "ERROR", - "message": "'blah' is not one of ['2008-10-17', '2012-10-17']", + "message": "Cpu '0512' is not compatible with Memory '1 GB' for Fargate", "source": "CFN_LINT", "entity": { - "logicalId": "rIamRole", + "logicalId": "NonCanonicalCpuUnits", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Policies.0.PolicyDocument.Version", + "propertyPath": "Properties.Cpu", + "suggestedFix": "Use a valid Fargate CPU/memory combination (e.g., Cpu: 256 with Memory: 512, 1024, or 2048)", "category": "Resource", - "startLine": 14, - "startColumn": 11, - "endLine": 14, - "endColumn": 18, - "ruleDescription": "Validate identity based IAM policies", - "phase": "LINT" + "startLine": 76, + "startColumn": 7, + "endLine": 76, + "endColumn": 10, + "ruleDescription": "Validate ECS Fargate tasks have the right combination of CPU and memory", + "phase": "LINT", + "context": { + "extra": { + "cpu": "0512", + "memory": "1 GB" + } + } }, { - "ruleId": "E3510", + "ruleId": "E3047", "severity": "ERROR", - "message": "Additional properties are not allowed ('BadProperty' was unexpected)", + "message": "Cpu '8192' is not compatible with Memory '9223372036854775807 GB' for Fargate", "source": "CFN_LINT", "entity": { - "logicalId": "rIamRole", + "logicalId": "OverflowingMemoryUnits", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Policies.0.PolicyDocument.BadProperty", + "propertyPath": "Properties.Cpu", + "suggestedFix": "Use a valid Fargate CPU/memory combination (e.g., Cpu: 256 with Memory: 512, 1024, or 2048)", "category": "Resource", - "startLine": 15, - "startColumn": 11, - "endLine": 15, - "endColumn": 22, - "ruleDescription": "Validate identity based IAM policies", + "startLine": 89, + "startColumn": 7, + "endLine": 89, + "endColumn": 10, + "ruleDescription": "Validate ECS Fargate tasks have the right combination of CPU and memory", + "phase": "LINT", + "context": { + "extra": { + "cpu": "8192", + "memory": "9223372036854775807 GB" + } + } + }, + { + "ruleId": "E3047", + "severity": "ERROR", + "message": "Cpu '512' is not compatible with Memory '512' for Fargate", + "source": "CFN_LINT", + "entity": { + "logicalId": "CpuInvalidThenValid", + "entityType": "Resource", + "resourceType": "AWS::ECS::TaskDefinition" + }, + "propertyPath": "Properties.Cpu", + "suggestedFix": "Use a valid Fargate CPU/memory combination (e.g., Cpu: 256 with Memory: 512, 1024, or 2048)", + "category": "Resource", + "startLine": 102, + "startColumn": 7, + "endLine": 102, + "endColumn": 10, + "ruleDescription": "Validate ECS Fargate tasks have the right combination of CPU and memory", + "phase": "LINT", + "context": { + "extra": { + "cpu": "512", + "memory": "512" + } + } + }, + { + "ruleId": "E3047", + "severity": "ERROR", + "message": "Cpu '512' is not compatible with Memory '512' for Fargate", + "source": "CFN_LINT", + "entity": { + "logicalId": "CpuValidThenInvalid", + "entityType": "Resource", + "resourceType": "AWS::ECS::TaskDefinition" + }, + "propertyPath": "Properties.Cpu", + "suggestedFix": "Use a valid Fargate CPU/memory combination (e.g., Cpu: 256 with Memory: 512, 1024, or 2048)", + "category": "Resource", + "startLine": 115, + "startColumn": 7, + "endLine": 115, + "endColumn": 10, + "ruleDescription": "Validate ECS Fargate tasks have the right combination of CPU and memory", + "phase": "LINT", + "context": { + "extra": { + "cpu": "256", + "memory": "512" + } + } + }, + { + "ruleId": "E3048", + "severity": "ERROR", + "message": "Fargate Cpu value '3 vCPU' is not valid. Valid sizes are ['256', '512', '1024', '2048', '4096', '8192', '16384', '32768'] CPU units or ['0.25', '0.5', '1', '2', '4', '8', '16', '32'] vCPU.", + "source": "CFN_LINT", + "entity": { + "logicalId": "MalformedCpuUnits", + "entityType": "Resource", + "resourceType": "AWS::ECS::TaskDefinition" + }, + "propertyPath": "Properties.Cpu", + "suggestedFix": "Use a valid Fargate Cpu size in CPU units or vCPU", + "category": "Resource", + "startLine": 63, + "startColumn": 7, + "endLine": 63, + "endColumn": 10, + "ruleDescription": "Validate ECS Fargate tasks have required properties and values", "phase": "LINT" }, { - "ruleId": "E3510", + "ruleId": "E3048", "severity": "ERROR", - "message": "'Test' is not of type 'object', 'array'", + "message": "Fargate Cpu value '0512' is not valid. Valid sizes are ['256', '512', '1024', '2048', '4096', '8192', '16384', '32768'] CPU units or ['0.25', '0.5', '1', '2', '4', '8', '16', '32'] vCPU.", "source": "CFN_LINT", "entity": { - "logicalId": "rIamRole", + "logicalId": "NonCanonicalCpuUnits", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Policies.0.PolicyDocument.Statement", + "propertyPath": "Properties.Cpu", + "suggestedFix": "Use a valid Fargate Cpu size in CPU units or vCPU", "category": "Resource", - "startLine": 16, - "startColumn": 11, - "endLine": 16, - "endColumn": 20, - "ruleDescription": "Validate identity based IAM policies", + "startLine": 76, + "startColumn": 7, + "endLine": 76, + "endColumn": 10, + "ruleDescription": "Validate ECS Fargate tasks have required properties and values", "phase": "LINT" }, { - "ruleId": "E3510", - "severity": "ERROR", - "message": "'blah' is not one of ['2008-10-17', '2012-10-17']", + "ruleId": "W9003", + "severity": "WARN", + "message": "16384 is not of type 'string' - automatically coerced (number to string)", + "source": "CFN_LINT", + "entity": { + "logicalId": "SixteenVcpuInvalidStep", + "entityType": "Resource", + "resourceType": "AWS::ECS::TaskDefinition" + }, + "propertyPath": "Properties.Cpu", + "category": "Best Practice", + "startLine": 24, + "startColumn": 7, + "endLine": 24, + "endColumn": 10, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Property type coercion warning", + "phase": "SCHEMA" + }, + { + "ruleId": "W9003", + "severity": "WARN", + "message": "36864 is not of type 'string' - automatically coerced (number to string)", + "source": "CFN_LINT", + "entity": { + "logicalId": "SixteenVcpuInvalidStep", + "entityType": "Resource", + "resourceType": "AWS::ECS::TaskDefinition" + }, + "propertyPath": "Properties.Memory", + "category": "Best Practice", + "startLine": 25, + "startColumn": 7, + "endLine": 25, + "endColumn": 13, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Property type coercion warning", + "phase": "SCHEMA" + }, + { + "ruleId": "W9003", + "severity": "WARN", + "message": "32768 is not of type 'string' - automatically coerced (number to string)", "source": "CFN_LINT", "entity": { - "logicalId": "rIamUser", + "logicalId": "ThirtyTwoVcpuUnsupportedTwoFortyGb", "entityType": "Resource", - "resourceType": "AWS::IAM::ManagedPolicy" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.PolicyDocument.Version", - "category": "Resource", - "startLine": 21, - "startColumn": 9, - "endLine": 21, - "endColumn": 16, - "ruleDescription": "Validate identity based IAM policies", - "phase": "LINT" + "propertyPath": "Properties.Cpu", + "category": "Best Practice", + "startLine": 50, + "startColumn": 7, + "endLine": 50, + "endColumn": 10, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Property type coercion warning", + "phase": "SCHEMA" }, { - "ruleId": "E3510", - "severity": "ERROR", - "message": "Only one of ['Action', 'NotAction'] is a required property", + "ruleId": "W9003", + "severity": "WARN", + "message": "245760 is not of type 'string' - automatically coerced (number to string)", "source": "CFN_LINT", "entity": { - "logicalId": "rIamUser", + "logicalId": "ThirtyTwoVcpuUnsupportedTwoFortyGb", "entityType": "Resource", - "resourceType": "AWS::IAM::ManagedPolicy" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.PolicyDocument.Statement.0", - "category": "Resource", - "startLine": 23, - "startColumn": 19, - "endLine": 23, - "endColumn": 20, - "ruleDescription": "Validate identity based IAM policies", - "phase": "LINT" + "propertyPath": "Properties.Memory", + "category": "Best Practice", + "startLine": 51, + "startColumn": 7, + "endLine": 51, + "endColumn": 13, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Property type coercion warning", + "phase": "SCHEMA" }, { - "ruleId": "E3510", - "severity": "ERROR", - "message": "'NotAllow' is not one of ['Allow', 'Deny']", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Family' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "rIamUser", + "logicalId": "EightVcpuInvalidStep", "entityType": "Resource", - "resourceType": "AWS::IAM::ManagedPolicy" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.PolicyDocument.Statement.0.Effect", - "category": "Resource", - "startLine": 24, - "startColumn": 11, - "endLine": 24, - "endColumn": 17, - "ruleDescription": "Validate identity based IAM policies", - "phase": "LINT" + "propertyPath": "Properties.Family", + "category": "Best Practice", + "startLine": 8, + "startColumn": 7, + "endLine": 8, + "endColumn": 13, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "E3510", - "severity": "ERROR", - "message": "Additional properties are not allowed ('Principal' was unexpected)", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "rIamUser", + "logicalId": "EightVcpuInvalidStep", "entityType": "Resource", - "resourceType": "AWS::IAM::ManagedPolicy" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.PolicyDocument.Statement.0.Principal", - "category": "Resource", - "startLine": 25, - "startColumn": 11, - "endLine": 25, - "endColumn": 20, - "ruleDescription": "Validate identity based IAM policies", - "phase": "LINT" + "propertyPath": "Properties.RequiresCompatibilities", + "category": "Best Practice", + "startLine": 9, + "startColumn": 7, + "endLine": 9, + "endColumn": 30, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "E3510", - "severity": "ERROR", - "message": "{\"Effect\":\"Allow\"} is not of type 'string'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "rIamUser", + "logicalId": "EightVcpuInvalidStep", "entityType": "Resource", - "resourceType": "AWS::IAM::ManagedPolicy" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.PolicyDocument.Statement.1.Resource.0", - "category": "Resource", - "startLine": 30, - "startColumn": 19, - "endLine": 30, - "endColumn": 20, - "ruleDescription": "Validate identity based IAM policies", - "phase": "LINT" + "propertyPath": "Properties.NetworkMode", + "category": "Best Practice", + "startLine": 10, + "startColumn": 7, + "endLine": 10, + "endColumn": 18, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "E3510", - "severity": "ERROR", - "message": "{\"Effect\":\"Allow\",\"Action\":[\"cloudwatch:*\"],\"Resource\":\"*\"} is not of type 'string'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "rIamUser", + "logicalId": "EightVcpuInvalidStep", "entityType": "Resource", - "resourceType": "AWS::IAM::ManagedPolicy" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.PolicyDocument.Statement.1.Resource.1", - "category": "Resource", - "startLine": 31, - "startColumn": 19, - "endLine": 31, - "endColumn": 20, - "ruleDescription": "Validate identity based IAM policies", - "phase": "LINT" + "propertyPath": "Properties.Cpu", + "category": "Best Practice", + "startLine": 11, + "startColumn": 7, + "endLine": 11, + "endColumn": 10, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "E3510", - "severity": "ERROR", - "message": "[{\"Statement\":{}}] is not of type 'object'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Memory' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "rIamPolicy", + "logicalId": "EightVcpuInvalidStep", "entityType": "Resource", - "resourceType": "AWS::IAM::Policy" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.PolicyDocument", - "category": "Resource", - "startLine": 38, + "propertyPath": "Properties.Memory", + "category": "Best Practice", + "startLine": 12, "startColumn": 7, - "endLine": 38, - "endColumn": 21, - "ruleDescription": "Validate identity based IAM policies", - "phase": "LINT" + "endLine": 12, + "endColumn": 13, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "E3510", - "severity": "ERROR", - "message": "Only one of ['Action', 'NotAction'] is a required property", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "rIamPolicyExtraThings", + "logicalId": "EightVcpuInvalidStep", "entityType": "Resource", - "resourceType": "AWS::IAM::Policy" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.PolicyDocument.Statement.0.Action", - "category": "Resource", - "startLine": 54, - "startColumn": 11, - "endLine": 54, - "endColumn": 17, - "ruleDescription": "Validate identity based IAM policies", - "phase": "LINT" + "propertyPath": "Properties.ContainerDefinitions", + "category": "Best Practice", + "startLine": 13, + "startColumn": 7, + "endLine": 13, + "endColumn": 27, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "E3510", - "severity": "ERROR", - "message": "Only one of ['Action', 'NotAction'] is a required property", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Family' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "rIamPolicyExtraThings", + "logicalId": "SixteenVcpuInvalidStep", "entityType": "Resource", - "resourceType": "AWS::IAM::Policy" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.PolicyDocument.Statement.0.NotAction", - "category": "Resource", - "startLine": 56, - "startColumn": 11, - "endLine": 56, - "endColumn": 20, - "ruleDescription": "Validate identity based IAM policies", - "phase": "LINT" + "propertyPath": "Properties.Family", + "category": "Best Practice", + "startLine": 21, + "startColumn": 7, + "endLine": 21, + "endColumn": 13, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "E3510", - "severity": "ERROR", - "message": "Only one of ['Resource', 'NotResource'] is a required property", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "rIamPolicyExtraThings", + "logicalId": "SixteenVcpuInvalidStep", "entityType": "Resource", - "resourceType": "AWS::IAM::Policy" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.PolicyDocument.Statement.0.Resource", - "category": "Resource", - "startLine": 58, - "startColumn": 11, - "endLine": 58, - "endColumn": 19, - "ruleDescription": "Validate identity based IAM policies", - "phase": "LINT" + "propertyPath": "Properties.RequiresCompatibilities", + "category": "Best Practice", + "startLine": 22, + "startColumn": 7, + "endLine": 22, + "endColumn": 30, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "E3510", - "severity": "ERROR", - "message": "Only one of ['Resource', 'NotResource'] is a required property", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "rIamPolicyExtraThings", + "logicalId": "SixteenVcpuInvalidStep", "entityType": "Resource", - "resourceType": "AWS::IAM::Policy" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.PolicyDocument.Statement.0.NotResource", - "category": "Resource", - "startLine": 60, - "startColumn": 11, - "endLine": 60, - "endColumn": 22, - "ruleDescription": "Validate identity based IAM policies", - "phase": "LINT" + "propertyPath": "Properties.NetworkMode", + "category": "Best Practice", + "startLine": 23, + "startColumn": 7, + "endLine": 23, + "endColumn": 18, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "E3510", - "severity": "ERROR", - "message": "'arn' does not match '^(arn:(aws[A-Za-z\\-]*?|[A-Za-z?*\\-]*[?*][A-Za-z?*\\-]*):[^:*?]+:[^:]*(:(?:\\d{12}|\\*|aws)?:.+|)|\\*)$'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "rIamPolicyExtraThings", + "logicalId": "SixteenVcpuInvalidStep", "entityType": "Resource", - "resourceType": "AWS::IAM::Policy" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.PolicyDocument.Statement.0.NotResource.0", - "category": "Resource", - "startLine": 61, - "startColumn": 13, - "endLine": 61, - "endColumn": 14, - "ruleDescription": "Validate identity based IAM policies", - "phase": "LINT" + "propertyPath": "Properties.Cpu", + "category": "Best Practice", + "startLine": 24, + "startColumn": 7, + "endLine": 24, + "endColumn": 10, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "E3530", - "severity": "ERROR", - "message": "'Statement' is a required property", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Memory' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "rIamRole", + "logicalId": "SixteenVcpuInvalidStep", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.AssumeRolePolicyDocument", - "suggestedFix": "Add a Statement array to the AssumeRolePolicyDocument", - "category": "Resource", - "startLine": 10, + "propertyPath": "Properties.Memory", + "category": "Best Practice", + "startLine": 25, "startColumn": 7, - "endLine": 10, - "endColumn": 31, - "ruleDescription": "Validate IAM trust policies", - "phase": "LINT" + "endLine": 25, + "endColumn": 13, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W2512", - "severity": "WARN", - "message": "IAM policy uses NotAction which grants all actions except those listed - consider using Action instead", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "rIamPolicyExtraThings", + "logicalId": "SixteenVcpuInvalidStep", "entityType": "Resource", - "resourceType": "AWS::IAM::Policy" + "resourceType": "AWS::ECS::TaskDefinition" }, - "category": "Security", - "startLine": 43, - "startColumn": 3, - "endLine": 43, - "endColumn": 24, - "ruleDescription": "IAM policy with NotAction", - "phase": "LINT" + "propertyPath": "Properties.ContainerDefinitions", + "category": "Best Practice", + "startLine": 26, + "startColumn": 7, + "endLine": 26, + "endColumn": 27, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'RoleName' is create-only; updating it will cause resource replacement", + "message": "Property 'Family' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "rIamRole", + "logicalId": "ThirtyTwoVcpuUnsupportedSixtyFourGb", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.RoleName", + "propertyPath": "Properties.Family", "category": "Best Practice", - "startLine": 9, + "startLine": 34, "startColumn": 7, - "endLine": 9, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "endLine": 34, + "endColumn": 13, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -87718,625 +86818,528 @@ } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'rIamRole' of type 'AWS::IAM::Role' supports Tags but none are configured", + "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "rIamRole", + "logicalId": "ThirtyTwoVcpuUnsupportedSixtyFourGb", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 8, - "startColumn": 5, - "endLine": 8, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "bad/resources/iam/iam_policy_conditional_policies.yaml": { - "filePath": "bad/resources/iam/iam_policy_conditional_policies.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 3, - "counts": { - "fatal": 0, - "errors": 2, - "warnings": 2, - "informational": 2, - "debug": 0 + "startLine": 35, + "startColumn": 7, + "endLine": 35, + "endColumn": 30, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "E3510", - "severity": "ERROR", - "message": "'not-an-arn' does not match '^(arn:(aws[A-Za-z\\-]*?|[A-Za-z?*\\-]*[?*][A-Za-z?*\\-]*):[^:*?]+:[^:]*(:(?:\\d{12}|\\*|aws)?:.+|)|\\*)$'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "RoleConditionalPolicies", + "logicalId": "ThirtyTwoVcpuUnsupportedSixtyFourGb", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Policies.0.PolicyDocument.Statement.0.Resource", - "category": "Resource", - "startLine": 34, - "startColumn": 19, - "endLine": 34, - "endColumn": 27, - "ruleDescription": "Validate identity based IAM policies", - "phase": "LINT" + "propertyPath": "Properties.NetworkMode", + "category": "Best Practice", + "startLine": 36, + "startColumn": 7, + "endLine": 36, + "endColumn": 18, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "E3510", - "severity": "ERROR", - "message": "'also-bad' does not match '^(arn:(aws[A-Za-z\\-]*?|[A-Za-z?*\\-]*[?*][A-Za-z?*\\-]*):[^:*?]+:[^:]*(:(?:\\d{12}|\\*|aws)?:.+|)|\\*)$'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "RoleConditionalPolicies", + "logicalId": "ThirtyTwoVcpuUnsupportedSixtyFourGb", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Policies.0.PolicyDocument.Statement.0.Resource", - "category": "Resource", - "startLine": 48, - "startColumn": 19, - "endLine": 48, - "endColumn": 27, - "ruleDescription": "Validate identity based IAM policies", - "phase": "LINT" + "propertyPath": "Properties.Cpu", + "category": "Best Practice", + "startLine": 37, + "startColumn": 7, + "endLine": 37, + "endColumn": 10, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W2512", - "severity": "WARN", - "message": "IAM policy uses NotAction which grants all actions except those listed - consider using Action instead", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Memory' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "RoleNotActionConditional", + "logicalId": "ThirtyTwoVcpuUnsupportedSixtyFourGb", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::ECS::TaskDefinition" }, - "category": "Security", - "startLine": 51, - "startColumn": 3, - "endLine": 51, - "endColumn": 27, - "ruleDescription": "IAM policy with NotAction", - "phase": "LINT" + "propertyPath": "Properties.Memory", + "category": "Best Practice", + "startLine": 38, + "startColumn": 7, + "endLine": 38, + "endColumn": 13, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W2512", - "severity": "WARN", - "message": "IAM policy uses NotAction which grants all actions except those listed - consider using Action instead", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "PolicySingleStatement", + "logicalId": "ThirtyTwoVcpuUnsupportedSixtyFourGb", "entityType": "Resource", - "resourceType": "AWS::IAM::ManagedPolicy" + "resourceType": "AWS::ECS::TaskDefinition" }, - "category": "Security", - "startLine": 79, - "startColumn": 3, - "endLine": 79, - "endColumn": 24, - "ruleDescription": "IAM policy with NotAction", - "phase": "LINT" + "propertyPath": "Properties.ContainerDefinitions", + "category": "Best Practice", + "startLine": 39, + "startColumn": 7, + "endLine": 39, + "endColumn": 27, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'RoleConditionalPolicies' of type 'AWS::IAM::Role' supports Tags but none are configured", + "message": "Property 'Family' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "RoleConditionalPolicies", + "logicalId": "ThirtyTwoVcpuUnsupportedTwoFortyGb", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.Family", "category": "Best Practice", - "startLine": 18, - "startColumn": 5, - "endLine": 18, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 47, + "startColumn": 7, + "endLine": 47, + "endColumn": 13, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'RoleNotActionConditional' of type 'AWS::IAM::Role' supports Tags but none are configured", + "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "RoleNotActionConditional", + "logicalId": "ThirtyTwoVcpuUnsupportedTwoFortyGb", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 53, - "startColumn": 5, - "endLine": 53, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "bad/resources/iam/identity_policy_conditional_novalue_e3510.yaml": { - "filePath": "bad/resources/iam/identity_policy_conditional_novalue_e3510.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 0, - "informational": 1, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "E3510", - "severity": "ERROR", - "message": "'SomeOptionalParameter' does not match '^(arn:(aws[A-Za-z\\-]*?|[A-Za-z?*\\-]*[?*][A-Za-z?*\\-]*):[^:*?]+:[^:]*(:(?:\\d{12}|\\*|aws)?:.+|)|\\*)$'", - "source": "CFN_LINT", - "entity": { - "logicalId": "SomeManagedPolicy", - "entityType": "Resource", - "resourceType": "AWS::IAM::ManagedPolicy" - }, - "propertyPath": "Properties.PolicyDocument.Statement.1.Resource.0", - "category": "Resource", - "startLine": 29, - "startColumn": 19, - "endLine": 29, - "endColumn": 20, - "ruleDescription": "Validate identity based IAM policies", - "phase": "LINT" + "startLine": 48, + "startColumn": 7, + "endLine": 48, + "endColumn": 30, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Description' is create-only; updating it will cause resource replacement", + "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SomeManagedPolicy", + "logicalId": "ThirtyTwoVcpuUnsupportedTwoFortyGb", "entityType": "Resource", - "resourceType": "AWS::IAM::ManagedPolicy" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Description", + "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 14, + "startLine": 49, "startColumn": 7, - "endLine": 14, + "endLine": 49, "endColumn": 18, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam", + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only" } - } - ] - }, - "bad/resources/iam/identity_policy_e3510.yaml": { - "filePath": "bad/resources/iam/identity_policy_e3510.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 7, - "counts": { - "fatal": 3, - "errors": 8, - "warnings": 2, - "informational": 9, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "F3017", - "severity": "FATAL", - "message": "Value is not valid under any of the 3 anyOf schemas for AWS::IAM::Policy (0 branches matched; at least one is required). Required property combinations: ['Groups'] or ['Roles'] or ['Users']. Branch failures: branch 1: 'Users' is a required property; branch 2: 'Groups' is a required property; branch 3: 'Roles' is a required property.", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "PolicyEmptyAction", + "logicalId": "ThirtyTwoVcpuUnsupportedTwoFortyGb", "entityType": "Resource", - "resourceType": "AWS::IAM::Policy" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties", - "category": "Schema", - "startLine": 15, - "startColumn": 5, - "endLine": 15, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", - "ruleDescription": "Value not valid under anyOf", + "propertyPath": "Properties.Cpu", + "category": "Best Practice", + "startLine": 50, + "startColumn": 7, + "endLine": 50, + "endColumn": 10, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "expectedConstraint": "at least one anyOf branch", - "extra": { - "branchCount": 3, - "branchFailures": [ - { - "branch": 1, - "reasons": [ - { - "message": "'Users' is a required property", - "propertyPath": "Properties" - } - ] - }, - { - "branch": 2, - "reasons": [ - { - "message": "'Groups' is a required property", - "propertyPath": "Properties" - } - ] - }, - { - "branch": 3, - "reasons": [ - { - "message": "'Roles' is a required property", - "propertyPath": "Properties" - } - ] - } - ], - "compositionKind": "anyOf", - "matchCount": 0, - "matchOutcome": "zeroMatches", - "validPropertyCombinations": [ - [ - "Groups" - ], - [ - "Roles" - ], - [ - "Users" - ] - ] - } + "lifecycle": "create-only" } }, { - "ruleId": "F3017", - "severity": "FATAL", - "message": "Value is not valid under any of the 3 anyOf schemas for AWS::IAM::Policy (0 branches matched; at least one is required). Required property combinations: ['Groups'] or ['Roles'] or ['Users']. Branch failures: branch 1: 'Users' is a required property; branch 2: 'Groups' is a required property; branch 3: 'Roles' is a required property.", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Memory' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "PolicyWithJoinResource", + "logicalId": "ThirtyTwoVcpuUnsupportedTwoFortyGb", "entityType": "Resource", - "resourceType": "AWS::IAM::Policy" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties", - "category": "Schema", - "startLine": 59, - "startColumn": 5, - "endLine": 59, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", - "ruleDescription": "Value not valid under anyOf", + "propertyPath": "Properties.Memory", + "category": "Best Practice", + "startLine": 51, + "startColumn": 7, + "endLine": 51, + "endColumn": 13, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "expectedConstraint": "at least one anyOf branch", - "extra": { - "branchCount": 3, - "branchFailures": [ - { - "branch": 1, - "reasons": [ - { - "message": "'Users' is a required property", - "propertyPath": "Properties" - } - ] - }, - { - "branch": 2, - "reasons": [ - { - "message": "'Groups' is a required property", - "propertyPath": "Properties" - } - ] - }, - { - "branch": 3, - "reasons": [ - { - "message": "'Roles' is a required property", - "propertyPath": "Properties" - } - ] - } - ], - "compositionKind": "anyOf", - "matchCount": 0, - "matchOutcome": "zeroMatches", - "validPropertyCombinations": [ - [ - "Groups" - ], - [ - "Roles" - ], - [ - "Users" - ] - ] - } + "lifecycle": "create-only" } }, { - "ruleId": "F3031", - "severity": "FATAL", - "message": "'arn:aws:sso:::instance/ssoins-12345' does not match pattern 'arn:aws(-[a-z]{1,5}){0,3}:sso:::instance/(sso)?ins-[a-zA-Z0-9-.]{16}'", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "PermissionSetBadPolicy", + "logicalId": "ThirtyTwoVcpuUnsupportedTwoFortyGb", "entityType": "Resource", - "resourceType": "AWS::SSO::PermissionSet" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.InstanceArn", - "category": "Schema", - "startLine": 89, + "propertyPath": "Properties.ContainerDefinitions", + "category": "Best Practice", + "startLine": 52, "startColumn": 7, - "endLine": 89, - "endColumn": 18, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sso/aws-sso-permissionset", - "ruleDescription": "Value does not match pattern", + "endLine": 52, + "endColumn": 27, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "actualValue": "arn:aws:sso:::instance/ssoins-12345", - "expectedConstraint": "arn:aws(-[a-z]{1,5}){0,3}:sso:::instance/(sso)?ins-[a-zA-Z0-9-.]{16}" + "lifecycle": "create-only" } }, { - "ruleId": "E3510", - "severity": "ERROR", - "message": "[] is too short (minimum 1 item)", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Family' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "PolicyEmptyAction", + "logicalId": "MalformedCpuUnits", "entityType": "Resource", - "resourceType": "AWS::IAM::Policy" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.PolicyDocument.Statement.0.Action", - "category": "Resource", - "startLine": 21, - "startColumn": 13, - "endLine": 21, - "endColumn": 19, - "ruleDescription": "Validate identity based IAM policies", - "phase": "LINT" + "propertyPath": "Properties.Family", + "category": "Best Practice", + "startLine": 60, + "startColumn": 7, + "endLine": 60, + "endColumn": 13, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "E3510", - "severity": "ERROR", - "message": "'ReadOnly' is a duplicate of Statement.0.Sid", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "PolicyDuplicateSid", + "logicalId": "MalformedCpuUnits", "entityType": "Resource", - "resourceType": "AWS::IAM::ManagedPolicy" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.PolicyDocument.Statement.1.Sid", - "category": "Resource", - "startLine": 35, - "startColumn": 13, - "endLine": 35, - "endColumn": 16, - "ruleDescription": "Validate identity based IAM policies", - "phase": "LINT" + "propertyPath": "Properties.RequiresCompatibilities", + "category": "Best Practice", + "startLine": 61, + "startColumn": 7, + "endLine": 61, + "endColumn": 30, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "E3510", - "severity": "ERROR", - "message": "Additional properties are not allowed ('Id' was unexpected)", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "PolicyBadIdAndCondition", + "logicalId": "MalformedCpuUnits", "entityType": "Resource", - "resourceType": "AWS::IAM::RolePolicy" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.PolicyDocument.Id", - "category": "Resource", - "startLine": 47, - "startColumn": 9, - "endLine": 47, - "endColumn": 11, - "ruleDescription": "Validate identity based IAM policies", - "phase": "LINT" + "propertyPath": "Properties.NetworkMode", + "category": "Best Practice", + "startLine": 62, + "startColumn": 7, + "endLine": 62, + "endColumn": 18, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "E3510", - "severity": "ERROR", - "message": "'InvalidOp' is not a valid IAM condition operator", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "PolicyBadIdAndCondition", + "logicalId": "MalformedCpuUnits", "entityType": "Resource", - "resourceType": "AWS::IAM::RolePolicy" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.PolicyDocument.Statement.0.Condition.InvalidOp", - "category": "Resource", - "startLine": 53, - "startColumn": 15, - "endLine": 53, - "endColumn": 24, - "ruleDescription": "Validate identity based IAM policies", - "phase": "LINT" + "propertyPath": "Properties.Cpu", + "category": "Best Practice", + "startLine": 63, + "startColumn": 7, + "endLine": 63, + "endColumn": 10, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "E3510", - "severity": "ERROR", - "message": "'DefinitelyNotAllow' is not one of ['Allow', 'Deny']", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Memory' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "PolicyDynamicActionBadEffect", + "logicalId": "MalformedCpuUnits", "entityType": "Resource", - "resourceType": "AWS::IAM::GroupPolicy" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.PolicyDocument.Statement.0.Effect", - "category": "Resource", - "startLine": 81, - "startColumn": 13, - "endLine": 81, - "endColumn": 19, - "ruleDescription": "Validate identity based IAM policies", - "phase": "LINT" + "propertyPath": "Properties.Memory", + "category": "Best Practice", + "startLine": 64, + "startColumn": 7, + "endLine": 64, + "endColumn": 13, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "E3510", - "severity": "ERROR", - "message": "Only one of ['Action', 'NotAction'] is a required property", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "PermissionSetBadPolicy", + "logicalId": "MalformedCpuUnits", "entityType": "Resource", - "resourceType": "AWS::SSO::PermissionSet" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.InlinePolicy.Statement.0.Action", - "category": "Resource", - "startLine": 94, - "startColumn": 13, - "endLine": 94, - "endColumn": 19, - "ruleDescription": "Validate identity based IAM policies", - "phase": "LINT" + "propertyPath": "Properties.ContainerDefinitions", + "category": "Best Practice", + "startLine": 65, + "startColumn": 7, + "endLine": 65, + "endColumn": 27, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "E3510", - "severity": "ERROR", - "message": "Only one of ['Action', 'NotAction'] is a required property", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Family' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "PermissionSetBadPolicy", + "logicalId": "NonCanonicalCpuUnits", "entityType": "Resource", - "resourceType": "AWS::SSO::PermissionSet" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.InlinePolicy.Statement.0.NotAction", - "category": "Resource", - "startLine": 95, - "startColumn": 13, - "endLine": 95, - "endColumn": 22, - "ruleDescription": "Validate identity based IAM policies", - "phase": "LINT" + "propertyPath": "Properties.Family", + "category": "Best Practice", + "startLine": 73, + "startColumn": 7, + "endLine": 73, + "endColumn": 13, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "E3510", - "severity": "ERROR", - "message": "'invalid-version' is not one of ['2008-10-17', '2012-10-17']", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "UserInlinePolicy", + "logicalId": "NonCanonicalCpuUnits", "entityType": "Resource", - "resourceType": "AWS::IAM::User" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Policies.0.PolicyDocument.Version", - "category": "Resource", - "startLine": 105, - "startColumn": 13, - "endLine": 105, - "endColumn": 20, - "ruleDescription": "Validate identity based IAM policies", - "phase": "LINT" + "propertyPath": "Properties.RequiresCompatibilities", + "category": "Best Practice", + "startLine": 74, + "startColumn": 7, + "endLine": 74, + "endColumn": 30, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W2512", - "severity": "WARN", - "message": "IAM policy uses NotAction which grants all actions except those listed - consider using Action instead", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "PermissionSetBadPolicy", + "logicalId": "NonCanonicalCpuUnits", "entityType": "Resource", - "resourceType": "AWS::SSO::PermissionSet" + "resourceType": "AWS::ECS::TaskDefinition" }, - "category": "Security", - "startLine": 86, - "startColumn": 3, - "endLine": 86, - "endColumn": 25, - "ruleDescription": "IAM policy with NotAction", - "phase": "LINT" + "propertyPath": "Properties.NetworkMode", + "category": "Best Practice", + "startLine": 75, + "startColumn": 7, + "endLine": 75, + "endColumn": 18, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W9002", - "severity": "WARN", - "message": "Property 'InstanceArn' has a hardcoded ARN - use Ref, GetAtt, or a parameter instead", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "PermissionSetBadPolicy", + "logicalId": "NonCanonicalCpuUnits", "entityType": "Resource", - "resourceType": "AWS::SSO::PermissionSet" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.InstanceArn", + "propertyPath": "Properties.Cpu", "category": "Best Practice", - "startLine": 89, + "startLine": 76, "startColumn": 7, - "endLine": 89, - "endColumn": 18, - "ruleDescription": "Hardcoded ARN property", - "phase": "LINT" + "endLine": 76, + "endColumn": 10, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I1022", + "ruleId": "I9001", "severity": "INFO", - "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", - "source": "CFN_LINT", + "message": "Property 'Memory' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "PolicyWithJoinResource", + "logicalId": "NonCanonicalCpuUnits", "entityType": "Resource", - "resourceType": "AWS::IAM::Policy" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.PolicyDocument.Statement.0.Resource.Fn::Join", - "category": "Intrinsic Function", - "startLine": 67, - "startColumn": 15, - "endLine": 67, - "endColumn": 23, - "ruleDescription": "Use Sub instead of Join", - "phase": "LINT" + "propertyPath": "Properties.Memory", + "category": "Best Practice", + "startLine": 77, + "startColumn": 7, + "endLine": 77, + "endColumn": 13, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'PolicyName' is create-only; updating it will cause resource replacement", + "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "PolicyBadIdAndCondition", + "logicalId": "NonCanonicalCpuUnits", "entityType": "Resource", - "resourceType": "AWS::IAM::RolePolicy" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.PolicyName", + "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 44, + "startLine": 78, "startColumn": 7, - "endLine": 44, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "endLine": 78, + "endColumn": 27, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -88346,20 +87349,20 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'RoleName' is create-only; updating it will cause resource replacement", + "message": "Property 'Family' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "PolicyBadIdAndCondition", + "logicalId": "OverflowingMemoryUnits", "entityType": "Resource", - "resourceType": "AWS::IAM::RolePolicy" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.RoleName", + "propertyPath": "Properties.Family", "category": "Best Practice", - "startLine": 45, + "startLine": 86, "startColumn": 7, - "endLine": 45, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "endLine": 86, + "endColumn": 13, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -88369,20 +87372,20 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'GroupName' is create-only; updating it will cause resource replacement", + "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "PolicyDynamicActionBadEffect", + "logicalId": "OverflowingMemoryUnits", "entityType": "Resource", - "resourceType": "AWS::IAM::GroupPolicy" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.GroupName", + "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 76, + "startLine": 87, "startColumn": 7, - "endLine": 76, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "endLine": 87, + "endColumn": 30, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -88392,20 +87395,20 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'PolicyName' is create-only; updating it will cause resource replacement", + "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "PolicyDynamicActionBadEffect", + "logicalId": "OverflowingMemoryUnits", "entityType": "Resource", - "resourceType": "AWS::IAM::GroupPolicy" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.PolicyName", + "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 77, + "startLine": 88, "startColumn": 7, - "endLine": 77, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "endLine": 88, + "endColumn": 18, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -88415,20 +87418,20 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'InstanceArn' is create-only; updating it will cause resource replacement", + "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "PermissionSetBadPolicy", + "logicalId": "OverflowingMemoryUnits", "entityType": "Resource", - "resourceType": "AWS::SSO::PermissionSet" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.InstanceArn", + "propertyPath": "Properties.Cpu", "category": "Best Practice", "startLine": 89, "startColumn": 7, "endLine": 89, - "endColumn": 18, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sso/aws-sso-permissionset", + "endColumn": 10, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -88438,20 +87441,20 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Name' is create-only; updating it will cause resource replacement", + "message": "Property 'Memory' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "PermissionSetBadPolicy", + "logicalId": "OverflowingMemoryUnits", "entityType": "Resource", - "resourceType": "AWS::SSO::PermissionSet" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Name", + "propertyPath": "Properties.Memory", "category": "Best Practice", "startLine": 90, "startColumn": 7, "endLine": 90, - "endColumn": 11, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sso/aws-sso-permissionset", + "endColumn": 13, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -88459,181 +87462,138 @@ } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'PermissionSetBadPolicy' of type 'AWS::SSO::PermissionSet' supports Tags but none are configured", + "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "PermissionSetBadPolicy", + "logicalId": "OverflowingMemoryUnits", "entityType": "Resource", - "resourceType": "AWS::SSO::PermissionSet" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 88, - "startColumn": 5, - "endLine": 88, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 91, + "startColumn": 7, + "endLine": 91, + "endColumn": 27, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'UserInlinePolicy' of type 'AWS::IAM::User' supports Tags but none are configured", + "message": "Property 'Family' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "UserInlinePolicy", + "logicalId": "CpuInvalidThenValid", "entityType": "Resource", - "resourceType": "AWS::IAM::User" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.Family", "category": "Best Practice", - "startLine": 101, - "startColumn": 5, - "endLine": 101, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "bad/resources/iam/identity_policy_wildcard_service.yaml": { - "filePath": "bad/resources/iam/identity_policy_wildcard_service.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 0, - "informational": 0, - "debug": 0 + "startLine": 99, + "startColumn": 7, + "endLine": 99, + "endColumn": 13, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "E3510", - "severity": "ERROR", - "message": "'arn:aws:*:::example-bucket/*' does not match '^(arn:(aws[A-Za-z\\-]*?|[A-Za-z?*\\-]*[?*][A-Za-z?*\\-]*):[^:*?]+:[^:]*(:(?:\\d{12}|\\*|aws)?:.+|)|\\*)$'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "WildcardServicePolicy", + "logicalId": "CpuInvalidThenValid", "entityType": "Resource", - "resourceType": "AWS::IAM::ManagedPolicy" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.PolicyDocument.Statement.0.Resource", - "category": "Resource", - "startLine": 13, - "startColumn": 13, - "endLine": 13, - "endColumn": 21, - "ruleDescription": "Validate identity based IAM policies", - "phase": "LINT" - } - ] - }, - "bad/resources/iam/managed_policy_description.yaml": { - "filePath": "bad/resources/iam/managed_policy_description.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 1, - "debug": 0 + "propertyPath": "Properties.RequiresCompatibilities", + "category": "Best Practice", + "startLine": 100, + "startColumn": 7, + "endLine": 100, + "endColumn": 30, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Description' is create-only; updating it will cause resource replacement", + "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SomeManagedPolicy", + "logicalId": "CpuInvalidThenValid", "entityType": "Resource", - "resourceType": "AWS::IAM::ManagedPolicy" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Description", + "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 7, + "startLine": 101, "startColumn": 7, - "endLine": 7, + "endLine": 101, "endColumn": 18, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam", + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only" } - } - ] - }, - "bad/resources/iam/ref_with_path.yaml": { - "filePath": "bad/resources/iam/ref_with_path.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 5, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 0, - "informational": 11, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "E3050", - "severity": "ERROR", - "message": "Ref to IAM role 'CodeBuildRole' with Path '/test/' - use GetAtt CodeBuildRole.Arn instead", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "CodeBuildProject", + "logicalId": "CpuInvalidThenValid", "entityType": "Resource", - "resourceType": "AWS::CodeBuild::Project" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.ServiceRole", - "suggestedFix": "Switch from Ref to !GetAtt .Arn when Path is not '/'", - "category": "Resource", - "startLine": 7, + "propertyPath": "Properties.Cpu", + "category": "Best Practice", + "startLine": 102, "startColumn": 7, - "endLine": 7, - "endColumn": 18, - "ruleDescription": "Check if REFing to a IAM resource with path set", - "phase": "LINT" + "endLine": 102, + "endColumn": 10, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Fn::If on condition 'UseFirst'" + } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Path' is create-only; updating it will cause resource replacement", + "message": "Property 'Memory' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "CodeBuildRole", + "logicalId": "CpuInvalidThenValid", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Path", + "propertyPath": "Properties.Memory", "category": "Best Practice", - "startLine": 43, + "startLine": 103, "startColumn": 7, - "endLine": 43, - "endColumn": 11, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "endLine": 103, + "endColumn": 13, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -88643,19 +87603,20 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "CodeBuildVPC", + "logicalId": "CpuInvalidThenValid", "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 64, + "startLine": 104, "startColumn": 7, - "endLine": 64, - "endColumn": 16, + "endLine": 104, + "endColumn": 27, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -88665,42 +87626,43 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "message": "Property 'Family' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "CodeBuildSubnet", + "logicalId": "CpuValidThenInvalid", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.Family", "category": "Best Practice", - "startLine": 73, + "startLine": 112, "startColumn": 7, - "endLine": 73, - "endColumn": 12, + "endLine": 112, + "endColumn": 13, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'CodeBuildVPC'" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "CodeBuildSubnet", + "logicalId": "CpuValidThenInvalid", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 75, + "startLine": 113, "startColumn": 7, - "endLine": 75, - "endColumn": 16, + "endLine": 113, + "endColumn": 30, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -88710,19 +87672,20 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'GroupName' is create-only; updating it will cause resource replacement", + "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "CodeBuildSecurityGroup", + "logicalId": "CpuValidThenInvalid", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.GroupName", + "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 79, + "startLine": 114, "startColumn": 7, - "endLine": 79, - "endColumn": 16, + "endLine": 114, + "endColumn": 18, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -88732,19 +87695,44 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", + "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "CodeBuildSecurityGroup", + "logicalId": "CpuValidThenInvalid", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.GroupDescription", + "propertyPath": "Properties.Cpu", "category": "Best Practice", - "startLine": 80, + "startLine": 115, "startColumn": 7, - "endLine": 80, - "endColumn": 23, + "endLine": 115, + "endColumn": 10, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Fn::If on condition 'UseFirst'" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Memory' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "CpuValidThenInvalid", + "entityType": "Resource", + "resourceType": "AWS::ECS::TaskDefinition" + }, + "propertyPath": "Properties.Memory", + "category": "Best Practice", + "startLine": 116, + "startColumn": 7, + "endLine": 116, + "endColumn": 13, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -88754,42 +87742,42 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "CodeBuildSecurityGroup", + "logicalId": "CpuValidThenInvalid", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 81, + "startLine": 117, "startColumn": 7, - "endLine": 81, - "endColumn": 12, + "endLine": 117, + "endColumn": 27, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'CodeBuildVPC'" + "lifecycle": "create-only" } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'CodeBuildProject' of type 'AWS::CodeBuild::Project' supports Tags but none are configured", + "message": "Resource 'EightVcpuInvalidStep' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "CodeBuildProject", + "logicalId": "EightVcpuInvalidStep", "entityType": "Resource", - "resourceType": "AWS::CodeBuild::Project" + "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 6, + "startLine": 7, "startColumn": 5, - "endLine": 6, + "endLine": 7, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -88797,19 +87785,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'CodeBuildRole' of type 'AWS::IAM::Role' supports Tags but none are configured", + "message": "Resource 'SixteenVcpuInvalidStep' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "CodeBuildRole", + "logicalId": "SixteenVcpuInvalidStep", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 35, + "startLine": 20, "startColumn": 5, - "endLine": 35, + "endLine": 20, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -88817,12 +87805,72 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'CodeBuildSubnet' of type 'AWS::EC2::Subnet' supports Tags but none are configured", + "message": "Resource 'ThirtyTwoVcpuUnsupportedSixtyFourGb' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "CodeBuildSubnet", + "logicalId": "ThirtyTwoVcpuUnsupportedSixtyFourGb", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::ECS::TaskDefinition" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 33, + "startColumn": 5, + "endLine": 33, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'ThirtyTwoVcpuUnsupportedTwoFortyGb' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "ThirtyTwoVcpuUnsupportedTwoFortyGb", + "entityType": "Resource", + "resourceType": "AWS::ECS::TaskDefinition" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 46, + "startColumn": 5, + "endLine": 46, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'MalformedCpuUnits' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "MalformedCpuUnits", + "entityType": "Resource", + "resourceType": "AWS::ECS::TaskDefinition" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 59, + "startColumn": 5, + "endLine": 59, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'NonCanonicalCpuUnits' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "NonCanonicalCpuUnits", + "entityType": "Resource", + "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", @@ -88837,58 +87885,39 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'CodeBuildSecurityGroup' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", + "message": "Resource 'OverflowingMemoryUnits' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "CodeBuildSecurityGroup", + "logicalId": "OverflowingMemoryUnits", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 78, + "startLine": 85, "startColumn": 5, - "endLine": 78, + "endLine": 85, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" - } - ] - }, - "bad/resources/iam/resource_policy.yaml": { - "filePath": "bad/resources/iam/resource_policy.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 2, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 2, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'ecr1' of type 'AWS::ECR::Repository' supports Tags but none are configured", + "message": "Resource 'CpuInvalidThenValid' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ecr1", + "logicalId": "CpuInvalidThenValid", "entityType": "Resource", - "resourceType": "AWS::ECR::Repository" + "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 6, + "startLine": 98, "startColumn": 5, - "endLine": 6, + "endLine": 98, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -88896,19 +87925,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'ecr2' of type 'AWS::ECR::Repository' supports Tags but none are configured", + "message": "Resource 'CpuValidThenInvalid' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ecr2", + "logicalId": "CpuValidThenInvalid", "entityType": "Resource", - "resourceType": "AWS::ECR::Repository" + "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 19, + "startLine": 111, "startColumn": 5, - "endLine": 19, + "endLine": 111, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" diff --git a/src/resources/expected/validation_reports3.json b/src/resources/expected/validation_reports3.json index 80567994..d65cba99 100644 --- a/src/resources/expected/validation_reports3.json +++ b/src/resources/expected/validation_reports3.json @@ -1,14 +1,14 @@ { - "bad/resources/lambda/function_property_value_limits.yaml": { - "filePath": "bad/resources/lambda/function_property_value_limits.yaml", + "bad/resources/elasticache/cache_cluster_failover.yaml": { + "filePath": "bad/resources/elasticache/cache_cluster_failover.yaml", "status": "OK", "metadata": { - "resourcesScanned": 3, + "resourcesScanned": 7, "counts": { - "fatal": 6, - "errors": 5, + "fatal": 0, + "errors": 0, "warnings": 0, - "informational": 6, + "informational": 30, "debug": 0 }, "suppressed": 0, @@ -17,262 +17,245 @@ }, "diagnostics": [ { - "ruleId": "F1020", - "severity": "FATAL", - "message": "Fn::GetAtt references non-existent resource 'myLambdaExecutionRole'", - "source": "SCHEMA", + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "myLambdaFunction", + "logicalId": "BasicReplicationGroup", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::ElastiCache::ReplicationGroup" }, - "suggestedFix": "Check that the GetAtt target resource exists in the template", - "category": "Intrinsic Function", - "startLine": 6, + "category": "Best Practice", + "startLine": 34, "startColumn": 3, - "endLine": 6, - "endColumn": 19, - "ruleDescription": "Ref/GetAtt target must exist", - "phase": "SCHEMA" + "endLine": 34, + "endColumn": 24, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "F1020", - "severity": "FATAL", - "message": "Fn::GetAtt references non-existent resource 'myLambdaExecutionRole'", - "source": "SCHEMA", + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "myLambdaFunction2", + "logicalId": "BasicReplicationGroup", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::ElastiCache::ReplicationGroup" }, - "suggestedFix": "Check that the GetAtt target resource exists in the template", - "category": "Intrinsic Function", - "startLine": 16, + "category": "Best Practice", + "startLine": 34, "startColumn": 3, - "endLine": 16, - "endColumn": 20, - "ruleDescription": "Ref/GetAtt target must exist", - "phase": "SCHEMA" + "endLine": 34, + "endColumn": 24, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "F1020", - "severity": "FATAL", - "message": "Fn::GetAtt references non-existent resource 'myLambdaExecutionRole'", - "source": "SCHEMA", + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "myLambdaFunction3", + "logicalId": "SecondReplicationGroup", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::ElastiCache::ReplicationGroup" }, - "suggestedFix": "Check that the GetAtt target resource exists in the template", - "category": "Intrinsic Function", - "startLine": 26, + "category": "Best Practice", + "startLine": 53, "startColumn": 3, - "endLine": 26, - "endColumn": 20, - "ruleDescription": "Ref/GetAtt target must exist", - "phase": "SCHEMA" + "endLine": 53, + "endColumn": 25, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "F3031", - "severity": "FATAL", - "message": "'DXPPuqwhVLODAIIVeagGODxciscAVDptCqTYUlDZCNoFchzHdsWBvtQVHjLldJSLrjgbheLambdaName' does not match pattern '^([a-zA-Z0-9_-]{1,64}|arn:[a-zA-Z0-9-]+:lambda:[a-zA-Z0-9-]+:\\d{12}:function:[a-zA-Z0-9_-]{1,64})$'", - "source": "SCHEMA", + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "myLambdaFunction", + "logicalId": "SecondReplicationGroup", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::ElastiCache::ReplicationGroup" }, - "propertyPath": "Properties.FunctionName", - "category": "Schema", - "startLine": 9, - "startColumn": 7, - "endLine": 9, - "endColumn": 19, - "ruleDescription": "Value does not match pattern", - "phase": "SCHEMA", - "context": { - "actualValue": "DXPPuqwhVLODAIIVeagGODxciscAVDptCqTYUlDZCNoFchzHdsWBvtQVHjLldJSLrjgbheLambdaName", - "expectedConstraint": "^([a-zA-Z0-9_-]{1,64}|arn:[a-zA-Z0-9-]+:lambda:[a-zA-Z0-9-]+:\\d{12}:function:[a-zA-Z0-9_-]{1,64})$" - } + "category": "Best Practice", + "startLine": 53, + "startColumn": 3, + "endLine": 53, + "endColumn": 25, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "F3033", - "severity": "FATAL", - "message": "length 148 exceeds maximum 128", - "source": "SCHEMA", + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "myLambdaFunction2", + "logicalId": "ThirdReplicationGroup", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::ElastiCache::ReplicationGroup" }, - "propertyPath": "Properties.Handler", - "category": "Schema", - "startLine": 20, - "startColumn": 7, - "endLine": 20, - "endColumn": 14, - "ruleDescription": "String length out of bounds", - "phase": "SCHEMA", - "context": { - "actualValue": "DXPPuqwhVLODAIIVeagGODxciscAVDptCqTYUlDZCNoFchzHdsWBvtQVHjLldJSLrjgbheDXPPuqwhVLODAIIVeagGODxciscAVDptCqTYUlDZCNoFchzHdsWBvtQVHjLldJSLrjgbhe.handler", - "extra": { - "actual_length": 148, - "max_length": 128, - "min_length": 0 - } - } + "category": "Best Practice", + "startLine": 72, + "startColumn": 3, + "endLine": 72, + "endColumn": 24, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "F3033", - "severity": "FATAL", - "message": "length 280 exceeds maximum 256", - "source": "SCHEMA", + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "myLambdaFunction3", + "logicalId": "ThirdReplicationGroup", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::ElastiCache::ReplicationGroup" }, - "propertyPath": "Properties.Description", - "category": "Schema", - "startLine": 30, - "startColumn": 7, - "endLine": 30, - "endColumn": 18, - "ruleDescription": "String length out of bounds", - "phase": "SCHEMA", - "context": { - "actualValue": "DXPPuqwhVLODAIIVeagGODxciscAVDptCqTYUlDZCNoFchzHdsWBvtQVHjLldJSLrjgbheDXPPuqwhVLODAIIVeagGODxciscAVDptCqTYUlDZCNoFchzHdsWBvtQVHjLldJSLrjgbheDXPPuqwhVLODAIIVeagGODxciscAVDptCqTYUlDZCNoFchzHdsWBvtQVHjLldJSLrjgbheDXPPuqwhVLODAIIVeagGODxciscAVDptCqTYUlDZCNoFchzHdsWBvtQVHjLldJSLrjgbhe", - "extra": { - "actual_length": 280, - "max_length": 256, - "min_length": 0 - } - } + "category": "Best Practice", + "startLine": 72, + "startColumn": 3, + "endLine": 72, + "endColumn": 24, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "E2533", - "severity": "ERROR", - "message": "Runtime 'nodejs10.x' was deprecated on '2021-07-30'. Creation was disabled on '2021-07-30', and updates were disabled on '2022-02-14'. Please consider updating to 'nodejs24.x'", + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "myLambdaFunction", + "logicalId": "FourtReplicationGroup", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::ElastiCache::ReplicationGroup" }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 14, - "startColumn": 7, - "endLine": 14, - "endColumn": 14, - "ruleDescription": "Check if Lambda Function Runtimes are updatable", - "phase": "SCHEMA", - "context": { - "actualValue": "nodejs10.x", - "lifecycle": "end-of-life" - } + "category": "Best Practice", + "startLine": 89, + "startColumn": 3, + "endLine": 89, + "endColumn": 24, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "E2533", - "severity": "ERROR", - "message": "Runtime 'nodejs10.x' was deprecated on '2021-07-30'. Creation was disabled on '2021-07-30', and updates were disabled on '2022-02-14'. Please consider updating to 'nodejs24.x'", + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "myLambdaFunction2", + "logicalId": "FourtReplicationGroup", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::ElastiCache::ReplicationGroup" }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 24, - "startColumn": 7, - "endLine": 24, - "endColumn": 14, - "ruleDescription": "Check if Lambda Function Runtimes are updatable", - "phase": "SCHEMA", - "context": { - "actualValue": "nodejs10.x", - "lifecycle": "end-of-life" - } + "category": "Best Practice", + "startLine": 89, + "startColumn": 3, + "endLine": 89, + "endColumn": 24, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "E2533", - "severity": "ERROR", - "message": "Runtime 'nodejs10.x' was deprecated on '2021-07-30'. Creation was disabled on '2021-07-30', and updates were disabled on '2022-02-14'. Please consider updating to 'nodejs24.x'", + "ruleId": "I3100", + "severity": "INFO", + "message": "Previous generation instance type 'cache.r3.large' - consider upgrading", "source": "CFN_LINT", "entity": { - "logicalId": "myLambdaFunction3", + "logicalId": "BasicReplicationGroup", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::ElastiCache::ReplicationGroup" }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 35, + "propertyPath": "Properties.CacheNodeType", + "suggestedFix": "Upgrade to a current generation instance type", + "category": "Best Practice", + "startLine": 40, "startColumn": 7, - "endLine": 35, - "endColumn": 14, - "ruleDescription": "Check if Lambda Function Runtimes are updatable", - "phase": "SCHEMA", - "context": { - "actualValue": "nodejs10.x", - "lifecycle": "end-of-life" - } + "endLine": 40, + "endColumn": 20, + "ruleDescription": "Checks for legacy instance type generations", + "phase": "LINT" }, { - "ruleId": "E3019", - "severity": "ERROR", - "message": "Primary identifiers {'FunctionName': 'LambdaName'} should have unique values across the resources {'myLambdaFunction2', 'myLambdaFunction3'}", + "ruleId": "I3100", + "severity": "INFO", + "message": "Previous generation instance type 'cache.r3.large' - consider upgrading", "source": "CFN_LINT", "entity": { - "logicalId": "myLambdaFunction2", + "logicalId": "SecondReplicationGroup", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::ElastiCache::ReplicationGroup" }, - "propertyPath": "Properties.FunctionName", - "category": "Resource", - "startLine": 19, + "propertyPath": "Properties.CacheNodeType", + "suggestedFix": "Upgrade to a current generation instance type", + "category": "Best Practice", + "startLine": 59, "startColumn": 7, - "endLine": 19, - "endColumn": 19, - "ruleDescription": "Validate that all resources have unique primary identifiers", + "endLine": 59, + "endColumn": 20, + "ruleDescription": "Checks for legacy instance type generations", "phase": "LINT" }, { - "ruleId": "E3019", - "severity": "ERROR", - "message": "Primary identifiers {'FunctionName': 'LambdaName'} should have unique values across the resources {'myLambdaFunction2', 'myLambdaFunction3'}", + "ruleId": "I3100", + "severity": "INFO", + "message": "Previous generation instance type 'cache.r3.large' - consider upgrading", "source": "CFN_LINT", "entity": { - "logicalId": "myLambdaFunction3", + "logicalId": "ThirdReplicationGroup", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::ElastiCache::ReplicationGroup" }, - "propertyPath": "Properties.FunctionName", - "category": "Resource", - "startLine": 29, + "propertyPath": "Properties.CacheNodeType", + "suggestedFix": "Upgrade to a current generation instance type", + "category": "Best Practice", + "startLine": 78, "startColumn": 7, - "endLine": 29, - "endColumn": 19, - "ruleDescription": "Validate that all resources have unique primary identifiers", + "endLine": 78, + "endColumn": 20, + "ruleDescription": "Checks for legacy instance type generations", + "phase": "LINT" + }, + { + "ruleId": "I3100", + "severity": "INFO", + "message": "Previous generation instance type 'cache.r3.large' - consider upgrading", + "source": "CFN_LINT", + "entity": { + "logicalId": "FourtReplicationGroup", + "entityType": "Resource", + "resourceType": "AWS::ElastiCache::ReplicationGroup" + }, + "propertyPath": "Properties.CacheNodeType", + "suggestedFix": "Upgrade to a current generation instance type", + "category": "Best Practice", + "startLine": 95, + "startColumn": 7, + "endLine": 95, + "endColumn": 20, + "ruleDescription": "Checks for legacy instance type generations", "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "message": "Property 'CacheParameterGroupFamily' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "myLambdaFunction", + "logicalId": "MyParameterGroup", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::ElastiCache::ParameterGroup" }, - "propertyPath": "Properties.FunctionName", + "propertyPath": "Properties.CacheParameterGroupFamily", "category": "Best Practice", - "startLine": 9, + "startLine": 14, "startColumn": 7, - "endLine": 9, - "endColumn": 19, + "endLine": 14, + "endColumn": 32, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -282,19 +265,19 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "message": "Property 'CacheParameterGroupFamily' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "myLambdaFunction2", + "logicalId": "MyClusterParameterGroup", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::ElastiCache::ParameterGroup" }, - "propertyPath": "Properties.FunctionName", + "propertyPath": "Properties.CacheParameterGroupFamily", "category": "Best Practice", - "startLine": 19, + "startLine": 22, "startColumn": 7, - "endLine": 19, - "endColumn": 19, + "endLine": 22, + "endColumn": 32, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -304,19 +287,19 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "message": "Property 'CacheParameterGroupFamily' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "myLambdaFunction3", + "logicalId": "MyNonClusterParameterGroup", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::ElastiCache::ParameterGroup" }, - "propertyPath": "Properties.FunctionName", + "propertyPath": "Properties.CacheParameterGroupFamily", "category": "Best Practice", - "startLine": 29, + "startLine": 30, "startColumn": 7, - "endLine": 29, - "endColumn": 19, + "endLine": 30, + "endColumn": 32, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -324,257 +307,183 @@ } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'myLambdaFunction' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "message": "Property 'CacheSubnetGroupName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "myLambdaFunction", + "logicalId": "BasicReplicationGroup", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::ElastiCache::ReplicationGroup" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.CacheSubnetGroupName", "category": "Best Practice", - "startLine": 8, - "startColumn": 5, - "endLine": 8, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 41, + "startColumn": 7, + "endLine": 41, + "endColumn": 27, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-elasticache", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'myLambdaFunction2' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "message": "Property 'Port' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "myLambdaFunction2", + "logicalId": "BasicReplicationGroup", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::ElastiCache::ReplicationGroup" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.Port", "category": "Best Practice", - "startLine": 18, - "startColumn": 5, - "endLine": 18, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 46, + "startColumn": 7, + "endLine": 46, + "endColumn": 11, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-elasticache", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'myLambdaFunction3' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "message": "Property 'CacheSubnetGroupName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "myLambdaFunction3", + "logicalId": "SecondReplicationGroup", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::ElastiCache::ReplicationGroup" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.CacheSubnetGroupName", "category": "Best Practice", - "startLine": 28, - "startColumn": 5, - "endLine": 28, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "bad/resources/lambda/required_properties.yaml": { - "filePath": "bad/resources/lambda/required_properties.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 3, - "counts": { - "fatal": 1, - "errors": 0, - "warnings": 7, - "informational": 4, - "debug": 0 + "startLine": 60, + "startColumn": 7, + "endLine": 60, + "endColumn": 27, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-elasticache", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "F3003", - "severity": "FATAL", - "message": "'Runtime' is a required property (from extension)", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Port' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Function3", + "logicalId": "SecondReplicationGroup", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::ElastiCache::ReplicationGroup" }, - "propertyPath": "Properties", - "suggestedFix": "Add 'Runtime'", - "category": "Schema", - "startLine": 25, - "startColumn": 5, - "endLine": 25, - "endColumn": 15, - "ruleDescription": "Required property missing", - "phase": "SCHEMA" + "propertyPath": "Properties.Port", + "category": "Best Practice", + "startLine": 64, + "startColumn": 7, + "endLine": 64, + "endColumn": 11, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-elasticache", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W2531", - "severity": "WARN", - "message": "Runtime 'python3.9' was deprecated on '2025-12-15'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'python3.14'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'CacheSubnetGroupName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Function2", + "logicalId": "ThirdReplicationGroup", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::ElastiCache::ReplicationGroup" }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 21, + "propertyPath": "Properties.CacheSubnetGroupName", + "category": "Best Practice", + "startLine": 79, "startColumn": 7, - "endLine": 21, - "endColumn": 14, - "ruleDescription": "Check if EOL Lambda Function Runtimes are used", + "endLine": 79, + "endColumn": 27, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-elasticache", + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "actualValue": "python3.9", - "lifecycle": "deprecated" + "lifecycle": "create-only" } }, { - "ruleId": "W2533", - "severity": "WARN", - "message": "Properties ['Handler', 'Runtime'] missing for zip file deployment at Resources/Function1/Properties", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Port' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Function1", + "logicalId": "ThirdReplicationGroup", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::ElastiCache::ReplicationGroup" }, - "propertyPath": "Properties.Code", - "suggestedFix": "Add the missing properties for zip file deployment", + "propertyPath": "Properties.Port", "category": "Best Practice", - "startLine": 9, + "startLine": 82, "startColumn": 7, - "endLine": 9, + "endLine": 82, "endColumn": 11, - "ruleDescription": "Check required properties for Lambda if the deployment package is a .zip file", - "phase": "LINT" + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-elasticache", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W2533", - "severity": "WARN", - "message": "Properties ['Handler'] missing for zip file deployment at Resources/Function2/Properties", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'CacheSubnetGroupName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Function2", + "logicalId": "FourtReplicationGroup", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::ElastiCache::ReplicationGroup" }, - "propertyPath": "Properties.Code", - "suggestedFix": "Add the missing properties for zip file deployment", + "propertyPath": "Properties.CacheSubnetGroupName", "category": "Best Practice", - "startLine": 18, + "startLine": 96, "startColumn": 7, - "endLine": 18, - "endColumn": 11, - "ruleDescription": "Check required properties for Lambda if the deployment package is a .zip file", - "phase": "LINT" - }, - { - "ruleId": "W2533", - "severity": "WARN", - "message": "Properties ['Runtime'] missing for zip file deployment at Resources/Function3/Properties", - "source": "CFN_LINT", - "entity": { - "logicalId": "Function3", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "Properties.Code", - "suggestedFix": "Add the missing properties for zip file deployment", - "category": "Best Practice", - "startLine": 28, - "startColumn": 7, - "endLine": 28, - "endColumn": 11, - "ruleDescription": "Check required properties for Lambda if the deployment package is a .zip file", - "phase": "LINT" - }, - { - "ruleId": "W9013", - "severity": "WARN", - "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", - "source": "ENGINE", - "entity": { - "logicalId": "Function1", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "category": "Security", - "startLine": 4, - "startColumn": 3, - "endLine": 4, - "endColumn": 12, - "ruleDescription": "Hardcoded account ID in ARN", - "phase": "LINT" - }, - { - "ruleId": "W9013", - "severity": "WARN", - "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", - "source": "ENGINE", - "entity": { - "logicalId": "Function2", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "category": "Security", - "startLine": 13, - "startColumn": 3, - "endLine": 13, - "endColumn": 12, - "ruleDescription": "Hardcoded account ID in ARN", - "phase": "LINT" - }, - { - "ruleId": "W9013", - "severity": "WARN", - "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", - "source": "ENGINE", - "entity": { - "logicalId": "Function3", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "category": "Security", - "startLine": 23, - "startColumn": 3, - "endLine": 23, - "endColumn": 12, - "ruleDescription": "Hardcoded account ID in ARN", - "phase": "LINT" + "endLine": 96, + "endColumn": 27, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-elasticache", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'PackageType' is create-only; updating it will cause resource replacement", + "message": "Property 'Port' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Function2", + "logicalId": "FourtReplicationGroup", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::ElastiCache::ReplicationGroup" }, - "propertyPath": "Properties.PackageType", + "propertyPath": "Properties.Port", "category": "Best Practice", - "startLine": 22, + "startLine": 100, "startColumn": 7, - "endLine": 22, - "endColumn": 18, + "endLine": 100, + "endColumn": 11, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-elasticache", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -584,19 +493,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Function1' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "message": "Resource 'MyParameterGroup' of type 'AWS::ElastiCache::ParameterGroup' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Function1", + "logicalId": "MyParameterGroup", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::ElastiCache::ParameterGroup" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 6, + "startLine": 12, "startColumn": 5, - "endLine": 6, + "endLine": 12, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -604,19 +513,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Function2' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "message": "Resource 'MyClusterParameterGroup' of type 'AWS::ElastiCache::ParameterGroup' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Function2", + "logicalId": "MyClusterParameterGroup", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::ElastiCache::ParameterGroup" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 15, + "startLine": 20, "startColumn": 5, - "endLine": 15, + "endLine": 20, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -624,96 +533,79 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Function3' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "message": "Resource 'MyNonClusterParameterGroup' of type 'AWS::ElastiCache::ParameterGroup' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Function3", + "logicalId": "MyNonClusterParameterGroup", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::ElastiCache::ParameterGroup" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 25, + "startLine": 28, "startColumn": 5, - "endLine": 25, + "endLine": 28, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" - } - ] - }, - "bad/resources/name.yaml": { - "filePath": "bad/resources/name.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 2, - "counts": { - "fatal": 2, - "errors": 0, - "warnings": 0, - "informational": 2, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "F0006", - "severity": "FATAL", - "message": "Logical ID 'my.Instance' must be alphanumeric (A-Za-z0-9)", - "source": "SCHEMA", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'BasicReplicationGroup' of type 'AWS::ElastiCache::ReplicationGroup' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "my.Instance", + "logicalId": "BasicReplicationGroup", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::ElastiCache::ReplicationGroup" }, - "category": "Structure", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Logical IDs must be alphanumeric", - "phase": "SCHEMA" + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 36, + "startColumn": 5, + "endLine": 36, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "F0006", - "severity": "FATAL", - "message": "Logical ID 'my_Instance' must be alphanumeric (A-Za-z0-9)", - "source": "SCHEMA", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'SecondReplicationGroup' of type 'AWS::ElastiCache::ReplicationGroup' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "my_Instance", + "logicalId": "SecondReplicationGroup", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::ElastiCache::ReplicationGroup" }, - "category": "Structure", - "startLine": 7, - "startColumn": 3, - "endLine": 7, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Logical IDs must be alphanumeric", - "phase": "SCHEMA" + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 55, + "startColumn": 5, + "endLine": 55, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'my.Instance' of type 'AWS::EC2::Instance' supports Tags but none are configured", + "message": "Resource 'ThirdReplicationGroup' of type 'AWS::ElastiCache::ReplicationGroup' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "my.Instance", + "logicalId": "ThirdReplicationGroup", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::ElastiCache::ReplicationGroup" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 5, + "startLine": 74, "startColumn": 5, - "endLine": 5, + "endLine": 74, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -721,35 +613,35 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'my_Instance' of type 'AWS::EC2::Instance' supports Tags but none are configured", + "message": "Resource 'FourtReplicationGroup' of type 'AWS::ElastiCache::ReplicationGroup' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "my_Instance", + "logicalId": "FourtReplicationGroup", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::ElastiCache::ReplicationGroup" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 9, + "startLine": 91, "startColumn": 5, - "endLine": 9, + "endLine": 91, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "bad/resources/primary_identifiers.yaml": { - "filePath": "bad/resources/primary_identifiers.yaml", + "bad/resources/iam/iam_policy.yaml": { + "filePath": "bad/resources/iam/iam_policy.yaml", "status": "OK", "metadata": { - "resourcesScanned": 13, + "resourcesScanned": 4, "counts": { - "fatal": 0, - "errors": 11, - "warnings": 0, - "informational": 25, + "fatal": 4, + "errors": 17, + "warnings": 1, + "informational": 2, "debug": 0 }, "suppressed": 0, @@ -758,419 +650,492 @@ }, "diagnostics": [ { - "ruleId": "E3001", - "severity": "ERROR", - "message": "Resource 'BadType' property 'Type' must be a string", - "source": "CFN_LINT", + "ruleId": "F3003", + "severity": "FATAL", + "message": "'PolicyName' is a required property", + "source": "SCHEMA", "entity": { - "logicalId": "BadType", + "logicalId": "rIamPolicy", "entityType": "Resource", - "resourceType": "" + "resourceType": "AWS::IAM::Policy" }, - "category": "Resource", - "startLine": 156, + "propertyPath": "Properties", + "suggestedFix": "Add the required property 'PolicyName'", + "category": "Schema", + "startLine": 37, "startColumn": 5, - "endLine": 156, - "endColumn": 9, - "ruleDescription": "Basic CloudFormation Resource Check", - "phase": "PARSE" + "endLine": 37, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "ruleDescription": "Required property missing", + "phase": "SCHEMA" }, { - "ruleId": "E3019", - "severity": "ERROR", - "message": "Primary identifiers {'RoleName': 'root'} should have unique values across the resources {'RootRole', 'RootRole2'}", - "source": "CFN_LINT", + "ruleId": "F3012", + "severity": "FATAL", + "message": "[{'__conditional': 'cCondition', '__if_true': {'Statement': {}}, '__if_false': {'Statement': []}}] is not of type 'object'", + "source": "SCHEMA", "entity": { - "logicalId": "RootRole", + "logicalId": "rIamPolicy", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::IAM::Policy" }, - "propertyPath": "Properties.RoleName", - "category": "Resource", - "startLine": 18, + "propertyPath": "Properties.PolicyDocument", + "category": "Schema", + "startLine": 38, "startColumn": 7, - "endLine": 18, - "endColumn": 15, - "ruleDescription": "Validate that all resources have unique primary identifiers", - "phase": "LINT" + "endLine": 38, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "ruleDescription": "Property type mismatch", + "phase": "SCHEMA", + "context": { + "actualValue": [ + { + "Statement": {} + } + ], + "expectedConstraint": "object" + } }, { - "ruleId": "E3019", - "severity": "ERROR", - "message": "Primary identifiers {'RoleName': 'root'} should have unique values across the resources {'RootRole', 'RootRole2'}", - "source": "CFN_LINT", - "entity": { - "logicalId": "RootRole2", + "ruleId": "F3017", + "severity": "FATAL", + "message": "Value is not valid under any of the 3 anyOf schemas for AWS::IAM::Policy (0 branches matched; at least one is required). Required property combinations: ['Groups'] or ['Roles'] or ['Users']. Branch failures: branch 1: 'Users' is a required property; branch 2: 'Groups' is a required property; branch 3: 'Roles' is a required property.", + "source": "SCHEMA", + "entity": { + "logicalId": "rIamPolicy", + "entityType": "Resource", + "resourceType": "AWS::IAM::Policy" + }, + "propertyPath": "Properties", + "category": "Schema", + "startLine": 37, + "startColumn": 5, + "endLine": 37, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "ruleDescription": "Value not valid under anyOf", + "phase": "SCHEMA", + "context": { + "expectedConstraint": "at least one anyOf branch", + "extra": { + "branchCount": 3, + "branchFailures": [ + { + "branch": 1, + "reasons": [ + { + "message": "'Users' is a required property", + "propertyPath": "Properties" + } + ] + }, + { + "branch": 2, + "reasons": [ + { + "message": "'Groups' is a required property", + "propertyPath": "Properties" + } + ] + }, + { + "branch": 3, + "reasons": [ + { + "message": "'Roles' is a required property", + "propertyPath": "Properties" + } + ] + } + ], + "compositionKind": "anyOf", + "matchCount": 0, + "matchOutcome": "zeroMatches", + "validPropertyCombinations": [ + [ + "Groups" + ], + [ + "Roles" + ], + [ + "Users" + ] + ] + } + } + }, + { + "ruleId": "F3033", + "severity": "FATAL", + "message": "length 91 exceeds maximum 64", + "source": "SCHEMA", + "entity": { + "logicalId": "rIamRole", "entityType": "Resource", "resourceType": "AWS::IAM::Role" }, "propertyPath": "Properties.RoleName", - "category": "Resource", - "startLine": 40, + "category": "Schema", + "startLine": 9, "startColumn": 7, - "endLine": 40, + "endLine": 9, "endColumn": 15, - "ruleDescription": "Validate that all resources have unique primary identifiers", - "phase": "LINT" + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "ruleDescription": "String length out of bounds", + "phase": "SCHEMA", + "context": { + "actualValue": "jeAoXmadgEUYzfalKtuYjeAoXmadgEUYzfalKtuYjeAoXmadgEUYzfalKtuYjeAoXmadgEUYzfalKtuYBadRoleName", + "extra": { + "actual_length": 91, + "max_length": 64, + "min_length": 1 + } + } }, { - "ruleId": "E3019", + "ruleId": "E1028", "severity": "ERROR", - "message": "Primary identifiers {'RoleName': 'useast1'} should have unique values across the resources {'RootRole3', 'RootRole4', 'RootRole5', 'RootRole6'}", + "message": "Fn::If condition 'cCondition' does not exist in Conditions section", + "source": "SCHEMA", + "entity": { + "logicalId": "rIamPolicy", + "entityType": "Resource", + "resourceType": "AWS::IAM::Policy" + }, + "propertyPath": "Properties.PolicyDocument.0.Fn::If.0", + "category": "Intrinsic Function", + "startLine": 40, + "startColumn": 11, + "endLine": 40, + "endColumn": 12, + "ruleDescription": "Fn::If condition must exist in Conditions section", + "phase": "PARSE" + }, + { + "ruleId": "E3510", + "severity": "ERROR", + "message": "'blah' is not one of ['2008-10-17', '2012-10-17']", "source": "CFN_LINT", "entity": { - "logicalId": "RootRole3", + "logicalId": "rIamRole", "entityType": "Resource", "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.RoleName", + "propertyPath": "Properties.Policies.0.PolicyDocument.Version", "category": "Resource", - "startLine": 63, - "startColumn": 7, - "endLine": 63, - "endColumn": 15, - "ruleDescription": "Validate that all resources have unique primary identifiers", + "startLine": 14, + "startColumn": 11, + "endLine": 14, + "endColumn": 18, + "ruleDescription": "Validate identity based IAM policies", "phase": "LINT" }, { - "ruleId": "E3019", + "ruleId": "E3510", "severity": "ERROR", - "message": "Primary identifiers {'RoleName': 'useast1'} should have unique values across the resources {'RootRole3', 'RootRole4', 'RootRole5', 'RootRole6'}", + "message": "Additional properties are not allowed ('BadProperty' was unexpected)", "source": "CFN_LINT", "entity": { - "logicalId": "RootRole4", + "logicalId": "rIamRole", "entityType": "Resource", "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.RoleName", + "propertyPath": "Properties.Policies.0.PolicyDocument.BadProperty", "category": "Resource", - "startLine": 86, - "startColumn": 7, - "endLine": 86, - "endColumn": 15, - "ruleDescription": "Validate that all resources have unique primary identifiers", + "startLine": 15, + "startColumn": 11, + "endLine": 15, + "endColumn": 22, + "ruleDescription": "Validate identity based IAM policies", "phase": "LINT" }, { - "ruleId": "E3019", + "ruleId": "E3510", "severity": "ERROR", - "message": "Primary identifiers {'RoleName': 'useast1'} should have unique values across the resources {'RootRole3', 'RootRole4', 'RootRole5', 'RootRole6'}", + "message": "'Test' is not of type 'object', 'array'", "source": "CFN_LINT", "entity": { - "logicalId": "RootRole5", + "logicalId": "rIamRole", "entityType": "Resource", "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.RoleName", + "propertyPath": "Properties.Policies.0.PolicyDocument.Statement", "category": "Resource", - "startLine": 109, - "startColumn": 7, - "endLine": 109, - "endColumn": 15, - "ruleDescription": "Validate that all resources have unique primary identifiers", + "startLine": 16, + "startColumn": 11, + "endLine": 16, + "endColumn": 20, + "ruleDescription": "Validate identity based IAM policies", "phase": "LINT" }, { - "ruleId": "E3019", + "ruleId": "E3510", "severity": "ERROR", - "message": "Primary identifiers {'RoleName': 'useast1'} should have unique values across the resources {'RootRole3', 'RootRole4', 'RootRole5', 'RootRole6'}", + "message": "'blah' is not one of ['2008-10-17', '2012-10-17']", "source": "CFN_LINT", "entity": { - "logicalId": "RootRole6", + "logicalId": "rIamUser", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::IAM::ManagedPolicy" }, - "propertyPath": "Properties.RoleName", + "propertyPath": "Properties.PolicyDocument.Version", "category": "Resource", - "startLine": 131, - "startColumn": 7, - "endLine": 131, - "endColumn": 15, - "ruleDescription": "Validate that all resources have unique primary identifiers", + "startLine": 21, + "startColumn": 9, + "endLine": 21, + "endColumn": 16, + "ruleDescription": "Validate identity based IAM policies", "phase": "LINT" }, { - "ruleId": "E3019", + "ruleId": "E3510", "severity": "ERROR", - "message": "Primary identifiers {'BucketName': 'us-east-1'} should have unique values across the resources {'Bucket1', 'Bucket2'}", + "message": "Only one of ['Action', 'NotAction'] is a required property", "source": "CFN_LINT", "entity": { - "logicalId": "Bucket1", + "logicalId": "rIamUser", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::IAM::ManagedPolicy" }, - "propertyPath": "Properties.BucketName", + "propertyPath": "Properties.PolicyDocument.Statement.0", "category": "Resource", - "startLine": 142, - "startColumn": 5, - "endLine": 142, - "endColumn": 15, - "ruleDescription": "Validate that all resources have unique primary identifiers", + "startLine": 23, + "startColumn": 19, + "endLine": 23, + "endColumn": 20, + "ruleDescription": "Validate identity based IAM policies", "phase": "LINT" }, { - "ruleId": "E3019", + "ruleId": "E3510", "severity": "ERROR", - "message": "Primary identifiers {'BucketName': 'us-east-1'} should have unique values across the resources {'Bucket1', 'Bucket2'}", + "message": "'NotAllow' is not one of ['Allow', 'Deny']", "source": "CFN_LINT", "entity": { - "logicalId": "Bucket2", + "logicalId": "rIamUser", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::IAM::ManagedPolicy" }, - "propertyPath": "Properties.BucketName", + "propertyPath": "Properties.PolicyDocument.Statement.0.Effect", "category": "Resource", - "startLine": 150, - "startColumn": 7, - "endLine": 150, + "startLine": 24, + "startColumn": 11, + "endLine": 24, "endColumn": 17, - "ruleDescription": "Validate that all resources have unique primary identifiers", + "ruleDescription": "Validate identity based IAM policies", "phase": "LINT" }, { - "ruleId": "E3019", + "ruleId": "E3510", "severity": "ERROR", - "message": "Primary identifiers {'Name': 'myProjectName'} should have unique values across the resources {'Project1', 'Project2'}", + "message": "Additional properties are not allowed ('Principal' was unexpected)", "source": "CFN_LINT", "entity": { - "logicalId": "Project1", + "logicalId": "rIamUser", "entityType": "Resource", - "resourceType": "AWS::CodeBuild::Project" + "resourceType": "AWS::IAM::ManagedPolicy" }, - "propertyPath": "Properties.Name", + "propertyPath": "Properties.PolicyDocument.Statement.0.Principal", "category": "Resource", - "startLine": 168, - "startColumn": 7, - "endLine": 168, - "endColumn": 11, - "ruleDescription": "Validate that all resources have unique primary identifiers", + "startLine": 25, + "startColumn": 11, + "endLine": 25, + "endColumn": 20, + "ruleDescription": "Validate identity based IAM policies", "phase": "LINT" }, { - "ruleId": "E3019", + "ruleId": "E3510", "severity": "ERROR", - "message": "Primary identifiers {'Name': 'myProjectName'} should have unique values across the resources {'Project1', 'Project2'}", + "message": "{\"Effect\":\"Allow\"} is not of type 'string'", "source": "CFN_LINT", "entity": { - "logicalId": "Project2", + "logicalId": "rIamUser", "entityType": "Resource", - "resourceType": "AWS::CodeBuild::Project" + "resourceType": "AWS::IAM::ManagedPolicy" }, - "propertyPath": "Properties.Name", + "propertyPath": "Properties.PolicyDocument.Statement.1.Resource.0", "category": "Resource", - "startLine": 188, - "startColumn": 7, - "endLine": 188, - "endColumn": 11, - "ruleDescription": "Validate that all resources have unique primary identifiers", + "startLine": 30, + "startColumn": 19, + "endLine": 30, + "endColumn": 20, + "ruleDescription": "Validate identity based IAM policies", "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Path' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E3510", + "severity": "ERROR", + "message": "{\"Effect\":\"Allow\",\"Action\":[\"cloudwatch:*\"],\"Resource\":\"*\"} is not of type 'string'", + "source": "CFN_LINT", "entity": { - "logicalId": "RootRole", + "logicalId": "rIamUser", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::IAM::ManagedPolicy" }, - "propertyPath": "Properties.Path", - "category": "Best Practice", - "startLine": 17, - "startColumn": 7, - "endLine": 17, - "endColumn": 11, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "propertyPath": "Properties.PolicyDocument.Statement.1.Resource.1", + "category": "Resource", + "startLine": 31, + "startColumn": 19, + "endLine": 31, + "endColumn": 20, + "ruleDescription": "Validate identity based IAM policies", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'RoleName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "RootRole", + "ruleId": "E3510", + "severity": "ERROR", + "message": "[{\"Statement\":{}}] is not of type 'object'", + "source": "CFN_LINT", + "entity": { + "logicalId": "rIamPolicy", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::IAM::Policy" }, - "propertyPath": "Properties.RoleName", - "category": "Best Practice", - "startLine": 18, + "propertyPath": "Properties.PolicyDocument", + "category": "Resource", + "startLine": 38, "startColumn": 7, - "endLine": 18, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "endLine": 38, + "endColumn": 21, + "ruleDescription": "Validate identity based IAM policies", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Path' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E3510", + "severity": "ERROR", + "message": "Only one of ['Action', 'NotAction'] is a required property", + "source": "CFN_LINT", "entity": { - "logicalId": "RootRole2", + "logicalId": "rIamPolicyExtraThings", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::IAM::Policy" }, - "propertyPath": "Properties.Path", - "category": "Best Practice", - "startLine": 39, - "startColumn": 7, - "endLine": 39, - "endColumn": 11, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "propertyPath": "Properties.PolicyDocument.Statement.0.Action", + "category": "Resource", + "startLine": 54, + "startColumn": 11, + "endLine": 54, + "endColumn": 17, + "ruleDescription": "Validate identity based IAM policies", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'RoleName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E3510", + "severity": "ERROR", + "message": "Only one of ['Action', 'NotAction'] is a required property", + "source": "CFN_LINT", "entity": { - "logicalId": "RootRole2", + "logicalId": "rIamPolicyExtraThings", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::IAM::Policy" }, - "propertyPath": "Properties.RoleName", - "category": "Best Practice", - "startLine": 40, - "startColumn": 7, - "endLine": 40, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "propertyPath": "Properties.PolicyDocument.Statement.0.NotAction", + "category": "Resource", + "startLine": 56, + "startColumn": 11, + "endLine": 56, + "endColumn": 20, + "ruleDescription": "Validate identity based IAM policies", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Path' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E3510", + "severity": "ERROR", + "message": "Only one of ['Resource', 'NotResource'] is a required property", + "source": "CFN_LINT", "entity": { - "logicalId": "RootRole3", + "logicalId": "rIamPolicyExtraThings", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::IAM::Policy" }, - "propertyPath": "Properties.Path", - "category": "Best Practice", - "startLine": 62, - "startColumn": 7, - "endLine": 62, - "endColumn": 11, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "propertyPath": "Properties.PolicyDocument.Statement.0.Resource", + "category": "Resource", + "startLine": 58, + "startColumn": 11, + "endLine": 58, + "endColumn": 19, + "ruleDescription": "Validate identity based IAM policies", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'RoleName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E3510", + "severity": "ERROR", + "message": "Only one of ['Resource', 'NotResource'] is a required property", + "source": "CFN_LINT", "entity": { - "logicalId": "RootRole3", + "logicalId": "rIamPolicyExtraThings", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::IAM::Policy" }, - "propertyPath": "Properties.RoleName", - "category": "Best Practice", - "startLine": 63, - "startColumn": 7, - "endLine": 63, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "propertyPath": "Properties.PolicyDocument.Statement.0.NotResource", + "category": "Resource", + "startLine": 60, + "startColumn": 11, + "endLine": 60, + "endColumn": 22, + "ruleDescription": "Validate identity based IAM policies", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Path' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E3510", + "severity": "ERROR", + "message": "'arn' does not match '^(arn:(aws[A-Za-z\\-]*?|[A-Za-z?*\\-]*[?*][A-Za-z?*\\-]*):[^:*?]+:[^:]*(:(?:\\d{12}|\\*|aws)?:.+|)|\\*)$'", + "source": "CFN_LINT", "entity": { - "logicalId": "RootRole4", + "logicalId": "rIamPolicyExtraThings", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::IAM::Policy" }, - "propertyPath": "Properties.Path", - "category": "Best Practice", - "startLine": 85, - "startColumn": 7, - "endLine": 85, - "endColumn": 11, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "propertyPath": "Properties.PolicyDocument.Statement.0.NotResource.0", + "category": "Resource", + "startLine": 61, + "startColumn": 13, + "endLine": 61, + "endColumn": 14, + "ruleDescription": "Validate identity based IAM policies", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'RoleName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E3530", + "severity": "ERROR", + "message": "'Statement' is a required property", + "source": "CFN_LINT", "entity": { - "logicalId": "RootRole4", + "logicalId": "rIamRole", "entityType": "Resource", "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.RoleName", - "category": "Best Practice", - "startLine": 86, + "propertyPath": "Properties.AssumeRolePolicyDocument", + "suggestedFix": "Add a Statement array to the AssumeRolePolicyDocument", + "category": "Resource", + "startLine": 10, "startColumn": 7, - "endLine": 86, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "endLine": 10, + "endColumn": 31, + "ruleDescription": "Validate IAM trust policies", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Path' is create-only; updating it will cause resource replacement", + "ruleId": "W2512", + "severity": "WARN", + "message": "IAM policy uses NotAction which grants all actions except those listed - consider using Action instead", "source": "ENGINE", "entity": { - "logicalId": "RootRole5", + "logicalId": "rIamPolicyExtraThings", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::IAM::Policy" }, - "propertyPath": "Properties.Path", - "category": "Best Practice", - "startLine": 108, - "startColumn": 7, - "endLine": 108, - "endColumn": 11, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "category": "Security", + "startLine": 43, + "startColumn": 3, + "endLine": 43, + "endColumn": 24, + "ruleDescription": "IAM policy with NotAction", + "phase": "LINT" }, { "ruleId": "I9001", @@ -1178,194 +1143,152 @@ "message": "Property 'RoleName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "RootRole5", + "logicalId": "rIamRole", "entityType": "Resource", "resourceType": "AWS::IAM::Role" }, "propertyPath": "Properties.RoleName", "category": "Best Practice", - "startLine": 109, + "startLine": 9, "startColumn": 7, - "endLine": 109, + "endLine": 9, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Fn::If on condition 'IsUsEast1'" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Path' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "RootRole6", - "entityType": "Resource", - "resourceType": "AWS::IAM::Role" - }, - "propertyPath": "Properties.Path", - "category": "Best Practice", - "startLine": 130, - "startColumn": 7, - "endLine": 130, - "endColumn": 11, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", "context": { "lifecycle": "create-only" } }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'RoleName' is create-only; updating it will cause resource replacement", + "message": "Resource 'rIamRole' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "RootRole6", + "logicalId": "rIamRole", "entityType": "Resource", "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.RoleName", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 131, - "startColumn": 7, - "endLine": 131, + "startLine": 8, + "startColumn": 5, + "endLine": 8, "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Fn::If on condition 'IsUsEast1'" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Bucket2", - "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" - }, - "propertyPath": "Properties.BucketName", - "category": "Best Practice", - "startLine": 150, - "startColumn": 7, - "endLine": 150, - "endColumn": 17, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Fn::If on condition 'IsUsEast1'" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "bad/resources/iam/iam_policy_conditional_policies.yaml": { + "filePath": "bad/resources/iam/iam_policy_conditional_policies.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 3, + "counts": { + "fatal": 0, + "errors": 2, + "warnings": 2, + "informational": 2, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Name' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E3510", + "severity": "ERROR", + "message": "'not-an-arn' does not match '^(arn:(aws[A-Za-z\\-]*?|[A-Za-z?*\\-]*[?*][A-Za-z?*\\-]*):[^:*?]+:[^:]*(:(?:\\d{12}|\\*|aws)?:.+|)|\\*)$'", + "source": "CFN_LINT", "entity": { - "logicalId": "Project1", + "logicalId": "RoleConditionalPolicies", "entityType": "Resource", - "resourceType": "AWS::CodeBuild::Project" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.Name", - "category": "Best Practice", - "startLine": 168, - "startColumn": 7, - "endLine": 168, - "endColumn": 11, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "propertyPath": "Properties.Policies.0.PolicyDocument.Statement.0.Resource", + "category": "Resource", + "startLine": 34, + "startColumn": 19, + "endLine": 34, + "endColumn": 27, + "ruleDescription": "Validate identity based IAM policies", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Name' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E3510", + "severity": "ERROR", + "message": "'also-bad' does not match '^(arn:(aws[A-Za-z\\-]*?|[A-Za-z?*\\-]*[?*][A-Za-z?*\\-]*):[^:*?]+:[^:]*(:(?:\\d{12}|\\*|aws)?:.+|)|\\*)$'", + "source": "CFN_LINT", "entity": { - "logicalId": "Project2", + "logicalId": "RoleConditionalPolicies", "entityType": "Resource", - "resourceType": "AWS::CodeBuild::Project" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.Name", - "category": "Best Practice", - "startLine": 188, - "startColumn": 7, - "endLine": 188, - "endColumn": 11, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "propertyPath": "Properties.Policies.0.PolicyDocument.Statement.0.Resource", + "category": "Resource", + "startLine": 48, + "startColumn": 19, + "endLine": 48, + "endColumn": 27, + "ruleDescription": "Validate identity based IAM policies", + "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'RootRole' of type 'AWS::IAM::Role' supports Tags but none are configured", + "ruleId": "W2512", + "severity": "WARN", + "message": "IAM policy uses NotAction which grants all actions except those listed - consider using Action instead", "source": "ENGINE", "entity": { - "logicalId": "RootRole", + "logicalId": "RoleNotActionConditional", "entityType": "Resource", "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 7, - "startColumn": 5, - "endLine": 7, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "category": "Security", + "startLine": 51, + "startColumn": 3, + "endLine": 51, + "endColumn": 27, + "ruleDescription": "IAM policy with NotAction", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'RootRole2' of type 'AWS::IAM::Role' supports Tags but none are configured", + "ruleId": "W2512", + "severity": "WARN", + "message": "IAM policy uses NotAction which grants all actions except those listed - consider using Action instead", "source": "ENGINE", "entity": { - "logicalId": "RootRole2", + "logicalId": "PolicySingleStatement", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::IAM::ManagedPolicy" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 29, - "startColumn": 5, - "endLine": 29, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "category": "Security", + "startLine": 79, + "startColumn": 3, + "endLine": 79, + "endColumn": 24, + "ruleDescription": "IAM policy with NotAction", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'RootRole3' of type 'AWS::IAM::Role' supports Tags but none are configured", + "message": "Resource 'RoleConditionalPolicies' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "RootRole3", + "logicalId": "RoleConditionalPolicies", "entityType": "Resource", "resourceType": "AWS::IAM::Role" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 52, + "startLine": 18, "startColumn": 5, - "endLine": 52, + "endLine": 18, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -1373,177 +1296,118 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'RootRole4' of type 'AWS::IAM::Role' supports Tags but none are configured", + "message": "Resource 'RoleNotActionConditional' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "RootRole4", + "logicalId": "RoleNotActionConditional", "entityType": "Resource", "resourceType": "AWS::IAM::Role" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 75, + "startLine": 53, "startColumn": 5, - "endLine": 75, + "endLine": 53, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "bad/resources/iam/identity_policy_conditional_novalue_e3510.yaml": { + "filePath": "bad/resources/iam/identity_policy_conditional_novalue_e3510.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 1, + "warnings": 0, + "informational": 1, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'RootRole5' of type 'AWS::IAM::Role' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "E3510", + "severity": "ERROR", + "message": "'SomeOptionalParameter' does not match '^(arn:(aws[A-Za-z\\-]*?|[A-Za-z?*\\-]*[?*][A-Za-z?*\\-]*):[^:*?]+:[^:]*(:(?:\\d{12}|\\*|aws)?:.+|)|\\*)$'", + "source": "CFN_LINT", "entity": { - "logicalId": "RootRole5", + "logicalId": "SomeManagedPolicy", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::IAM::ManagedPolicy" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 98, - "startColumn": 5, - "endLine": 98, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "propertyPath": "Properties.PolicyDocument.Statement.1.Resource.0", + "category": "Resource", + "startLine": 29, + "startColumn": 19, + "endLine": 29, + "endColumn": 20, + "ruleDescription": "Validate identity based IAM policies", "phase": "LINT" }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'RootRole6' of type 'AWS::IAM::Role' supports Tags but none are configured", + "message": "Property 'Description' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "RootRole6", + "logicalId": "SomeManagedPolicy", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::IAM::ManagedPolicy" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.Description", "category": "Best Practice", - "startLine": 120, - "startColumn": 5, - "endLine": 120, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 14, + "startColumn": 7, + "endLine": 14, + "endColumn": 18, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + } + ] + }, + "bad/resources/iam/identity_policy_e3510.yaml": { + "filePath": "bad/resources/iam/identity_policy_e3510.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 7, + "counts": { + "fatal": 3, + "errors": 8, + "warnings": 2, + "informational": 9, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Bucket1' of type 'AWS::S3::Bucket' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "F3017", + "severity": "FATAL", + "message": "Value is not valid under any of the 3 anyOf schemas for AWS::IAM::Policy (0 branches matched; at least one is required). Required property combinations: ['Groups'] or ['Roles'] or ['Users']. Branch failures: branch 1: 'Users' is a required property; branch 2: 'Groups' is a required property; branch 3: 'Roles' is a required property.", + "source": "SCHEMA", "entity": { - "logicalId": "Bucket1", + "logicalId": "PolicyEmptyAction", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::IAM::Policy" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 142, + "propertyPath": "Properties", + "category": "Schema", + "startLine": 15, "startColumn": 5, - "endLine": 142, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Bucket2' of type 'AWS::S3::Bucket' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "Bucket2", - "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 149, - "startColumn": 5, - "endLine": 149, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Project1' of type 'AWS::CodeBuild::Project' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "Project1", - "entityType": "Resource", - "resourceType": "AWS::CodeBuild::Project" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 167, - "startColumn": 5, - "endLine": 167, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Project2' of type 'AWS::CodeBuild::Project' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "Project2", - "entityType": "Resource", - "resourceType": "AWS::CodeBuild::Project" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 187, - "startColumn": 5, - "endLine": 187, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "bad/resources/properties/atleastone.yaml": { - "filePath": "bad/resources/properties/atleastone.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 2, - "counts": { - "fatal": 2, - "errors": 1, - "warnings": 0, - "informational": 0, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "F3017", - "severity": "FATAL", - "message": "Value is not valid under any of the 3 anyOf schemas for AWS::IAM::Policy (0 branches matched; at least one is required). Required property combinations: ['Groups'] or ['Roles'] or ['Users']. Branch failures: branch 1: 'Users' is a required property; branch 2: 'Groups' is a required property; branch 3: 'Roles' is a required property.", - "source": "SCHEMA", - "entity": { - "logicalId": "myPolicy", - "entityType": "Resource", - "resourceType": "AWS::IAM::Policy" - }, - "propertyPath": "Properties", - "category": "Schema", - "startLine": 10, - "startColumn": 5, - "endLine": 10, + "endLine": 15, "endColumn": 15, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", "ruleDescription": "Value not valid under anyOf", @@ -1604,19 +1468,16 @@ "message": "Value is not valid under any of the 3 anyOf schemas for AWS::IAM::Policy (0 branches matched; at least one is required). Required property combinations: ['Groups'] or ['Roles'] or ['Users']. Branch failures: branch 1: 'Users' is a required property; branch 2: 'Groups' is a required property; branch 3: 'Roles' is a required property.", "source": "SCHEMA", "entity": { - "logicalId": "myPolicy2", + "logicalId": "PolicyWithJoinResource", "entityType": "Resource", "resourceType": "AWS::IAM::Policy" }, "propertyPath": "Properties", "category": "Schema", - "startLine": 16, + "startLine": 59, "startColumn": 5, - "endLine": 16, + "endLine": 59, "endColumn": 15, - "conditionScenario": { - "cPrimaryRegion": true - }, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", "ruleDescription": "Value not valid under anyOf", "phase": "SCHEMA", @@ -1670,410 +1531,392 @@ } } }, + { + "ruleId": "F3031", + "severity": "FATAL", + "message": "'arn:aws:sso:::instance/ssoins-12345' does not match pattern 'arn:aws(-[a-z]{1,5}){0,3}:sso:::instance/(sso)?ins-[a-zA-Z0-9-.]{16}'", + "source": "SCHEMA", + "entity": { + "logicalId": "PermissionSetBadPolicy", + "entityType": "Resource", + "resourceType": "AWS::SSO::PermissionSet" + }, + "propertyPath": "Properties.InstanceArn", + "category": "Schema", + "startLine": 89, + "startColumn": 7, + "endLine": 89, + "endColumn": 18, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sso/aws-sso-permissionset", + "ruleDescription": "Value does not match pattern", + "phase": "SCHEMA", + "context": { + "actualValue": "arn:aws:sso:::instance/ssoins-12345", + "expectedConstraint": "arn:aws(-[a-z]{1,5}){0,3}:sso:::instance/(sso)?ins-[a-zA-Z0-9-.]{16}" + } + }, { "ruleId": "E3510", "severity": "ERROR", - "message": "'Statement' is a required property", + "message": "[] is too short (minimum 1 item)", "source": "CFN_LINT", "entity": { - "logicalId": "myPolicy", + "logicalId": "PolicyEmptyAction", "entityType": "Resource", "resourceType": "AWS::IAM::Policy" }, - "propertyPath": "Properties.PolicyDocument", + "propertyPath": "Properties.PolicyDocument.Statement.0.Action", "category": "Resource", - "startLine": 13, - "startColumn": 7, - "endLine": 13, - "endColumn": 21, + "startLine": 21, + "startColumn": 13, + "endLine": 21, + "endColumn": 19, "ruleDescription": "Validate identity based IAM policies", "phase": "LINT" - } - ] - }, - "bad/resources/properties/custom.yaml": { - "filePath": "bad/resources/properties/custom.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 0, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [] - }, - "bad/resources/properties/list_duplicates.yaml": { - "filePath": "bad/resources/properties/list_duplicates.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 3, - "counts": { - "fatal": 1, - "errors": 0, - "warnings": 0, - "informational": 0, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "F3037", - "severity": "FATAL", - "message": "Array items are not unique", - "source": "SCHEMA", + "ruleId": "E3510", + "severity": "ERROR", + "message": "'ReadOnly' is a duplicate of Statement.0.Sid", + "source": "CFN_LINT", "entity": { - "logicalId": "IamGroupWithNestedConditions", + "logicalId": "PolicyDuplicateSid", "entityType": "Resource", - "resourceType": "AWS::IAM::Group" - }, - "propertyPath": "Properties.ManagedPolicyArns", - "category": "Schema", - "startLine": 33, - "startColumn": 7, - "endLine": 33, - "endColumn": 24, - "conditionScenario": { - "isPrimaryRegion": true + "resourceType": "AWS::IAM::ManagedPolicy" }, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", - "ruleDescription": "Array items not unique", - "phase": "SCHEMA", - "context": { - "actualValue": [ - "arn:aws:iam::aws:policy/AdministratorPolicy", - "arn:aws:iam::aws:policy/AdministratorPolicy" - ] - } - } - ] - }, - "bad/resources/properties/primitive_types_map.yaml": { - "filePath": "bad/resources/properties/primitive_types_map.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 2, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 4, - "informational": 2, - "debug": 0 + "propertyPath": "Properties.PolicyDocument.Statement.1.Sid", + "category": "Resource", + "startLine": 35, + "startColumn": 13, + "endLine": 35, + "endColumn": 16, + "ruleDescription": "Validate identity based IAM policies", + "phase": "LINT" }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "W2531", - "severity": "WARN", - "message": "Runtime 'nodejs18.x' was deprecated on '2025-09-01'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'nodejs24.x'", + "ruleId": "E3510", + "severity": "ERROR", + "message": "Additional properties are not allowed ('Id' was unexpected)", "source": "CFN_LINT", "entity": { - "logicalId": "ExampleLambda", + "logicalId": "PolicyBadIdAndCondition", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::IAM::RolePolicy" }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 19, - "startColumn": 7, - "endLine": 19, - "endColumn": 14, - "ruleDescription": "Check if EOL Lambda Function Runtimes are used", - "phase": "SCHEMA", - "context": { - "actualValue": "nodejs18.x", - "lifecycle": "deprecated" - } + "propertyPath": "Properties.PolicyDocument.Id", + "category": "Resource", + "startLine": 47, + "startColumn": 9, + "endLine": 47, + "endColumn": 11, + "ruleDescription": "Validate identity based IAM policies", + "phase": "LINT" }, { - "ruleId": "W2531", - "severity": "WARN", - "message": "Runtime 'nodejs18.x' was deprecated on '2025-09-01'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'nodejs24.x'", + "ruleId": "E3510", + "severity": "ERROR", + "message": "'InvalidOp' is not a valid IAM condition operator", "source": "CFN_LINT", "entity": { - "logicalId": "ExampleLambda1", + "logicalId": "PolicyBadIdAndCondition", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::IAM::RolePolicy" }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 39, - "startColumn": 7, - "endLine": 39, - "endColumn": 14, - "ruleDescription": "Check if EOL Lambda Function Runtimes are used", - "phase": "SCHEMA", - "context": { - "actualValue": "nodejs18.x", - "lifecycle": "deprecated" - } + "propertyPath": "Properties.PolicyDocument.Statement.0.Condition.InvalidOp", + "category": "Resource", + "startLine": 53, + "startColumn": 15, + "endLine": 53, + "endColumn": 24, + "ruleDescription": "Validate identity based IAM policies", + "phase": "LINT" }, { - "ruleId": "W9013", - "severity": "WARN", - "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", - "source": "ENGINE", + "ruleId": "E3510", + "severity": "ERROR", + "message": "'DefinitelyNotAllow' is not one of ['Allow', 'Deny']", + "source": "CFN_LINT", "entity": { - "logicalId": "ExampleLambda", + "logicalId": "PolicyDynamicActionBadEffect", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::IAM::GroupPolicy" }, - "category": "Security", - "startLine": 5, - "startColumn": 3, - "endLine": 5, - "endColumn": 16, - "ruleDescription": "Hardcoded account ID in ARN", + "propertyPath": "Properties.PolicyDocument.Statement.0.Effect", + "category": "Resource", + "startLine": 81, + "startColumn": 13, + "endLine": 81, + "endColumn": 19, + "ruleDescription": "Validate identity based IAM policies", "phase": "LINT" }, { - "ruleId": "W9013", - "severity": "WARN", - "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", - "source": "ENGINE", + "ruleId": "E3510", + "severity": "ERROR", + "message": "Only one of ['Action', 'NotAction'] is a required property", + "source": "CFN_LINT", "entity": { - "logicalId": "ExampleLambda1", + "logicalId": "PermissionSetBadPolicy", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::SSO::PermissionSet" }, - "category": "Security", - "startLine": 22, - "startColumn": 3, - "endLine": 22, - "endColumn": 17, - "ruleDescription": "Hardcoded account ID in ARN", + "propertyPath": "Properties.InlinePolicy.Statement.0.Action", + "category": "Resource", + "startLine": 94, + "startColumn": 13, + "endLine": 94, + "endColumn": 19, + "ruleDescription": "Validate identity based IAM policies", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'ExampleLambda' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "ruleId": "E3510", + "severity": "ERROR", + "message": "Only one of ['Action', 'NotAction'] is a required property", + "source": "CFN_LINT", + "entity": { + "logicalId": "PermissionSetBadPolicy", + "entityType": "Resource", + "resourceType": "AWS::SSO::PermissionSet" + }, + "propertyPath": "Properties.InlinePolicy.Statement.0.NotAction", + "category": "Resource", + "startLine": 95, + "startColumn": 13, + "endLine": 95, + "endColumn": 22, + "ruleDescription": "Validate identity based IAM policies", + "phase": "LINT" + }, + { + "ruleId": "E3510", + "severity": "ERROR", + "message": "'invalid-version' is not one of ['2008-10-17', '2012-10-17']", + "source": "CFN_LINT", + "entity": { + "logicalId": "UserInlinePolicy", + "entityType": "Resource", + "resourceType": "AWS::IAM::User" + }, + "propertyPath": "Properties.Policies.0.PolicyDocument.Version", + "category": "Resource", + "startLine": 105, + "startColumn": 13, + "endLine": 105, + "endColumn": 20, + "ruleDescription": "Validate identity based IAM policies", + "phase": "LINT" + }, + { + "ruleId": "W2512", + "severity": "WARN", + "message": "IAM policy uses NotAction which grants all actions except those listed - consider using Action instead", "source": "ENGINE", "entity": { - "logicalId": "ExampleLambda", + "logicalId": "PermissionSetBadPolicy", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::SSO::PermissionSet" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 6, - "startColumn": 5, - "endLine": 6, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "category": "Security", + "startLine": 86, + "startColumn": 3, + "endLine": 86, + "endColumn": 25, + "ruleDescription": "IAM policy with NotAction", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'ExampleLambda1' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "ruleId": "W9002", + "severity": "WARN", + "message": "Property 'InstanceArn' has a hardcoded ARN - use Ref, GetAtt, or a parameter instead", "source": "ENGINE", "entity": { - "logicalId": "ExampleLambda1", + "logicalId": "PermissionSetBadPolicy", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::SSO::PermissionSet" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.InstanceArn", "category": "Best Practice", - "startLine": 23, - "startColumn": 5, - "endLine": 23, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "startLine": 89, + "startColumn": 7, + "endLine": 89, + "endColumn": 18, + "ruleDescription": "Hardcoded ARN property", "phase": "LINT" - } - ] - }, - "bad/resources/properties/string_size.yaml": { - "filePath": "bad/resources/properties/string_size.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 3, - "counts": { - "fatal": 5, - "errors": 0, - "warnings": 0, - "informational": 3, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "F3014", - "severity": "FATAL", - "message": "Exactly one of ['Metrics', 'MetricName', 'EvaluationCriteria'] must be specified", - "source": "SCHEMA", + "ruleId": "I1022", + "severity": "INFO", + "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", + "source": "CFN_LINT", "entity": { - "logicalId": "CloudWatchAlarm", + "logicalId": "PolicyWithJoinResource", "entityType": "Resource", - "resourceType": "AWS::CloudWatch::Alarm" + "resourceType": "AWS::IAM::Policy" }, - "propertyPath": "Properties", - "category": "Schema", - "startLine": 14, - "startColumn": 5, - "endLine": 14, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-cloudwatch.git", - "ruleDescription": "Exactly one of properties required (requiredXor)", - "phase": "SCHEMA" + "propertyPath": "Properties.PolicyDocument.Statement.0.Resource.Fn::Join", + "category": "Intrinsic Function", + "startLine": 67, + "startColumn": 15, + "endLine": 67, + "endColumn": 23, + "ruleDescription": "Use Sub instead of Join", + "phase": "LINT" }, { - "ruleId": "F3031", - "severity": "FATAL", - "message": "'' does not match pattern '^[a-zA-Z0-9._\\-]+(?.Arn when Path is not '/'", "category": "Resource", - "startLine": 13, + "startLine": 7, "startColumn": 7, - "endLine": 13, - "endColumn": 22, - "ruleDescription": "Validates RDS DB Instance Class", + "endLine": 7, + "endColumn": 18, + "ruleDescription": "Check if REFing to a IAM resource with path set", "phase": "LINT" }, { - "ruleId": "E3025", - "severity": "ERROR", - "message": "'db.x2e.xlarge' is not one of ['db.m3.2xlarge', 'db.m3.large', 'db.m3.medium', 'db.m3.xlarge', 'db.m4.2xlarge', 'db.m4.4xlarge', 'db.m4.large', 'db.m4.xlarge', 'db.m5.12xlarge', 'db.m5.16xlarge', 'db.m5.2xlarge', 'db.m5.4xlarge', 'db.m5.8xlarge', 'db.m5.large', 'db.m5.xlarge', 'db.m5d.2xlarge', 'db.m5d.4xlarge', 'db.m5d.large', 'db.m5d.xlarge', 'db.m6i.2xlarge', 'db.m6i.32xlarge', 'db.m6i.4xlarge', 'db.m6i.large', 'db.m6i.metal', 'db.m6i.xlarge', 'db.m6id.2xlarge', 'db.m6id.4xlarge', 'db.m6id.large', 'db.m6id.metal', 'db.m6id.xlarge', 'db.m6in.2xlarge', 'db.m6in.4xlarge', 'db.m6in.large', 'db.m6in.xlarge', 'db.m7i.2xlarge', 'db.m7i.4xlarge', 'db.m7i.large', 'db.m7i.metal-24xl', 'db.m7i.metal-48xl', 'db.m7i.xlarge', 'db.m8i.2xlarge', 'db.m8i.4xlarge', 'db.m8i.large', 'db.m8i.metal-48xl', 'db.m8i.metal-96xl', 'db.m8i.xlarge', 'db.r3.2xlarge', 'db.r3.4xlarge', 'db.r3.large', 'db.r3.xlarge', 'db.r4.2xlarge', 'db.r4.4xlarge', 'db.r4.large', 'db.r4.xlarge', 'db.r5.2xlarge', 'db.r5.2xlarge.tpc1.mem2x', 'db.r5.2xlarge.tpc2.mem4x', 'db.r5.2xlarge.tpc2.mem8x', 'db.r5.4xlarge', 'db.r5.4xlarge.tpc2.mem2x', 'db.r5.4xlarge.tpc2.mem3x', 'db.r5.4xlarge.tpc2.mem4x', 'db.r5.8xlarge', 'db.r5.large', 'db.r5.large.tpc1.mem2x', 'db.r5.xlarge', 'db.r5.xlarge.tpc2.mem2x', 'db.r5.xlarge.tpc2.mem4x', 'db.r5b.2xlarge', 'db.r5b.2xlarge.tpc1.mem2x', 'db.r5b.2xlarge.tpc2.mem4x', 'db.r5b.2xlarge.tpc2.mem8x', 'db.r5b.4xlarge', 'db.r5b.4xlarge.tpc2.mem2x', 'db.r5b.4xlarge.tpc2.mem3x', 'db.r5b.4xlarge.tpc2.mem4x', 'db.r5b.large', 'db.r5b.large.tpc1.mem2x', 'db.r5b.xlarge', 'db.r5b.xlarge.tpc2.mem2x', 'db.r5b.xlarge.tpc2.mem4x', 'db.r5d.2xlarge', 'db.r5d.4xlarge', 'db.r5d.large', 'db.r5d.xlarge', 'db.r6i.2xlarge', 'db.r6i.2xlarge.tpc1.mem2x', 'db.r6i.2xlarge.tpc2.mem4x', 'db.r6i.2xlarge.tpc2.mem8x', 'db.r6i.32xlarge', 'db.r6i.4xlarge', 'db.r6i.4xlarge.tpc2.mem2x', 'db.r6i.4xlarge.tpc2.mem3x', 'db.r6i.4xlarge.tpc2.mem4x', 'db.r6i.large', 'db.r6i.large.tpc1.mem2x', 'db.r6i.metal', 'db.r6i.xlarge', 'db.r6i.xlarge.tpc2.mem2x', 'db.r6i.xlarge.tpc2.mem4x', 'db.r6id.2xlarge', 'db.r6id.4xlarge', 'db.r6id.large', 'db.r6id.metal', 'db.r6id.xlarge', 'db.r6in.2xlarge', 'db.r6in.4xlarge', 'db.r6in.large', 'db.r6in.xlarge', 'db.r7i.2xlarge', 'db.r7i.2xlarge.tpc2.mem4x', 'db.r7i.2xlarge.tpc2.mem8x', 'db.r7i.3xlarge.tpc2.mem4x', 'db.r7i.4xlarge', 'db.r7i.4xlarge.tpc2.mem2x', 'db.r7i.4xlarge.tpc2.mem3x', 'db.r7i.4xlarge.tpc2.mem4x', 'db.r7i.large', 'db.r7i.metal-24xl', 'db.r7i.metal-48xl', 'db.r7i.xlarge', 'db.r7i.xlarge.tpc2.mem2x', 'db.r7i.xlarge.tpc2.mem4x', 'db.r8i.2xlarge', 'db.r8i.4xlarge', 'db.r8i.large', 'db.r8i.metal-48xl', 'db.r8i.metal-96xl', 'db.r8i.xlarge', 'db.t2.2xlarge', 'db.t2.large', 'db.t2.medium', 'db.t2.micro', 'db.t2.small', 'db.t2.xlarge', 'db.t3.2xlarge', 'db.t3.large', 'db.t3.medium', 'db.t3.small', 'db.t3.xlarge', 'db.x1e.2xlarge', 'db.x1e.4xlarge', 'db.x1e.xlarge', 'db.x2idn.metal', 'db.x2iedn.2xlarge', 'db.x2iedn.4xlarge', 'db.x2iedn.metal', 'db.x2iedn.xlarge', 'db.x2iezn.2xlarge', 'db.x2iezn.4xlarge', 'db.x2iezn.metal', 'db.z1d.2xlarge', 'db.z1d.3xlarge', 'db.z1d.large', 'db.z1d.xlarge'] when Engine is 'oracle-se2' and LicenseModel is 'bring-your-own-license' in any region", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Path' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "DBInstance2", + "logicalId": "CodeBuildRole", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.DBInstanceClass", - "category": "Resource", - "startLine": 19, + "propertyPath": "Properties.Path", + "category": "Best Practice", + "startLine": 43, "startColumn": 7, - "endLine": 19, - "endColumn": 22, - "ruleDescription": "Validates RDS DB Instance Class", - "phase": "LINT" - }, - { - "ruleId": "E3025", - "severity": "ERROR", - "message": "'db.x1e.xlarge' is not one of ['db.m3.2xlarge', 'db.m3.large', 'db.m3.medium', 'db.m3.xlarge', 'db.m4.2xlarge', 'db.m4.4xlarge', 'db.m4.large', 'db.m4.xlarge', 'db.m5.2xlarge', 'db.m5.4xlarge', 'db.m5.large', 'db.m5.xlarge', 'db.m8i.2xlarge', 'db.m8i.4xlarge', 'db.m8i.large', 'db.m8i.xlarge', 'db.r3.2xlarge', 'db.r3.4xlarge', 'db.r3.large', 'db.r3.xlarge', 'db.r4.2xlarge', 'db.r4.4xlarge', 'db.r4.large', 'db.r4.xlarge', 'db.r5.2xlarge', 'db.r5.4xlarge', 'db.r5.large', 'db.r5.xlarge', 'db.r6i.2xlarge', 'db.r6i.4xlarge', 'db.r6i.large', 'db.r6i.xlarge', 'db.r8i.2xlarge', 'db.r8i.4xlarge', 'db.r8i.large', 'db.r8i.xlarge', 'db.t2.2xlarge', 'db.t2.large', 'db.t2.medium', 'db.t2.micro', 'db.t2.small', 'db.t2.xlarge', 'db.t3.2xlarge', 'db.t3.large', 'db.t3.medium', 'db.t3.small', 'db.t3.xlarge', 'db.x2iedn.4xlarge'] when Engine is 'oracle-se2' and LicenseModel is 'license-included' in any region", - "source": "CFN_LINT", + "endLine": 43, + "endColumn": 11, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "DBInstance3", + "logicalId": "CodeBuildVPC", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::VPC" }, - "propertyPath": "Properties.DBInstanceClass", - "category": "Resource", - "startLine": 26, + "propertyPath": "Properties.CidrBlock", + "category": "Best Practice", + "startLine": 64, "startColumn": 7, - "endLine": 26, - "endColumn": 22, - "ruleDescription": "Validates RDS DB Instance Class", - "phase": "LINT" + "endLine": 64, + "endColumn": 16, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "E9006", - "severity": "ERROR", - "message": "'bad-ee' is not one of ['aurora-mysql', 'aurora-postgresql', 'custom-oracle-ee', 'custom-oracle-ee-cdb', 'custom-sqlserver-ee', 'custom-sqlserver-se', 'custom-sqlserver-web', 'db2-ae', 'db2-se', 'mariadb', 'mysql', 'oracle-ee', 'oracle-ee-cdb', 'oracle-se2', 'oracle-se2-cdb', 'postgres', 'sqlserver-ee', 'sqlserver-ex', 'sqlserver-se', 'sqlserver-web']", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "DBInstance9", + "logicalId": "CodeBuildSubnet", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.Engine", - "category": "Schema", - "startLine": 60, + "propertyPath": "Properties.VpcId", + "category": "Best Practice", + "startLine": 73, "startColumn": 7, - "endLine": 60, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Property value not valid for conditional extension enum", - "phase": "SCHEMA" + "endLine": 73, + "endColumn": 12, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'CodeBuildVPC'" + } }, { - "ruleId": "W9008", - "severity": "WARN", - "message": "RDS instance should have StorageEncrypted set to true", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DBInstance2", + "logicalId": "CodeBuildSubnet", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.StorageEncrypted", - "suggestedFix": "Set StorageEncrypted to true", - "category": "Security", - "startLine": 18, - "startColumn": 5, - "endLine": 18, - "endColumn": 15, - "ruleDescription": "RDS instance should have StorageEncrypted", - "phase": "LINT" + "propertyPath": "Properties.CidrBlock", + "category": "Best Practice", + "startLine": 75, + "startColumn": 7, + "endLine": 75, + "endColumn": 16, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W9008", - "severity": "WARN", - "message": "RDS instance should have StorageEncrypted set to true", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'GroupName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DBInstance3", + "logicalId": "CodeBuildSecurityGroup", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.StorageEncrypted", - "suggestedFix": "Set StorageEncrypted to true", - "category": "Security", - "startLine": 25, - "startColumn": 5, - "endLine": 25, - "endColumn": 15, - "ruleDescription": "RDS instance should have StorageEncrypted", - "phase": "LINT" + "propertyPath": "Properties.GroupName", + "category": "Best Practice", + "startLine": 79, + "startColumn": 7, + "endLine": 79, + "endColumn": 16, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W9008", - "severity": "WARN", - "message": "RDS instance should have StorageEncrypted set to true", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DBInstance4", + "logicalId": "CodeBuildSecurityGroup", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.StorageEncrypted", - "suggestedFix": "Set StorageEncrypted to true", - "category": "Security", - "startLine": 32, - "startColumn": 5, - "endLine": 32, - "endColumn": 15, - "ruleDescription": "RDS instance should have StorageEncrypted", - "phase": "LINT" + "propertyPath": "Properties.GroupDescription", + "category": "Best Practice", + "startLine": 80, + "startColumn": 7, + "endLine": 80, + "endColumn": 23, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W9008", - "severity": "WARN", - "message": "RDS instance should have StorageEncrypted set to true", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DBInstance7", + "logicalId": "CodeBuildSecurityGroup", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.StorageEncrypted", - "suggestedFix": "Set StorageEncrypted to true", - "category": "Security", - "startLine": 44, - "startColumn": 5, - "endLine": 44, - "endColumn": 15, - "ruleDescription": "RDS instance should have StorageEncrypted", - "phase": "LINT" + "propertyPath": "Properties.VpcId", + "category": "Best Practice", + "startLine": 81, + "startColumn": 7, + "endLine": 81, + "endColumn": 12, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'CodeBuildVPC'" + } }, { - "ruleId": "W9008", - "severity": "WARN", - "message": "RDS instance should have StorageEncrypted set to true", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'CodeBuildProject' of type 'AWS::CodeBuild::Project' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "DBInstance8", + "logicalId": "CodeBuildProject", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::CodeBuild::Project" }, - "propertyPath": "Properties.StorageEncrypted", - "suggestedFix": "Set StorageEncrypted to true", - "category": "Security", - "startLine": 51, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 6, "startColumn": 5, - "endLine": 51, + "endLine": 6, "endColumn": 15, - "ruleDescription": "RDS instance should have StorageEncrypted", + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "W9008", - "severity": "WARN", - "message": "RDS instance should have StorageEncrypted set to true", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'CodeBuildRole' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "DBInstance9", + "logicalId": "CodeBuildRole", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.StorageEncrypted", - "suggestedFix": "Set StorageEncrypted to true", - "category": "Security", - "startLine": 58, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 35, "startColumn": 5, - "endLine": 58, + "endLine": 35, "endColumn": 15, - "ruleDescription": "RDS instance should have StorageEncrypted", + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "I3011", + "ruleId": "I9040", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Resource 'CodeBuildSubnet' of type 'AWS::EC2::Subnet' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "DBInstance1", + "logicalId": "CodeBuildSubnet", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Subnet" }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 10, - "startColumn": 3, - "endLine": 10, - "endColumn": 14, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "startLine": 72, + "startColumn": 5, + "endLine": 72, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "I3011", + "ruleId": "I9040", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Resource 'CodeBuildSecurityGroup' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "DBInstance1", + "logicalId": "CodeBuildSecurityGroup", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::SecurityGroup" }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 10, - "startColumn": 3, - "endLine": 10, - "endColumn": 14, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "DBInstance2", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" - }, - "category": "Best Practice", - "startLine": 16, - "startColumn": 3, - "endLine": 16, - "endColumn": 14, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "startLine": 78, + "startColumn": 5, + "endLine": 78, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "bad/resources/iam/resource_policy.yaml": { + "filePath": "bad/resources/iam/resource_policy.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 2, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 2, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I3011", + "ruleId": "I9040", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Resource 'ecr1' of type 'AWS::ECR::Repository' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "DBInstance2", + "logicalId": "ecr1", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::ECR::Repository" }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 16, - "startColumn": 3, - "endLine": 16, - "endColumn": 14, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "startLine": 6, + "startColumn": 5, + "endLine": 6, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "I3011", + "ruleId": "I9040", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Resource 'ecr2' of type 'AWS::ECR::Repository' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "DBInstance3", + "logicalId": "ecr2", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::ECR::Repository" }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 23, - "startColumn": 3, - "endLine": 23, - "endColumn": 14, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "startLine": 19, + "startColumn": 5, + "endLine": 19, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "bad/resources/lambda/function_property_value_limits.yaml": { + "filePath": "bad/resources/lambda/function_property_value_limits.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 3, + "counts": { + "fatal": 6, + "errors": 5, + "warnings": 0, + "informational": 6, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "ruleId": "F1020", + "severity": "FATAL", + "message": "Fn::GetAtt references non-existent resource 'myLambdaExecutionRole'", + "source": "SCHEMA", "entity": { - "logicalId": "DBInstance3", + "logicalId": "myLambdaFunction", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Function" }, - "category": "Best Practice", - "startLine": 23, + "suggestedFix": "Check that the GetAtt target resource exists in the template", + "category": "Intrinsic Function", + "startLine": 6, "startColumn": 3, - "endLine": 23, - "endColumn": 14, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "endLine": 6, + "endColumn": 19, + "ruleDescription": "Ref/GetAtt target must exist", + "phase": "SCHEMA" }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "ruleId": "F1020", + "severity": "FATAL", + "message": "Fn::GetAtt references non-existent resource 'myLambdaExecutionRole'", + "source": "SCHEMA", "entity": { - "logicalId": "DBInstance4", + "logicalId": "myLambdaFunction2", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Function" }, - "category": "Best Practice", - "startLine": 30, + "suggestedFix": "Check that the GetAtt target resource exists in the template", + "category": "Intrinsic Function", + "startLine": 16, "startColumn": 3, - "endLine": 30, - "endColumn": 14, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "endLine": 16, + "endColumn": 20, + "ruleDescription": "Ref/GetAtt target must exist", + "phase": "SCHEMA" }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "ruleId": "F1020", + "severity": "FATAL", + "message": "Fn::GetAtt references non-existent resource 'myLambdaExecutionRole'", + "source": "SCHEMA", "entity": { - "logicalId": "DBInstance4", + "logicalId": "myLambdaFunction3", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Function" }, - "category": "Best Practice", - "startLine": 30, + "suggestedFix": "Check that the GetAtt target resource exists in the template", + "category": "Intrinsic Function", + "startLine": 26, "startColumn": 3, - "endLine": 30, - "endColumn": 14, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "endLine": 26, + "endColumn": 20, + "ruleDescription": "Ref/GetAtt target must exist", + "phase": "SCHEMA" }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "ruleId": "F3031", + "severity": "FATAL", + "message": "'DXPPuqwhVLODAIIVeagGODxciscAVDptCqTYUlDZCNoFchzHdsWBvtQVHjLldJSLrjgbheLambdaName' does not match pattern '^([a-zA-Z0-9_-]{1,64}|arn:[a-zA-Z0-9-]+:lambda:[a-zA-Z0-9-]+:\\d{12}:function:[a-zA-Z0-9_-]{1,64})$'", + "source": "SCHEMA", "entity": { - "logicalId": "DBInstance5", + "logicalId": "myLambdaFunction", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Function" }, - "category": "Best Practice", - "startLine": 36, - "startColumn": 3, - "endLine": 36, - "endColumn": 14, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "propertyPath": "Properties.FunctionName", + "category": "Schema", + "startLine": 9, + "startColumn": 7, + "endLine": 9, + "endColumn": 19, + "ruleDescription": "Value does not match pattern", + "phase": "SCHEMA", + "context": { + "actualValue": "DXPPuqwhVLODAIIVeagGODxciscAVDptCqTYUlDZCNoFchzHdsWBvtQVHjLldJSLrjgbheLambdaName", + "expectedConstraint": "^([a-zA-Z0-9_-]{1,64}|arn:[a-zA-Z0-9-]+:lambda:[a-zA-Z0-9-]+:\\d{12}:function:[a-zA-Z0-9_-]{1,64})$" + } }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "ruleId": "F3033", + "severity": "FATAL", + "message": "length 148 exceeds maximum 128", + "source": "SCHEMA", "entity": { - "logicalId": "DBInstance5", + "logicalId": "myLambdaFunction2", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Function" }, - "category": "Best Practice", - "startLine": 36, - "startColumn": 3, - "endLine": 36, + "propertyPath": "Properties.Handler", + "category": "Schema", + "startLine": 20, + "startColumn": 7, + "endLine": 20, "endColumn": 14, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "ruleDescription": "String length out of bounds", + "phase": "SCHEMA", + "context": { + "actualValue": "DXPPuqwhVLODAIIVeagGODxciscAVDptCqTYUlDZCNoFchzHdsWBvtQVHjLldJSLrjgbheDXPPuqwhVLODAIIVeagGODxciscAVDptCqTYUlDZCNoFchzHdsWBvtQVHjLldJSLrjgbhe.handler", + "extra": { + "actual_length": 148, + "max_length": 128, + "min_length": 0 + } + } }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "ruleId": "F3033", + "severity": "FATAL", + "message": "length 280 exceeds maximum 256", + "source": "SCHEMA", "entity": { - "logicalId": "DBInstance7", + "logicalId": "myLambdaFunction3", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Function" }, - "category": "Best Practice", - "startLine": 42, - "startColumn": 3, - "endLine": 42, - "endColumn": 14, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "propertyPath": "Properties.Description", + "category": "Schema", + "startLine": 30, + "startColumn": 7, + "endLine": 30, + "endColumn": 18, + "ruleDescription": "String length out of bounds", + "phase": "SCHEMA", + "context": { + "actualValue": "DXPPuqwhVLODAIIVeagGODxciscAVDptCqTYUlDZCNoFchzHdsWBvtQVHjLldJSLrjgbheDXPPuqwhVLODAIIVeagGODxciscAVDptCqTYUlDZCNoFchzHdsWBvtQVHjLldJSLrjgbheDXPPuqwhVLODAIIVeagGODxciscAVDptCqTYUlDZCNoFchzHdsWBvtQVHjLldJSLrjgbheDXPPuqwhVLODAIIVeagGODxciscAVDptCqTYUlDZCNoFchzHdsWBvtQVHjLldJSLrjgbhe", + "extra": { + "actual_length": 280, + "max_length": 256, + "min_length": 0 + } + } + }, + { + "ruleId": "E2533", + "severity": "ERROR", + "message": "Runtime 'nodejs10.x' was deprecated on '2021-07-30'. Creation was disabled on '2021-07-30', and updates were disabled on '2022-02-14'. Please consider updating to 'nodejs24.x'", "source": "CFN_LINT", "entity": { - "logicalId": "DBInstance7", + "logicalId": "myLambdaFunction", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Function" }, - "category": "Best Practice", - "startLine": 42, - "startColumn": 3, - "endLine": 42, + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 14, + "startColumn": 7, + "endLine": 14, "endColumn": 14, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "ruleDescription": "Check if Lambda Function Runtimes are updatable", + "phase": "SCHEMA", + "context": { + "actualValue": "nodejs10.x", + "lifecycle": "end-of-life" + } }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "ruleId": "E2533", + "severity": "ERROR", + "message": "Runtime 'nodejs10.x' was deprecated on '2021-07-30'. Creation was disabled on '2021-07-30', and updates were disabled on '2022-02-14'. Please consider updating to 'nodejs24.x'", "source": "CFN_LINT", "entity": { - "logicalId": "DBInstance8", + "logicalId": "myLambdaFunction2", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Function" }, - "category": "Best Practice", - "startLine": 49, - "startColumn": 3, - "endLine": 49, + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 24, + "startColumn": 7, + "endLine": 24, "endColumn": 14, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "ruleDescription": "Check if Lambda Function Runtimes are updatable", + "phase": "SCHEMA", + "context": { + "actualValue": "nodejs10.x", + "lifecycle": "end-of-life" + } }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "ruleId": "E2533", + "severity": "ERROR", + "message": "Runtime 'nodejs10.x' was deprecated on '2021-07-30'. Creation was disabled on '2021-07-30', and updates were disabled on '2022-02-14'. Please consider updating to 'nodejs24.x'", "source": "CFN_LINT", "entity": { - "logicalId": "DBInstance8", + "logicalId": "myLambdaFunction3", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Function" }, - "category": "Best Practice", - "startLine": 49, - "startColumn": 3, - "endLine": 49, + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 35, + "startColumn": 7, + "endLine": 35, "endColumn": 14, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "ruleDescription": "Check if Lambda Function Runtimes are updatable", + "phase": "SCHEMA", + "context": { + "actualValue": "nodejs10.x", + "lifecycle": "end-of-life" + } }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "ruleId": "E3019", + "severity": "ERROR", + "message": "Primary identifiers {'FunctionName': 'LambdaName'} should have unique values across the resources {'myLambdaFunction2', 'myLambdaFunction3'}", "source": "CFN_LINT", "entity": { - "logicalId": "DBInstance9", + "logicalId": "myLambdaFunction2", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Function" }, - "category": "Best Practice", - "startLine": 56, - "startColumn": 3, - "endLine": 56, - "endColumn": 14, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "propertyPath": "Properties.FunctionName", + "category": "Resource", + "startLine": 19, + "startColumn": 7, + "endLine": 19, + "endColumn": 19, + "ruleDescription": "Validate that all resources have unique primary identifiers", "phase": "LINT" }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "ruleId": "E3019", + "severity": "ERROR", + "message": "Primary identifiers {'FunctionName': 'LambdaName'} should have unique values across the resources {'myLambdaFunction2', 'myLambdaFunction3'}", "source": "CFN_LINT", "entity": { - "logicalId": "DBInstance9", + "logicalId": "myLambdaFunction3", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Function" }, - "category": "Best Practice", - "startLine": 56, - "startColumn": 3, - "endLine": 56, - "endColumn": 14, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "propertyPath": "Properties.FunctionName", + "category": "Resource", + "startLine": 29, + "startColumn": 7, + "endLine": 29, + "endColumn": 19, + "ruleDescription": "Validate that all resources have unique primary identifiers", "phase": "LINT" }, { - "ruleId": "I3013", + "ruleId": "I9001", "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "DBInstance2", + "logicalId": "myLambdaFunction", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties", + "propertyPath": "Properties.FunctionName", "category": "Best Practice", - "startLine": 18, - "startColumn": 5, - "endLine": 18, - "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", - "phase": "LINT" + "startLine": 9, + "startColumn": 7, + "endLine": 9, + "endColumn": 19, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3013", + "ruleId": "I9001", "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "DBInstance3", + "logicalId": "myLambdaFunction2", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties", + "propertyPath": "Properties.FunctionName", "category": "Best Practice", - "startLine": 25, - "startColumn": 5, - "endLine": 25, - "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", - "phase": "LINT" + "startLine": 19, + "startColumn": 7, + "endLine": 19, + "endColumn": 19, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3013", + "ruleId": "I9001", "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "DBInstance4", + "logicalId": "myLambdaFunction3", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties", + "propertyPath": "Properties.FunctionName", "category": "Best Practice", - "startLine": 32, - "startColumn": 5, - "endLine": 32, - "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", - "phase": "LINT" + "startLine": 29, + "startColumn": 7, + "endLine": 29, + "endColumn": 19, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3013", + "ruleId": "I9040", "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", + "message": "Resource 'myLambdaFunction' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "DBInstance7", + "logicalId": "myLambdaFunction", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 44, + "startLine": 8, "startColumn": 5, - "endLine": 44, + "endLine": 8, "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "I3013", + "ruleId": "I9040", "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", + "message": "Resource 'myLambdaFunction2' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "DBInstance8", + "logicalId": "myLambdaFunction2", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 51, + "startLine": 18, "startColumn": 5, - "endLine": 51, + "endLine": 18, "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "I3013", + "ruleId": "I9040", "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", + "message": "Resource 'myLambdaFunction3' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "DBInstance9", + "logicalId": "myLambdaFunction3", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 58, + "startLine": 28, "startColumn": 5, - "endLine": 58, + "endLine": 28, "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "bad/resources/lambda/required_properties.yaml": { + "filePath": "bad/resources/lambda/required_properties.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 3, + "counts": { + "fatal": 1, + "errors": 0, + "warnings": 7, + "informational": 4, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "F3003", + "severity": "FATAL", + "message": "'Runtime' is a required property (from extension)", + "source": "SCHEMA", "entity": { - "logicalId": "DBInstance1", + "logicalId": "Function3", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.Engine", - "category": "Best Practice", - "startLine": 14, - "startColumn": 7, - "endLine": 14, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "propertyPath": "Properties", + "suggestedFix": "Add 'Runtime'", + "category": "Schema", + "startLine": 25, + "startColumn": 5, + "endLine": 25, + "endColumn": 15, + "ruleDescription": "Required property missing", + "phase": "SCHEMA" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W2531", + "severity": "WARN", + "message": "Runtime 'python3.9' was deprecated on '2025-12-15'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'python3.14'", + "source": "CFN_LINT", "entity": { - "logicalId": "DBInstance2", + "logicalId": "Function2", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.Engine", - "category": "Best Practice", - "startLine": 20, + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 21, "startColumn": 7, - "endLine": 20, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", + "endLine": 21, + "endColumn": 14, + "ruleDescription": "Check if EOL Lambda Function Runtimes are used", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "actualValue": "python3.9", + "lifecycle": "deprecated" } }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W2533", + "severity": "WARN", + "message": "Properties ['Handler', 'Runtime'] missing for zip file deployment at Resources/Function1/Properties", + "source": "CFN_LINT", "entity": { - "logicalId": "DBInstance3", + "logicalId": "Function1", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.Code", + "suggestedFix": "Add the missing properties for zip file deployment", "category": "Best Practice", - "startLine": 27, + "startLine": 9, "startColumn": 7, - "endLine": 27, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "endLine": 9, + "endColumn": 11, + "ruleDescription": "Check required properties for Lambda if the deployment package is a .zip file", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W2533", + "severity": "WARN", + "message": "Properties ['Handler'] missing for zip file deployment at Resources/Function2/Properties", + "source": "CFN_LINT", "entity": { - "logicalId": "DBInstance4", + "logicalId": "Function2", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.Code", + "suggestedFix": "Add the missing properties for zip file deployment", "category": "Best Practice", - "startLine": 34, + "startLine": 18, "startColumn": 7, - "endLine": 34, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "endLine": 18, + "endColumn": 11, + "ruleDescription": "Check required properties for Lambda if the deployment package is a .zip file", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W2533", + "severity": "WARN", + "message": "Properties ['Runtime'] missing for zip file deployment at Resources/Function3/Properties", + "source": "CFN_LINT", "entity": { - "logicalId": "DBInstance5", + "logicalId": "Function3", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.Code", + "suggestedFix": "Add the missing properties for zip file deployment", "category": "Best Practice", - "startLine": 40, + "startLine": 28, "startColumn": 7, - "endLine": 40, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only", - "resolutionSource": "parameter 'DatabaseEngine' (type String)" - } + "endLine": 28, + "endColumn": 11, + "ruleDescription": "Check required properties for Lambda if the deployment package is a .zip file", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "ruleId": "W9013", + "severity": "WARN", + "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", "source": "ENGINE", "entity": { - "logicalId": "DBInstance7", + "logicalId": "Function1", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.Engine", - "category": "Best Practice", - "startLine": 46, - "startColumn": 7, - "endLine": 46, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "category": "Security", + "startLine": 4, + "startColumn": 3, + "endLine": 4, + "endColumn": 12, + "ruleDescription": "Hardcoded account ID in ARN", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "ruleId": "W9013", + "severity": "WARN", + "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", "source": "ENGINE", "entity": { - "logicalId": "DBInstance8", + "logicalId": "Function2", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.Engine", - "category": "Best Practice", - "startLine": 53, - "startColumn": 7, - "endLine": 53, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "category": "Security", + "startLine": 13, + "startColumn": 3, + "endLine": 13, + "endColumn": 12, + "ruleDescription": "Hardcoded account ID in ARN", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "ruleId": "W9013", + "severity": "WARN", + "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", "source": "ENGINE", "entity": { - "logicalId": "DBInstance9", + "logicalId": "Function3", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.Engine", - "category": "Best Practice", - "startLine": 60, - "startColumn": 7, - "endLine": 60, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } - }, - { - "ruleId": "I9003", - "severity": "INFO", - "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", - "source": "ENGINE", - "category": "Best Practice", - "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", + "category": "Security", + "startLine": 23, + "startColumn": 3, + "endLine": 23, + "endColumn": 12, + "ruleDescription": "Hardcoded account ID in ARN", "phase": "LINT" }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'DBInstance1' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "message": "Property 'PackageType' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DBInstance1", + "logicalId": "Function2", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.PackageType", "category": "Best Practice", - "startLine": 12, - "startColumn": 5, - "endLine": 12, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 22, + "startColumn": 7, + "endLine": 22, + "endColumn": 18, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'DBInstance2' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "message": "Resource 'Function1' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "DBInstance2", + "logicalId": "Function1", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Function" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 18, + "startLine": 6, "startColumn": 5, - "endLine": 18, + "endLine": 6, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -3080,19 +2963,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'DBInstance3' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "message": "Resource 'Function2' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "DBInstance3", + "logicalId": "Function2", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Function" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 25, + "startLine": 15, "startColumn": 5, - "endLine": 25, + "endLine": 15, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -3100,79 +2983,96 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'DBInstance4' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "message": "Resource 'Function3' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "DBInstance4", + "logicalId": "Function3", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Function" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 32, + "startLine": 25, "startColumn": 5, - "endLine": 32, + "endLine": 25, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "bad/resources/name.yaml": { + "filePath": "bad/resources/name.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 2, + "counts": { + "fatal": 2, + "errors": 0, + "warnings": 0, + "informational": 2, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'DBInstance5' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "F0006", + "severity": "FATAL", + "message": "Logical ID 'my.Instance' must be alphanumeric (A-Za-z0-9)", + "source": "SCHEMA", "entity": { - "logicalId": "DBInstance5", + "logicalId": "my.Instance", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 38, - "startColumn": 5, - "endLine": 38, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "category": "Structure", + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Logical IDs must be alphanumeric", + "phase": "SCHEMA" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'DBInstance7' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "F0006", + "severity": "FATAL", + "message": "Logical ID 'my_Instance' must be alphanumeric (A-Za-z0-9)", + "source": "SCHEMA", "entity": { - "logicalId": "DBInstance7", + "logicalId": "my_Instance", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 44, - "startColumn": 5, - "endLine": 44, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "category": "Structure", + "startLine": 7, + "startColumn": 3, + "endLine": 7, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Logical IDs must be alphanumeric", + "phase": "SCHEMA" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'DBInstance8' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "message": "Resource 'my.Instance' of type 'AWS::EC2::Instance' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "DBInstance8", + "logicalId": "my.Instance", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 51, + "startLine": 5, "startColumn": 5, - "endLine": 51, + "endLine": 5, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -3180,35 +3080,35 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'DBInstance9' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "message": "Resource 'my_Instance' of type 'AWS::EC2::Instance' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "DBInstance9", + "logicalId": "my_Instance", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 58, + "startLine": 9, "startColumn": 5, - "endLine": 58, + "endLine": 9, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "bad/resources/rds/not_enum_master_username.yaml": { - "filePath": "bad/resources/rds/not_enum_master_username.yaml", + "bad/resources/primary_identifiers.yaml": { + "filePath": "bad/resources/primary_identifiers.yaml", "status": "OK", "metadata": { - "resourcesScanned": 1, + "resourcesScanned": 13, "counts": { - "fatal": 1, - "errors": 0, - "warnings": 1, - "informational": 6, + "fatal": 0, + "errors": 11, + "warnings": 0, + "informational": 25, "debug": 0 }, "suppressed": 0, @@ -3217,437 +3117,391 @@ }, "diagnostics": [ { - "ruleId": "F3017", - "severity": "FATAL", - "message": "'rdsadmin' at 'MasterUsername' does not satisfy the composition branch constraint (none of ['rdsadmin']): 'rdsadmin' must not be one of ['rdsadmin']", - "source": "SCHEMA", + "ruleId": "E3001", + "severity": "ERROR", + "message": "Resource 'BadType' property 'Type' must be a string", + "source": "CFN_LINT", "entity": { - "logicalId": "MyDB", + "logicalId": "BadType", "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" + "resourceType": "" }, - "propertyPath": "Properties.MasterUsername", - "category": "Schema", - "startLine": 7, - "startColumn": 7, - "endLine": 7, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", - "ruleDescription": "Value not valid under anyOf", - "phase": "SCHEMA" + "category": "Resource", + "startLine": 156, + "startColumn": 5, + "endLine": 156, + "endColumn": 9, + "ruleDescription": "Basic CloudFormation Resource Check", + "phase": "PARSE" }, { - "ruleId": "W2501", - "severity": "WARN", - "message": "Property 'MasterUserPassword' should not be a hardcoded string - use a parameter with NoEcho or a dynamic reference", + "ruleId": "E3019", + "severity": "ERROR", + "message": "Primary identifiers {'RoleName': 'root'} should have unique values across the resources {'RootRole', 'RootRole2'}", "source": "CFN_LINT", "entity": { - "logicalId": "MyDB", + "logicalId": "RootRole", "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.MasterUserPassword", - "category": "Security", - "startLine": 8, + "propertyPath": "Properties.RoleName", + "category": "Resource", + "startLine": 18, "startColumn": 7, - "endLine": 8, - "endColumn": 25, - "ruleDescription": "Check if Password Properties are correctly configured", + "endLine": 18, + "endColumn": 15, + "ruleDescription": "Validate that all resources have unique primary identifiers", "phase": "LINT" }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "ruleId": "E3019", + "severity": "ERROR", + "message": "Primary identifiers {'RoleName': 'root'} should have unique values across the resources {'RootRole', 'RootRole2'}", "source": "CFN_LINT", "entity": { - "logicalId": "MyDB", + "logicalId": "RootRole2", "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" + "resourceType": "AWS::IAM::Role" }, - "category": "Best Practice", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 7, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "propertyPath": "Properties.RoleName", + "category": "Resource", + "startLine": 40, + "startColumn": 7, + "endLine": 40, + "endColumn": 15, + "ruleDescription": "Validate that all resources have unique primary identifiers", "phase": "LINT" }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "ruleId": "E3019", + "severity": "ERROR", + "message": "Primary identifiers {'RoleName': 'useast1'} should have unique values across the resources {'RootRole3', 'RootRole4', 'RootRole5', 'RootRole6'}", "source": "CFN_LINT", "entity": { - "logicalId": "MyDB", + "logicalId": "RootRole3", "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" + "resourceType": "AWS::IAM::Role" }, - "category": "Best Practice", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 7, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "propertyPath": "Properties.RoleName", + "category": "Resource", + "startLine": 63, + "startColumn": 7, + "endLine": 63, + "endColumn": 15, + "ruleDescription": "Validate that all resources have unique primary identifiers", "phase": "LINT" }, { - "ruleId": "I3013", - "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "ruleId": "E3019", + "severity": "ERROR", + "message": "Primary identifiers {'RoleName': 'useast1'} should have unique values across the resources {'RootRole3', 'RootRole4', 'RootRole5', 'RootRole6'}", "source": "CFN_LINT", "entity": { - "logicalId": "MyDB", + "logicalId": "RootRole4", "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties", - "category": "Best Practice", - "startLine": 5, - "startColumn": 5, - "endLine": 5, + "propertyPath": "Properties.RoleName", + "category": "Resource", + "startLine": 86, + "startColumn": 7, + "endLine": 86, "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "ruleDescription": "Validate that all resources have unique primary identifiers", "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "E3019", + "severity": "ERROR", + "message": "Primary identifiers {'RoleName': 'useast1'} should have unique values across the resources {'RootRole3', 'RootRole4', 'RootRole5', 'RootRole6'}", + "source": "CFN_LINT", "entity": { - "logicalId": "MyDB", + "logicalId": "RootRole5", "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.Engine", - "category": "Best Practice", - "startLine": 6, + "propertyPath": "Properties.RoleName", + "category": "Resource", + "startLine": 109, "startColumn": 7, - "endLine": 6, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "endLine": 109, + "endColumn": 15, + "ruleDescription": "Validate that all resources have unique primary identifiers", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'MasterUsername' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "E3019", + "severity": "ERROR", + "message": "Primary identifiers {'RoleName': 'useast1'} should have unique values across the resources {'RootRole3', 'RootRole4', 'RootRole5', 'RootRole6'}", + "source": "CFN_LINT", "entity": { - "logicalId": "MyDB", + "logicalId": "RootRole6", "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.MasterUsername", - "category": "Best Practice", - "startLine": 7, + "propertyPath": "Properties.RoleName", + "category": "Resource", + "startLine": 131, "startColumn": 7, - "endLine": 7, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "endLine": 131, + "endColumn": 15, + "ruleDescription": "Validate that all resources have unique primary identifiers", + "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'MyDB' of type 'AWS::RDS::DBCluster' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "E3019", + "severity": "ERROR", + "message": "Primary identifiers {'BucketName': 'us-east-1'} should have unique values across the resources {'Bucket1', 'Bucket2'}", + "source": "CFN_LINT", "entity": { - "logicalId": "MyDB", + "logicalId": "Bucket1", "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 5, + "propertyPath": "Properties.BucketName", + "category": "Resource", + "startLine": 142, "startColumn": 5, - "endLine": 5, + "endLine": 142, "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Validate that all resources have unique primary identifiers", "phase": "LINT" - } - ] - }, - "bad/resources/rds/not_enum_master_username_join.yaml": { - "filePath": "bad/resources/rds/not_enum_master_username_join.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 1, - "errors": 0, - "warnings": 0, - "informational": 3, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "F3017", - "severity": "FATAL", - "message": "'rdsadmin' at 'MasterUsername' does not satisfy the composition branch constraint (none of ['rdsadmin']): 'rdsadmin' must not be one of ['rdsadmin']", - "source": "SCHEMA", + "ruleId": "E3019", + "severity": "ERROR", + "message": "Primary identifiers {'BucketName': 'us-east-1'} should have unique values across the resources {'Bucket1', 'Bucket2'}", + "source": "CFN_LINT", "entity": { - "logicalId": "JoinedUsername", + "logicalId": "Bucket2", "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.MasterUsername", - "category": "Schema", - "startLine": 9, + "propertyPath": "Properties.BucketName", + "category": "Resource", + "startLine": 150, "startColumn": 7, - "endLine": 9, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", - "ruleDescription": "Value not valid under anyOf", - "phase": "SCHEMA" + "endLine": 150, + "endColumn": 17, + "ruleDescription": "Validate that all resources have unique primary identifiers", + "phase": "LINT" }, { - "ruleId": "I1022", - "severity": "INFO", - "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", + "ruleId": "E3019", + "severity": "ERROR", + "message": "Primary identifiers {'Name': 'myProjectName'} should have unique values across the resources {'Project1', 'Project2'}", "source": "CFN_LINT", "entity": { - "logicalId": "JoinedUsername", + "logicalId": "Project1", "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" + "resourceType": "AWS::CodeBuild::Project" }, - "propertyPath": "Properties.MasterUsername.Fn::Join", - "category": "Intrinsic Function", - "startLine": 9, + "propertyPath": "Properties.Name", + "category": "Resource", + "startLine": 168, "startColumn": 7, - "endLine": 9, - "endColumn": 15, - "ruleDescription": "Use Sub instead of Join", + "endLine": 168, + "endColumn": 11, + "ruleDescription": "Validate that all resources have unique primary identifiers", + "phase": "LINT" + }, + { + "ruleId": "E3019", + "severity": "ERROR", + "message": "Primary identifiers {'Name': 'myProjectName'} should have unique values across the resources {'Project1', 'Project2'}", + "source": "CFN_LINT", + "entity": { + "logicalId": "Project2", + "entityType": "Resource", + "resourceType": "AWS::CodeBuild::Project" + }, + "propertyPath": "Properties.Name", + "category": "Resource", + "startLine": 188, + "startColumn": 7, + "endLine": 188, + "endColumn": 11, + "ruleDescription": "Validate that all resources have unique primary identifiers", "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'Path' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "JoinedUsername", + "logicalId": "RootRole", "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.Path", "category": "Best Practice", - "startLine": 8, + "startLine": 17, "startColumn": 7, - "endLine": 8, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", + "endLine": 17, + "endColumn": 11, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'MasterUsername' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'RoleName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "JoinedUsername", + "logicalId": "RootRole", "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.MasterUsername", + "propertyPath": "Properties.RoleName", "category": "Best Practice", - "startLine": 9, + "startLine": 18, "startColumn": 7, - "endLine": 9, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", + "endLine": 18, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only" } - } - ] - }, - "bad/resources/s3/access-control-obsolete.yaml": { - "filePath": "bad/resources/s3/access-control-obsolete.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 2, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 2, - "informational": 2, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "W3045", - "severity": "WARN", - "message": "AccessControl property is deprecated. Use bucket policies instead", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Path' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Bucket1", + "logicalId": "RootRole2", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.AccessControl", - "suggestedFix": "Remove AccessControl and use an AWS::S3::BucketPolicy resource", - "category": "Deprecation", - "startLine": 6, + "propertyPath": "Properties.Path", + "category": "Best Practice", + "startLine": 39, "startColumn": 7, - "endLine": 6, - "endColumn": 20, - "ruleDescription": "Controlling access to an S3 bucket should be done with bucket policies", - "phase": "LINT", + "endLine": 39, + "endColumn": 11, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", "context": { - "actualValue": "Private" + "lifecycle": "create-only" } }, { - "ruleId": "W3045", - "severity": "WARN", - "message": "AccessControl property is deprecated. Use bucket policies instead", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'RoleName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Bucket2", + "logicalId": "RootRole2", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.AccessControl", - "suggestedFix": "Remove AccessControl and use an AWS::S3::BucketPolicy resource", - "category": "Deprecation", - "startLine": 11, + "propertyPath": "Properties.RoleName", + "category": "Best Practice", + "startLine": 40, "startColumn": 7, - "endLine": 11, - "endColumn": 20, - "ruleDescription": "Controlling access to an S3 bucket should be done with bucket policies", - "phase": "LINT", + "endLine": 40, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", "context": { - "actualValue": "BucketOwnerFullControl" + "lifecycle": "create-only" } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'Bucket1' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Property 'Path' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Bucket1", + "logicalId": "RootRole3", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.Path", "category": "Best Practice", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 62, + "startColumn": 7, + "endLine": 62, + "endColumn": 11, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'Bucket2' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Property 'RoleName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Bucket2", + "logicalId": "RootRole3", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.RoleName", "category": "Best Practice", - "startLine": 10, - "startColumn": 5, - "endLine": 10, + "startLine": 63, + "startColumn": 7, + "endLine": 63, "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "bad/resources/sns/topic_name.yaml": { - "filePath": "bad/resources/sns/topic_name.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 1, - "errors": 0, - "warnings": 0, - "informational": 2, - "debug": 0 + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "F3033", - "severity": "FATAL", - "message": "length 362 exceeds maximum 256", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Path' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "MyTopic", + "logicalId": "RootRole4", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.TopicName", - "category": "Schema", - "startLine": 7, + "propertyPath": "Properties.Path", + "category": "Best Practice", + "startLine": 85, "startColumn": 7, - "endLine": 7, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sns", - "ruleDescription": "String length out of bounds", + "endLine": 85, + "endColumn": 11, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "actualValue": "DXPPuqwhVLODAIIVeagGODxciscAVDptCqTYUlDZCNoFchzHdsWBvtQVHjLldJSLrjgbheDXPPuqwhVLODAIIVeagGODxciscAVDptCqTYUlDZCNoFchzHdsWBvtQVHjLldJSLrjgbheDXPPuqwhVLODAIIVeagGODxciscAVDptCqTYUlDZCNoFchzHdsWBvtQVHjLldJSLrjgbheDXPPuqwhVLODAIIVeagGODxciscAVDptCqTYUlDZCNoFchzHdsWBvtQVHjLldJSLrjgbheDXPPuqwhVLODAIIVeagGODxciscAVDptCqTYUlDZCNoFchzHdsWBvtQVHjLldJSLrjgbheSNSTopicName", - "extra": { - "actual_length": 362, - "max_length": 256 - } + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'TopicName' is create-only; updating it will cause resource replacement", + "message": "Property 'RoleName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MyTopic", + "logicalId": "RootRole4", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.TopicName", + "propertyPath": "Properties.RoleName", "category": "Best Practice", - "startLine": 7, + "startLine": 86, "startColumn": 7, - "endLine": 7, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sns", + "endLine": 86, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -3655,156 +3509,160 @@ } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'MyTopic' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Property 'Path' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MyTopic", + "logicalId": "RootRole5", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.Path", "category": "Best Practice", - "startLine": 6, - "startColumn": 5, - "endLine": 6, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "bad/resources/uniqueNames.yaml": { - "filePath": "bad/resources/uniqueNames.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 1, - "errors": 0, - "warnings": 1, - "informational": 1, - "debug": 0 + "startLine": 108, + "startColumn": 7, + "endLine": 108, + "endColumn": 11, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "F3007", - "severity": "FATAL", - "message": "'Name' is used as both a parameter and resource logical ID", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'RoleName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Name", + "logicalId": "RootRole5", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::IAM::Role" }, - "category": "Structure", - "startLine": 5, - "startColumn": 3, - "endLine": 5, - "endColumn": 7, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sns", - "ruleDescription": "Logical ID used as both parameter and resource", - "phase": "SCHEMA" + "propertyPath": "Properties.RoleName", + "category": "Best Practice", + "startLine": 109, + "startColumn": 7, + "endLine": 109, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Fn::If on condition 'IsUsEast1'" + } }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Name' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Path' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Name", - "entityType": "Parameter" + "logicalId": "RootRole6", + "entityType": "Resource", + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Parameters/Name", + "propertyPath": "Properties.Path", "category": "Best Practice", - "startLine": 2, - "startColumn": 3, - "endLine": 2, - "endColumn": 7, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "startLine": 130, + "startColumn": 7, + "endLine": 130, + "endColumn": 11, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'Name' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Property 'RoleName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Name", + "logicalId": "RootRole6", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.RoleName", "category": "Best Practice", - "startLine": 5, - "startColumn": 3, - "endLine": 5, - "endColumn": 7, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "bad/resources/update_policy_unsupported_e3016.yaml": { - "filePath": "bad/resources/update_policy_unsupported_e3016.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 0, - "informational": 2, - "debug": 0 + "startLine": 131, + "startColumn": 7, + "endLine": 131, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Fn::If on condition 'IsUsEast1'" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "E3016", - "severity": "ERROR", - "message": "UpdatePolicy is not supported on resource type 'AWS::S3::Bucket'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "MyBucket", + "logicalId": "Bucket2", "entityType": "Resource", "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "UpdatePolicy", - "suggestedFix": "Remove UpdatePolicy or change resource type to one of: AWS::AppStream::Fleet, AWS::AutoScaling::AutoScalingGroup, AWS::ElastiCache::ReplicationGroup, AWS::Elasticsearch::Domain, AWS::Lambda::Alias, AWS::OpenSearchService::Domain", - "category": "Resource", - "startLine": 5, - "startColumn": 5, - "endLine": 5, + "propertyPath": "Properties.BucketName", + "category": "Best Practice", + "startLine": 150, + "startColumn": 7, + "endLine": 150, "endColumn": 17, - "ruleDescription": "Check UpdatePolicy values for Resources", - "phase": "LINT" + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Fn::If on condition 'IsUsEast1'" + } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", + "message": "Property 'Name' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MyBucket", + "logicalId": "Project1", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::CodeBuild::Project" }, - "propertyPath": "Properties.BucketName", + "propertyPath": "Properties.Name", "category": "Best Practice", - "startLine": 9, + "startLine": 168, "startColumn": 7, - "endLine": 9, - "endColumn": 17, + "endLine": 168, + "endColumn": 11, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Name' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "Project2", + "entityType": "Resource", + "resourceType": "AWS::CodeBuild::Project" + }, + "propertyPath": "Properties.Name", + "category": "Best Practice", + "startLine": 188, + "startColumn": 7, + "endLine": 188, + "endColumn": 11, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -3814,1614 +3672,1793 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'MyBucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Resource 'RootRole' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "MyBucket", + "logicalId": "RootRole", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::IAM::Role" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 8, + "startLine": 7, "startColumn": 5, - "endLine": 8, + "endLine": 7, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" - } - ] - }, - "bad/resources_circular_dependency.yaml": { - "filePath": "bad/resources_circular_dependency.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 11, - "counts": { - "fatal": 6, - "errors": 9, - "warnings": 9, - "informational": 38, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "F3004", - "severity": "FATAL", - "message": "Circular Dependencies for resource mySecurityGroupVpc1. Circular dependency with [mySecurityGroupVpc1 -> mySecurityGroupVpc2 -> mySecurityGroupVpc1]", - "source": "SCHEMA", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'RootRole2' of type 'AWS::IAM::Role' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "mySecurityGroupVpc1", + "logicalId": "RootRole2", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Resources/mySecurityGroupVpc1", - "category": "Reference", - "startLine": 23, - "startColumn": 3, - "endLine": 23, - "endColumn": 22, - "ruleDescription": "Circular dependency detected", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 29, + "startColumn": 5, + "endLine": 29, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "F3004", - "severity": "FATAL", - "message": "Circular Dependencies for resource mySecurityGroupVpc2. Circular dependency with [mySecurityGroupVpc2 -> mySecurityGroupVpc1 -> mySecurityGroupVpc2]", - "source": "SCHEMA", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'RootRole3' of type 'AWS::IAM::Role' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "mySecurityGroupVpc2", + "logicalId": "RootRole3", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Resources/mySecurityGroupVpc2", - "category": "Reference", - "startLine": 33, - "startColumn": 3, - "endLine": 33, - "endColumn": 22, - "ruleDescription": "Circular dependency detected", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 52, + "startColumn": 5, + "endLine": 52, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "F3004", - "severity": "FATAL", - "message": "Circular Dependencies for resource mySecurityGroupVpc3. Circular dependency with [mySecurityGroupVpc3 -> mySecurityGroupVpc3]", - "source": "SCHEMA", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'RootRole4' of type 'AWS::IAM::Role' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "mySecurityGroupVpc3", + "logicalId": "RootRole4", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Resources/mySecurityGroupVpc3", - "category": "Reference", - "startLine": 41, - "startColumn": 3, - "endLine": 41, - "endColumn": 22, - "ruleDescription": "Circular dependency detected", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 75, + "startColumn": 5, + "endLine": 75, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "F3004", - "severity": "FATAL", - "message": "Circular Dependencies for resource myRoleToWriteToS3. Circular dependency with [myRoleToWriteToS3 -> myKms -> myInstanceProfile -> myRoleToWriteToS3]", - "source": "SCHEMA", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'RootRole5' of type 'AWS::IAM::Role' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "myRoleToWriteToS3", + "logicalId": "RootRole5", "entityType": "Resource", "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Resources/myRoleToWriteToS3", - "category": "Reference", - "startLine": 96, - "startColumn": 3, - "endLine": 96, - "endColumn": 20, - "ruleDescription": "Circular dependency detected", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 98, + "startColumn": 5, + "endLine": 98, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "F3004", - "severity": "FATAL", - "message": "Circular Dependencies for resource myInstanceProfile. Circular dependency with [myInstanceProfile -> myRoleToWriteToS3 -> myKms -> myInstanceProfile]", - "source": "SCHEMA", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'RootRole6' of type 'AWS::IAM::Role' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "myInstanceProfile", + "logicalId": "RootRole6", "entityType": "Resource", - "resourceType": "AWS::IAM::InstanceProfile" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Resources/myInstanceProfile", - "category": "Reference", - "startLine": 145, - "startColumn": 3, - "endLine": 145, - "endColumn": 20, - "ruleDescription": "Circular dependency detected", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 120, + "startColumn": 5, + "endLine": 120, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "F3004", - "severity": "FATAL", - "message": "Circular Dependencies for resource myKms. Circular dependency with [myKms -> myInstanceProfile -> myRoleToWriteToS3 -> myKms]", - "source": "SCHEMA", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Bucket1' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "myKms", + "logicalId": "Bucket1", "entityType": "Resource", - "resourceType": "AWS::KMS::Key" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Resources/myKms", - "category": "Reference", - "startLine": 153, - "startColumn": 3, - "endLine": 153, - "endColumn": 8, - "ruleDescription": "Circular dependency detected", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 142, + "startColumn": 5, + "endLine": 142, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "E1150", - "severity": "ERROR", - "message": "'sg-1234567' does not match format 'AWS::EC2::SecurityGroup.Id'", - "source": "CFN_LINT", - "entity": { - "logicalId": "mySecurityGroupVpc1", - "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" - }, - "propertyPath": "Properties.SecurityGroupIngress.0.SourceSecurityGroupId", - "category": "Intrinsic Function", - "startLine": 30, - "startColumn": 11, - "endLine": 30, - "endColumn": 32, - "ruleDescription": "Validate security group format", - "phase": "SCHEMA", - "context": { - "actualValue": "sg-1234567" - } - }, - { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'String' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", - "entity": { - "logicalId": "myInstanceSub", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 216, - "startColumn": 7, - "endLine": 216, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "String" - } - }, - { - "ruleId": "E3048", - "severity": "ERROR", - "message": "Fargate requires Cpu to be specified", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Bucket2' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "taskdefinition", + "logicalId": "Bucket2", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties", - "suggestedFix": "Set Cpu to a valid Fargate value (256, 512, 1024, 2048, 4096, 8192, 16384, or 32768)", - "category": "Resource", - "startLine": 222, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 149, "startColumn": 5, - "endLine": 222, + "endLine": 149, "endColumn": 15, - "ruleDescription": "Validate ECS Fargate tasks have required properties and values", + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "E3048", - "severity": "ERROR", - "message": "Fargate requires Memory to be specified", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Project1' of type 'AWS::CodeBuild::Project' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "taskdefinition", + "logicalId": "Project1", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::CodeBuild::Project" }, - "propertyPath": "Properties", - "suggestedFix": "Set Memory to a valid Fargate value", - "category": "Resource", - "startLine": 222, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 167, "startColumn": 5, - "endLine": 222, + "endLine": 167, "endColumn": 15, - "ruleDescription": "Validate ECS Fargate tasks have required properties and values", + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "E3048", - "severity": "ERROR", - "message": "Fargate requires NetworkMode to be specified as 'awsvpc'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Project2' of type 'AWS::CodeBuild::Project' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "taskdefinition", + "logicalId": "Project2", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::CodeBuild::Project" }, - "propertyPath": "Properties", - "suggestedFix": "Set NetworkMode to 'awsvpc'", - "category": "Resource", - "startLine": 222, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 187, "startColumn": 5, - "endLine": 222, + "endLine": 187, "endColumn": 15, - "ruleDescription": "Validate ECS Fargate tasks have required properties and values", + "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "bad/resources/properties/atleastone.yaml": { + "filePath": "bad/resources/properties/atleastone.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 2, + "counts": { + "fatal": 2, + "errors": 1, + "warnings": 0, + "informational": 0, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "E3687", - "severity": "ERROR", - "message": "['FromPort', 'ToPort'] are required properties when using 'IpProtocol' value 1", - "source": "CFN_LINT", + "ruleId": "F3017", + "severity": "FATAL", + "message": "Value is not valid under any of the 3 anyOf schemas for AWS::IAM::Policy (0 branches matched; at least one is required). Required property combinations: ['Groups'] or ['Roles'] or ['Users']. Branch failures: branch 1: 'Users' is a required property; branch 2: 'Groups' is a required property; branch 3: 'Roles' is a required property.", + "source": "SCHEMA", "entity": { - "logicalId": "mySecurityGroupVpc1", + "logicalId": "myPolicy", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::IAM::Policy" }, - "propertyPath": "Properties.SecurityGroupIngress.0", - "category": "Resource", - "startLine": 29, - "startColumn": 21, - "endLine": 29, - "endColumn": 22, - "ruleDescription": "Validate to and from ports based on the protocol", - "phase": "LINT" + "propertyPath": "Properties", + "category": "Schema", + "startLine": 10, + "startColumn": 5, + "endLine": 10, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "ruleDescription": "Value not valid under anyOf", + "phase": "SCHEMA", + "context": { + "expectedConstraint": "at least one anyOf branch", + "extra": { + "branchCount": 3, + "branchFailures": [ + { + "branch": 1, + "reasons": [ + { + "message": "'Users' is a required property", + "propertyPath": "Properties" + } + ] + }, + { + "branch": 2, + "reasons": [ + { + "message": "'Groups' is a required property", + "propertyPath": "Properties" + } + ] + }, + { + "branch": 3, + "reasons": [ + { + "message": "'Roles' is a required property", + "propertyPath": "Properties" + } + ] + } + ], + "compositionKind": "anyOf", + "matchCount": 0, + "matchOutcome": "zeroMatches", + "validPropertyCombinations": [ + [ + "Groups" + ], + [ + "Roles" + ], + [ + "Users" + ] + ] + } + } }, { - "ruleId": "E3687", - "severity": "ERROR", - "message": "['FromPort', 'ToPort'] are required properties when using 'IpProtocol' value 1", - "source": "CFN_LINT", + "ruleId": "F3017", + "severity": "FATAL", + "message": "Value is not valid under any of the 3 anyOf schemas for AWS::IAM::Policy (0 branches matched; at least one is required). Required property combinations: ['Groups'] or ['Roles'] or ['Users']. Branch failures: branch 1: 'Users' is a required property; branch 2: 'Groups' is a required property; branch 3: 'Roles' is a required property.", + "source": "SCHEMA", "entity": { - "logicalId": "mySecurityGroupVpc1", + "logicalId": "myPolicy2", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::IAM::Policy" }, - "propertyPath": "Properties.SecurityGroupIngress.1", - "category": "Resource", - "startLine": 31, - "startColumn": 21, - "endLine": 31, - "endColumn": 22, - "ruleDescription": "Validate to and from ports based on the protocol", - "phase": "LINT" - }, - { - "ruleId": "E3687", - "severity": "ERROR", - "message": "['FromPort', 'ToPort'] are required properties when using 'IpProtocol' value 1", - "source": "CFN_LINT", - "entity": { - "logicalId": "mySecurityGroupVpc2", - "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "propertyPath": "Properties", + "category": "Schema", + "startLine": 16, + "startColumn": 5, + "endLine": 16, + "endColumn": 15, + "conditionScenario": { + "cPrimaryRegion": true }, - "propertyPath": "Properties.SecurityGroupIngress.0", - "category": "Resource", - "startLine": 39, - "startColumn": 21, - "endLine": 39, - "endColumn": 22, - "ruleDescription": "Validate to and from ports based on the protocol", - "phase": "LINT" + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "ruleDescription": "Value not valid under anyOf", + "phase": "SCHEMA", + "context": { + "expectedConstraint": "at least one anyOf branch", + "extra": { + "branchCount": 3, + "branchFailures": [ + { + "branch": 1, + "reasons": [ + { + "message": "'Users' is a required property", + "propertyPath": "Properties" + } + ] + }, + { + "branch": 2, + "reasons": [ + { + "message": "'Groups' is a required property", + "propertyPath": "Properties" + } + ] + }, + { + "branch": 3, + "reasons": [ + { + "message": "'Roles' is a required property", + "propertyPath": "Properties" + } + ] + } + ], + "compositionKind": "anyOf", + "matchCount": 0, + "matchOutcome": "zeroMatches", + "validPropertyCombinations": [ + [ + "Groups" + ], + [ + "Roles" + ], + [ + "Users" + ] + ] + } + } }, { - "ruleId": "E3687", + "ruleId": "E3510", "severity": "ERROR", - "message": "['FromPort', 'ToPort'] are required properties when using 'IpProtocol' value 1", + "message": "'Statement' is a required property", "source": "CFN_LINT", "entity": { - "logicalId": "mySecurityGroupVpc3", + "logicalId": "myPolicy", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::IAM::Policy" }, - "propertyPath": "Properties.SecurityGroupIngress.0", + "propertyPath": "Properties.PolicyDocument", "category": "Resource", - "startLine": 47, - "startColumn": 21, - "endLine": 47, - "endColumn": 22, - "ruleDescription": "Validate to and from ports based on the protocol", + "startLine": 13, + "startColumn": 7, + "endLine": 13, + "endColumn": 21, + "ruleDescription": "Validate identity based IAM policies", "phase": "LINT" + } + ] + }, + "bad/resources/properties/custom.yaml": { + "filePath": "bad/resources/properties/custom.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 0, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [] + }, + "bad/resources/properties/list_duplicates.yaml": { + "filePath": "bad/resources/properties/list_duplicates.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 3, + "counts": { + "fatal": 3, + "errors": 0, + "warnings": 0, + "informational": 0, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "W3005", - "severity": "WARN", - "message": "'myInstanceProfile' dependency already enforced by a 'Ref' at 'Properties.IamInstanceProfile'", - "source": "CFN_LINT", + "ruleId": "F3037", + "severity": "FATAL", + "message": "Array items are not unique", + "source": "SCHEMA", "entity": { - "logicalId": "myInstance", + "logicalId": "IamGroup", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::IAM::Group" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", - "category": "Best Practice", - "startLine": 51, - "startColumn": 5, - "endLine": 51, - "endColumn": 14, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", - "phase": "LINT" + "propertyPath": "Properties.ManagedPolicyArns", + "category": "Schema", + "startLine": 14, + "startColumn": 7, + "endLine": 14, + "endColumn": 24, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "ruleDescription": "Array items not unique", + "phase": "SCHEMA" }, { - "ruleId": "W3005", - "severity": "WARN", - "message": "'myKms' dependency already enforced by a 'Ref' at 'Properties.BucketEncryption.ServerSideEncryptionConfiguration.0.ServerSideEncryptionByDefault.KMSMasterKeyID'", - "source": "CFN_LINT", + "ruleId": "F3037", + "severity": "FATAL", + "message": "Array items are not unique", + "source": "SCHEMA", "entity": { - "logicalId": "myBucket", + "logicalId": "IamGroupWithConditions", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::IAM::Group" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", - "category": "Best Practice", - "startLine": 64, - "startColumn": 5, - "endLine": 64, - "endColumn": 14, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", - "phase": "LINT" - }, - { - "ruleId": "W3005", - "severity": "WARN", - "message": "'myKms' dependency already enforced by a 'Ref' at 'Properties.Policies.0.PolicyDocument.Statement.0.Condition.StringEquals.s3:x-amz-server-side-encryption-aws-kms-key-id'", - "source": "CFN_LINT", - "entity": { - "logicalId": "myRoleToWriteToS3", - "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "propertyPath": "Properties.ManagedPolicyArns", + "category": "Schema", + "startLine": 22, + "startColumn": 7, + "endLine": 22, + "endColumn": 24, + "conditionScenario": { + "isPrimaryRegion": true }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", - "category": "Best Practice", - "startLine": 98, - "startColumn": 5, - "endLine": 98, - "endColumn": 14, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", - "phase": "LINT" + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "ruleDescription": "Array items not unique", + "phase": "SCHEMA", + "context": { + "actualValue": null, + "resolutionSource": "Fn::If on condition 'isPrimaryRegion'" + } }, { - "ruleId": "W3005", - "severity": "WARN", - "message": "'myRoleToWriteToS3' dependency already enforced by a 'Ref' at 'Properties.Roles.0'", - "source": "CFN_LINT", + "ruleId": "F3037", + "severity": "FATAL", + "message": "Array items are not unique", + "source": "SCHEMA", "entity": { - "logicalId": "myInstanceProfile", + "logicalId": "IamGroupWithNestedConditions", "entityType": "Resource", - "resourceType": "AWS::IAM::InstanceProfile" + "resourceType": "AWS::IAM::Group" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", - "category": "Best Practice", - "startLine": 147, - "startColumn": 5, - "endLine": 147, - "endColumn": 14, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", - "phase": "LINT" - }, - { - "ruleId": "W9003", - "severity": "WARN", - "message": "1 is not of type 'string' - automatically coerced (number to string)", - "source": "CFN_LINT", - "entity": { - "logicalId": "mySecurityGroupVpc1", - "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "propertyPath": "Properties.ManagedPolicyArns", + "category": "Schema", + "startLine": 33, + "startColumn": 7, + "endLine": 33, + "endColumn": 24, + "conditionScenario": { + "isPrimaryRegion": true }, - "propertyPath": "Properties.SecurityGroupIngress.0.IpProtocol", - "category": "Best Practice", - "startLine": 29, - "startColumn": 11, - "endLine": 29, - "endColumn": 21, - "ruleDescription": "Property type coercion warning", - "phase": "SCHEMA" + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "ruleDescription": "Array items not unique", + "phase": "SCHEMA", + "context": { + "actualValue": [ + "arn:aws:iam::aws:policy/AdministratorPolicy", + "arn:aws:iam::aws:policy/AdministratorPolicy" + ] + } + } + ] + }, + "bad/resources/properties/primitive_types_map.yaml": { + "filePath": "bad/resources/properties/primitive_types_map.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 2, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 4, + "informational": 2, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "W9003", + "ruleId": "W2531", "severity": "WARN", - "message": "1 is not of type 'string' - automatically coerced (number to string)", + "message": "Runtime 'nodejs18.x' was deprecated on '2025-09-01'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'nodejs24.x'", "source": "CFN_LINT", "entity": { - "logicalId": "mySecurityGroupVpc1", + "logicalId": "ExampleLambda", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.SecurityGroupIngress.1.IpProtocol", - "category": "Best Practice", - "startLine": 31, - "startColumn": 11, - "endLine": 31, - "endColumn": 21, - "ruleDescription": "Property type coercion warning", - "phase": "SCHEMA" + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 19, + "startColumn": 7, + "endLine": 19, + "endColumn": 14, + "ruleDescription": "Check if EOL Lambda Function Runtimes are used", + "phase": "SCHEMA", + "context": { + "actualValue": "nodejs18.x", + "lifecycle": "deprecated" + } }, { - "ruleId": "W9003", + "ruleId": "W2531", "severity": "WARN", - "message": "1 is not of type 'string' - automatically coerced (number to string)", + "message": "Runtime 'nodejs18.x' was deprecated on '2025-09-01'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'nodejs24.x'", "source": "CFN_LINT", "entity": { - "logicalId": "mySecurityGroupVpc2", + "logicalId": "ExampleLambda1", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.SecurityGroupIngress.0.IpProtocol", - "category": "Best Practice", + "propertyPath": "Properties.Runtime", + "category": "Deprecation", "startLine": 39, - "startColumn": 11, + "startColumn": 7, "endLine": 39, - "endColumn": 21, - "ruleDescription": "Property type coercion warning", - "phase": "SCHEMA" + "endColumn": 14, + "ruleDescription": "Check if EOL Lambda Function Runtimes are used", + "phase": "SCHEMA", + "context": { + "actualValue": "nodejs18.x", + "lifecycle": "deprecated" + } }, { - "ruleId": "W9003", + "ruleId": "W9013", "severity": "WARN", - "message": "1 is not of type 'string' - automatically coerced (number to string)", - "source": "CFN_LINT", + "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", + "source": "ENGINE", "entity": { - "logicalId": "mySecurityGroupVpc3", + "logicalId": "ExampleLambda", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.SecurityGroupIngress.0.IpProtocol", - "category": "Best Practice", - "startLine": 47, - "startColumn": 11, - "endLine": 47, - "endColumn": 21, - "ruleDescription": "Property type coercion warning", - "phase": "SCHEMA" + "category": "Security", + "startLine": 5, + "startColumn": 3, + "endLine": 5, + "endColumn": 16, + "ruleDescription": "Hardcoded account ID in ARN", + "phase": "LINT" }, { - "ruleId": "W9003", + "ruleId": "W9013", "severity": "WARN", - "message": "0 is not of type 'string' - automatically coerced (number to string)", - "source": "CFN_LINT", + "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", + "source": "ENGINE", "entity": { - "logicalId": "myInstance", + "logicalId": "ExampleLambda1", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.NetworkInterfaces.0.DeviceIndex", - "category": "Best Practice", - "startLine": 61, - "startColumn": 11, - "endLine": 61, - "endColumn": 22, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Property type coercion warning", - "phase": "SCHEMA" + "category": "Security", + "startLine": 22, + "startColumn": 3, + "endLine": 22, + "endColumn": 17, + "ruleDescription": "Hardcoded account ID in ARN", + "phase": "LINT" }, { - "ruleId": "I3011", + "ruleId": "I9040", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Resource 'ExampleLambda' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "myKms", + "logicalId": "ExampleLambda", "entityType": "Resource", - "resourceType": "AWS::KMS::Key" + "resourceType": "AWS::Lambda::Function" }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 153, - "startColumn": 3, - "endLine": 153, - "endColumn": 8, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "startLine": 6, + "startColumn": 5, + "endLine": 6, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "I3011", + "ruleId": "I9040", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Resource 'ExampleLambda1' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "myKms", + "logicalId": "ExampleLambda1", "entityType": "Resource", - "resourceType": "AWS::KMS::Key" + "resourceType": "AWS::Lambda::Function" }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 153, - "startColumn": 3, - "endLine": 153, - "endColumn": 8, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "startLine": 23, + "startColumn": 5, + "endLine": 23, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "bad/resources/properties/string_size.yaml": { + "filePath": "bad/resources/properties/string_size.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 3, + "counts": { + "fatal": 5, + "errors": 0, + "warnings": 0, + "informational": 3, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I3042", - "severity": "INFO", - "message": "ARN in Resource myBucketPolicy contains hardcoded Partition in ARN or incorrectly placed Pseudo Parameters", - "source": "CFN_LINT", + "ruleId": "F3014", + "severity": "FATAL", + "message": "Exactly one of ['Metrics', 'MetricName', 'EvaluationCriteria'] must be specified", + "source": "SCHEMA", "entity": { - "logicalId": "myBucketPolicy", + "logicalId": "CloudWatchAlarm", "entityType": "Resource", - "resourceType": "AWS::S3::BucketPolicy" + "resourceType": "AWS::CloudWatch::Alarm" }, - "propertyPath": "Properties.PolicyDocument.Statement.0.Resource.Fn::Sub", - "category": "Best Practice", - "startLine": 84, - "startColumn": 13, - "endLine": 84, - "endColumn": 20, - "ruleDescription": "ARNs should use correctly placed Pseudo Parameters", - "phase": "LINT" + "propertyPath": "Properties", + "category": "Schema", + "startLine": 14, + "startColumn": 5, + "endLine": 14, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-cloudwatch.git", + "ruleDescription": "Exactly one of properties required (requiredXor)", + "phase": "SCHEMA" }, { - "ruleId": "I3042", - "severity": "INFO", - "message": "ARN in Resource myBucketPolicy contains hardcoded Partition in ARN or incorrectly placed Pseudo Parameters", - "source": "CFN_LINT", + "ruleId": "F3031", + "severity": "FATAL", + "message": "'' does not match pattern '^[a-zA-Z0-9._\\-]+(? Resource2 -> Resource3 -> Resource4 -> Resource5 -> Resource6 -> Resource7 -> Resource8 -> Resource9 -> Resource]", - "source": "SCHEMA", + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource", + "logicalId": "DBInstance8", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Resources/Resource", - "category": "Reference", - "startLine": 2, + "category": "Best Practice", + "startLine": 49, "startColumn": 3, - "endLine": 2, - "endColumn": 11, - "ruleDescription": "Circular dependency detected", + "endLine": 49, + "endColumn": 14, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "F3004", - "severity": "FATAL", - "message": "Circular Dependencies for resource Resource2. Circular dependency with [Resource2 -> Resource3 -> Resource4 -> Resource5 -> Resource6 -> Resource7 -> Resource8 -> Resource9 -> Resource -> Resource2]", - "source": "SCHEMA", + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource2", + "logicalId": "DBInstance8", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Resources/Resource2", - "category": "Reference", - "startLine": 7, + "category": "Best Practice", + "startLine": 49, "startColumn": 3, - "endLine": 7, - "endColumn": 12, - "ruleDescription": "Circular dependency detected", + "endLine": 49, + "endColumn": 14, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "F3004", - "severity": "FATAL", - "message": "Circular Dependencies for resource Resource3. Circular dependency with [Resource3 -> Resource4 -> Resource5 -> Resource6 -> Resource7 -> Resource8 -> Resource9 -> Resource -> Resource2 -> Resource3]", - "source": "SCHEMA", + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource3", + "logicalId": "DBInstance9", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Resources/Resource3", - "category": "Reference", - "startLine": 12, + "category": "Best Practice", + "startLine": 56, "startColumn": 3, - "endLine": 12, - "endColumn": 12, - "ruleDescription": "Circular dependency detected", + "endLine": 56, + "endColumn": 14, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "F3004", - "severity": "FATAL", - "message": "Circular Dependencies for resource Resource4. Circular dependency with [Resource4 -> Resource5 -> Resource6 -> Resource7 -> Resource8 -> Resource9 -> Resource -> Resource2 -> Resource3 -> Resource4]", - "source": "SCHEMA", + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource4", + "logicalId": "DBInstance9", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Resources/Resource4", - "category": "Reference", - "startLine": 17, + "category": "Best Practice", + "startLine": 56, "startColumn": 3, - "endLine": 17, - "endColumn": 12, - "ruleDescription": "Circular dependency detected", + "endLine": 56, + "endColumn": 14, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "F3004", - "severity": "FATAL", - "message": "Circular Dependencies for resource Resource5. Circular dependency with [Resource5 -> Resource6 -> Resource7 -> Resource8 -> Resource9 -> Resource -> Resource2 -> Resource3 -> Resource4 -> Resource5]", - "source": "SCHEMA", + "ruleId": "I3013", + "severity": "INFO", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource5", + "logicalId": "DBInstance2", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Resources/Resource5", - "category": "Reference", - "startLine": 22, - "startColumn": 3, - "endLine": 22, - "endColumn": 12, - "ruleDescription": "Circular dependency detected", + "propertyPath": "Properties", + "category": "Best Practice", + "startLine": 18, + "startColumn": 5, + "endLine": 18, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", "phase": "LINT" }, { - "ruleId": "F3004", - "severity": "FATAL", - "message": "Circular Dependencies for resource Resource6. Circular dependency with [Resource6 -> Resource7 -> Resource8 -> Resource9 -> Resource -> Resource2 -> Resource3 -> Resource4 -> Resource5 -> Resource6]", - "source": "SCHEMA", + "ruleId": "I3013", + "severity": "INFO", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource6", + "logicalId": "DBInstance3", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Resources/Resource6", - "category": "Reference", - "startLine": 27, - "startColumn": 3, - "endLine": 27, - "endColumn": 12, - "ruleDescription": "Circular dependency detected", + "propertyPath": "Properties", + "category": "Best Practice", + "startLine": 25, + "startColumn": 5, + "endLine": 25, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", "phase": "LINT" }, { - "ruleId": "F3004", - "severity": "FATAL", - "message": "Circular Dependencies for resource Resource7. Circular dependency with [Resource7 -> Resource8 -> Resource9 -> Resource -> Resource2 -> Resource3 -> Resource4 -> Resource5 -> Resource6 -> Resource7]", - "source": "SCHEMA", + "ruleId": "I3013", + "severity": "INFO", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource7", + "logicalId": "DBInstance4", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Resources/Resource7", - "category": "Reference", + "propertyPath": "Properties", + "category": "Best Practice", "startLine": 32, - "startColumn": 3, + "startColumn": 5, "endLine": 32, - "endColumn": 12, - "ruleDescription": "Circular dependency detected", - "phase": "LINT" - }, - { - "ruleId": "F3004", - "severity": "FATAL", - "message": "Circular Dependencies for resource Resource8. Circular dependency with [Resource8 -> Resource9 -> Resource -> Resource2 -> Resource3 -> Resource4 -> Resource5 -> Resource6 -> Resource7 -> Resource8]", - "source": "SCHEMA", - "entity": { - "logicalId": "Resource8", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" - }, - "propertyPath": "Resources/Resource8", - "category": "Reference", - "startLine": 37, - "startColumn": 3, - "endLine": 37, - "endColumn": 12, - "ruleDescription": "Circular dependency detected", + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", "phase": "LINT" }, { - "ruleId": "F3004", - "severity": "FATAL", - "message": "Circular Dependencies for resource Resource9. Circular dependency with [Resource9 -> Resource -> Resource2 -> Resource3 -> Resource4 -> Resource5 -> Resource6 -> Resource7 -> Resource8 -> Resource9]", - "source": "SCHEMA", + "ruleId": "I3013", + "severity": "INFO", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource9", + "logicalId": "DBInstance7", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Resources/Resource9", - "category": "Reference", - "startLine": 42, - "startColumn": 3, - "endLine": 42, - "endColumn": 12, - "ruleDescription": "Circular dependency detected", + "propertyPath": "Properties", + "category": "Best Practice", + "startLine": 44, + "startColumn": 5, + "endLine": 44, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", "phase": "LINT" }, { - "ruleId": "I9040", + "ruleId": "I3013", "severity": "INFO", - "message": "Resource 'Resource' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource", + "logicalId": "DBInstance8", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties", "category": "Best Practice", - "startLine": 4, + "startLine": 51, "startColumn": 5, - "endLine": 4, + "endLine": 51, "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check resources with auto expiring content have explicit retention period", "phase": "LINT" }, { - "ruleId": "I9040", + "ruleId": "I3013", "severity": "INFO", - "message": "Resource 'Resource2' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "Resource2", + "logicalId": "DBInstance9", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties", "category": "Best Practice", - "startLine": 9, + "startLine": 58, "startColumn": 5, - "endLine": 9, + "endLine": 58, "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check resources with auto expiring content have explicit retention period", "phase": "LINT" }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'Resource3' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource3", + "logicalId": "DBInstance1", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.Engine", "category": "Best Practice", "startLine": 14, - "startColumn": 5, + "startColumn": 7, "endLine": 14, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'Resource4' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource4", + "logicalId": "DBInstance2", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.Engine", "category": "Best Practice", - "startLine": 19, - "startColumn": 5, - "endLine": 19, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 20, + "startColumn": 7, + "endLine": 20, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'Resource5' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Resource5", + "logicalId": "DBInstance3", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.Engine", "category": "Best Practice", - "startLine": 24, - "startColumn": 5, - "endLine": 24, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "startLine": 27, + "startColumn": 7, + "endLine": 27, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "DBInstance4", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.Engine", + "category": "Best Practice", + "startLine": 34, + "startColumn": 7, + "endLine": 34, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "DBInstance5", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.Engine", + "category": "Best Practice", + "startLine": 40, + "startColumn": 7, + "endLine": 40, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only", + "resolutionSource": "parameter 'DatabaseEngine' (type String)" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "DBInstance7", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.Engine", + "category": "Best Practice", + "startLine": 46, + "startColumn": 7, + "endLine": 46, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "DBInstance8", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.Engine", + "category": "Best Practice", + "startLine": 53, + "startColumn": 7, + "endLine": 53, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "DBInstance9", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.Engine", + "category": "Best Practice", + "startLine": 60, + "startColumn": 7, + "endLine": 60, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } + }, + { + "ruleId": "I9003", + "severity": "INFO", + "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", + "source": "ENGINE", + "category": "Best Practice", + "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource6' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'DBInstance1' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource6", + "logicalId": "DBInstance1", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::RDS::DBInstance" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 29, + "startLine": 12, "startColumn": 5, - "endLine": 29, + "endLine": 12, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -5429,19 +5466,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource7' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'DBInstance2' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource7", + "logicalId": "DBInstance2", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::RDS::DBInstance" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 34, + "startLine": 18, "startColumn": 5, - "endLine": 34, + "endLine": 18, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -5449,19 +5486,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource8' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'DBInstance3' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource8", + "logicalId": "DBInstance3", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::RDS::DBInstance" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 39, + "startLine": 25, "startColumn": 5, - "endLine": 39, + "endLine": 25, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -5469,132 +5506,115 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource9' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'DBInstance4' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource9", + "logicalId": "DBInstance4", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::RDS::DBInstance" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 42, - "startColumn": 3, - "endLine": 42, - "endColumn": 12, + "startLine": 32, + "startColumn": 5, + "endLine": 32, + "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" - } - ] - }, - "bad/resources_circular_dependency_dependson.yaml": { - "filePath": "bad/resources_circular_dependency_dependson.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 2, - "counts": { - "fatal": 2, - "errors": 0, - "warnings": 0, - "informational": 2, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "F3004", - "severity": "FATAL", - "message": "Circular Dependencies for resource Resource. Circular dependency with [Resource -> Resource2 -> Resource]", - "source": "SCHEMA", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'DBInstance5' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource", + "logicalId": "DBInstance5", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Resources/Resource", - "category": "Reference", - "startLine": 4, - "startColumn": 3, - "endLine": 4, - "endColumn": 11, - "ruleDescription": "Circular dependency detected", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 38, + "startColumn": 5, + "endLine": 38, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "F3004", - "severity": "FATAL", - "message": "Circular Dependencies for resource Resource2. Circular dependency with [Resource2 -> Resource -> Resource2]", - "source": "SCHEMA", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'DBInstance7' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Resource2", + "logicalId": "DBInstance7", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Resources/Resource2", - "category": "Reference", - "startLine": 7, - "startColumn": 3, - "endLine": 7, - "endColumn": 12, - "ruleDescription": "Circular dependency detected", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 44, + "startColumn": 5, + "endLine": 44, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'DBInstance8' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource", + "logicalId": "DBInstance8", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::RDS::DBInstance" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 4, - "startColumn": 3, - "endLine": 4, - "endColumn": 11, + "startLine": 51, + "startColumn": 5, + "endLine": 51, + "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource2' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'DBInstance9' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource2", + "logicalId": "DBInstance9", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::RDS::DBInstance" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 7, - "startColumn": 3, - "endLine": 7, - "endColumn": 12, + "startLine": 58, + "startColumn": 5, + "endLine": 58, + "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "bad/resources_cloudfront_invalid_aliases.yaml": { - "filePath": "bad/resources_cloudfront_invalid_aliases.yaml", + "bad/resources/rds/not_enum_master_username.yaml": { + "filePath": "bad/resources/rds/not_enum_master_username.yaml", "status": "OK", "metadata": { "resourcesScanned": 1, "counts": { - "fatal": 0, - "errors": 8, - "warnings": 0, - "informational": 1, + "fatal": 1, + "errors": 0, + "warnings": 1, + "informational": 6, "debug": 0 }, "suppressed": 0, @@ -5603,166 +5623,154 @@ }, "diagnostics": [ { - "ruleId": "E3013", - "severity": "ERROR", - "message": "CloudFront alias 'email.*.example.com' has wildcard in invalid position", - "source": "CFN_LINT", + "ruleId": "F3017", + "severity": "FATAL", + "message": "'rdsadmin' at 'MasterUsername' does not satisfy the composition branch constraint (none of ['rdsadmin']): 'rdsadmin' must not be one of ['rdsadmin']", + "source": "SCHEMA", "entity": { - "logicalId": "CloudFrontDistribution", + "logicalId": "MyDB", "entityType": "Resource", - "resourceType": "AWS::CloudFront::Distribution" + "resourceType": "AWS::RDS::DBCluster" }, - "propertyPath": "Properties.DistributionConfig.Aliases.13", - "category": "Resource", - "startLine": 21, - "startColumn": 13, - "endLine": 21, - "endColumn": 15, - "ruleDescription": "CloudFront Aliases", - "phase": "LINT" + "propertyPath": "Properties.MasterUsername", + "category": "Schema", + "startLine": 7, + "startColumn": 7, + "endLine": 7, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", + "ruleDescription": "Value not valid under anyOf", + "phase": "SCHEMA" }, { - "ruleId": "E3013", - "severity": "ERROR", - "message": "CloudFront alias 'WWW.EXAMPLE.COM' is not a valid domain name", + "ruleId": "W2501", + "severity": "WARN", + "message": "Property 'MasterUserPassword' should not be a hardcoded string - use a parameter with NoEcho or a dynamic reference", "source": "CFN_LINT", "entity": { - "logicalId": "CloudFrontDistribution", + "logicalId": "MyDB", "entityType": "Resource", - "resourceType": "AWS::CloudFront::Distribution" + "resourceType": "AWS::RDS::DBCluster" }, - "propertyPath": "Properties.DistributionConfig.Aliases.14", - "category": "Resource", - "startLine": 22, - "startColumn": 13, - "endLine": 22, - "endColumn": 15, - "ruleDescription": "CloudFront Aliases", + "propertyPath": "Properties.MasterUserPassword", + "category": "Security", + "startLine": 8, + "startColumn": 7, + "endLine": 8, + "endColumn": 25, + "ruleDescription": "Check if Password Properties are correctly configured", "phase": "LINT" }, { - "ruleId": "E3013", - "severity": "ERROR", - "message": "CloudFront alias '-example.com' is not a valid domain name", + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "CloudFrontDistribution", + "logicalId": "MyDB", "entityType": "Resource", - "resourceType": "AWS::CloudFront::Distribution" + "resourceType": "AWS::RDS::DBCluster" }, - "propertyPath": "Properties.DistributionConfig.Aliases.15", - "category": "Resource", - "startLine": 23, - "startColumn": 13, - "endLine": 23, - "endColumn": 15, - "ruleDescription": "CloudFront Aliases", + "category": "Best Practice", + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 7, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "E3013", - "severity": "ERROR", - "message": "CloudFront alias 'example.c' is not a valid domain name", + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "CloudFrontDistribution", + "logicalId": "MyDB", "entityType": "Resource", - "resourceType": "AWS::CloudFront::Distribution" + "resourceType": "AWS::RDS::DBCluster" }, - "propertyPath": "Properties.DistributionConfig.Aliases.16", - "category": "Resource", - "startLine": 24, - "startColumn": 13, - "endLine": 24, - "endColumn": 15, - "ruleDescription": "CloudFront Aliases", + "category": "Best Practice", + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 7, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "E3013", - "severity": "ERROR", - "message": "CloudFront alias 'www.example.com ' is not a valid domain name", + "ruleId": "I3013", + "severity": "INFO", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", "source": "CFN_LINT", "entity": { - "logicalId": "CloudFrontDistribution", + "logicalId": "MyDB", "entityType": "Resource", - "resourceType": "AWS::CloudFront::Distribution" + "resourceType": "AWS::RDS::DBCluster" }, - "propertyPath": "Properties.DistributionConfig.Aliases.17", - "category": "Resource", - "startLine": 25, - "startColumn": 13, - "endLine": 25, + "propertyPath": "Properties", + "category": "Best Practice", + "startLine": 5, + "startColumn": 5, + "endLine": 5, "endColumn": 15, - "ruleDescription": "CloudFront Aliases", + "ruleDescription": "Check resources with auto expiring content have explicit retention period", "phase": "LINT" }, { - "ruleId": "E3013", - "severity": "ERROR", - "message": "CloudFront alias 'www.-example.com' is not a valid domain name", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "CloudFrontDistribution", + "logicalId": "MyDB", "entityType": "Resource", - "resourceType": "AWS::CloudFront::Distribution" + "resourceType": "AWS::RDS::DBCluster" }, - "propertyPath": "Properties.DistributionConfig.Aliases.18", - "category": "Resource", - "startLine": 26, - "startColumn": 13, - "endLine": 26, - "endColumn": 15, - "ruleDescription": "CloudFront Aliases", - "phase": "LINT" - }, - { - "ruleId": "E3013", - "severity": "ERROR", - "message": "CloudFront alias '-www.example.com' is not a valid domain name", - "source": "CFN_LINT", - "entity": { - "logicalId": "CloudFrontDistribution", - "entityType": "Resource", - "resourceType": "AWS::CloudFront::Distribution" - }, - "propertyPath": "Properties.DistributionConfig.Aliases.19", - "category": "Resource", - "startLine": 27, - "startColumn": 13, - "endLine": 27, - "endColumn": 15, - "ruleDescription": "CloudFront Aliases", - "phase": "LINT" + "propertyPath": "Properties.Engine", + "category": "Best Practice", + "startLine": 6, + "startColumn": 7, + "endLine": 6, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "E3013", - "severity": "ERROR", - "message": "CloudFront alias 'www.example.com-' is not a valid domain name", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'MasterUsername' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "CloudFrontDistribution", + "logicalId": "MyDB", "entityType": "Resource", - "resourceType": "AWS::CloudFront::Distribution" + "resourceType": "AWS::RDS::DBCluster" }, - "propertyPath": "Properties.DistributionConfig.Aliases.20", - "category": "Resource", - "startLine": 28, - "startColumn": 13, - "endLine": 28, - "endColumn": 15, - "ruleDescription": "CloudFront Aliases", - "phase": "LINT" + "propertyPath": "Properties.MasterUsername", + "category": "Best Practice", + "startLine": 7, + "startColumn": 7, + "endLine": 7, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'CloudFrontDistribution' of type 'AWS::CloudFront::Distribution' supports Tags but none are configured", + "message": "Resource 'MyDB' of type 'AWS::RDS::DBCluster' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "CloudFrontDistribution", + "logicalId": "MyDB", "entityType": "Resource", - "resourceType": "AWS::CloudFront::Distribution" + "resourceType": "AWS::RDS::DBCluster" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", @@ -5776,8 +5784,8 @@ } ] }, - "bad/resources_cognito_userpool_tag_is_list.yaml": { - "filePath": "bad/resources_cognito_userpool_tag_is_list.yaml", + "bad/resources/rds/not_enum_master_username_join.yaml": { + "filePath": "bad/resources/rds/not_enum_master_username_join.yaml", "status": "OK", "metadata": { "resourcesScanned": 1, @@ -5785,7 +5793,7 @@ "fatal": 1, "errors": 0, "warnings": 0, - "informational": 2, + "informational": 3, "debug": 0 }, "suppressed": 0, @@ -5794,86 +5802,102 @@ }, "diagnostics": [ { - "ruleId": "F3012", + "ruleId": "F3017", "severity": "FATAL", - "message": "[{'Key': 'Key1', 'Value': 'Value1'}, {'Key': 'Key2', 'Value': 'Value2'}] is not of type 'object'", + "message": "'rdsadmin' at 'MasterUsername' does not satisfy the composition branch constraint (none of ['rdsadmin']): 'rdsadmin' must not be one of ['rdsadmin']", "source": "SCHEMA", "entity": { - "logicalId": "MyCognitoUserPool", + "logicalId": "JoinedUsername", "entityType": "Resource", - "resourceType": "AWS::Cognito::UserPool" + "resourceType": "AWS::RDS::DBCluster" }, - "propertyPath": "Properties.UserPoolTags", + "propertyPath": "Properties.MasterUsername", "category": "Schema", - "startLine": 16, + "startLine": 9, "startColumn": 7, - "endLine": 16, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Property type mismatch", - "phase": "SCHEMA", - "context": { - "actualValue": [ - { - "Key": "Key1", - "Value": "Value1" - }, - { - "Key": "Key2", - "Value": "Value2" - } - ], - "expectedConstraint": "object" - } + "endLine": 9, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", + "ruleDescription": "Value not valid under anyOf", + "phase": "SCHEMA" }, { - "ruleId": "I3011", + "ruleId": "I1022", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", "source": "CFN_LINT", "entity": { - "logicalId": "MyCognitoUserPool", + "logicalId": "JoinedUsername", "entityType": "Resource", - "resourceType": "AWS::Cognito::UserPool" + "resourceType": "AWS::RDS::DBCluster" }, - "category": "Best Practice", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 20, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "propertyPath": "Properties.MasterUsername.Fn::Join", + "category": "Intrinsic Function", + "startLine": 9, + "startColumn": 7, + "endLine": 9, + "endColumn": 15, + "ruleDescription": "Use Sub instead of Join", "phase": "LINT" }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "MyCognitoUserPool", + "logicalId": "JoinedUsername", "entityType": "Resource", - "resourceType": "AWS::Cognito::UserPool" + "resourceType": "AWS::RDS::DBCluster" }, + "propertyPath": "Properties.Engine", "category": "Best Practice", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 20, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 8, + "startColumn": 7, + "endLine": 8, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'MasterUsername' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "JoinedUsername", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBCluster" + }, + "propertyPath": "Properties.MasterUsername", + "category": "Best Practice", + "startLine": 9, + "startColumn": 7, + "endLine": 9, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } } ] }, - "bad/resources_deletionpolicy.yaml": { - "filePath": "bad/resources_deletionpolicy.yaml", + "bad/resources/s3/access-control-obsolete.yaml": { + "filePath": "bad/resources/s3/access-control-obsolete.yaml", "status": "OK", "metadata": { - "resourcesScanned": 5, + "resourcesScanned": 2, "counts": { - "fatal": 5, + "fatal": 0, "errors": 0, - "warnings": 8, - "informational": 17, + "warnings": 2, + "informational": 2, "debug": 0 }, "suppressed": 0, @@ -5882,918 +5906,826 @@ }, "diagnostics": [ { - "ruleId": "F3016", - "severity": "FATAL", - "message": "DeletionPolicy must be one of Delete, Retain, RetainExceptOnCreate, Snapshot, got a list", - "source": "SCHEMA", + "ruleId": "W3045", + "severity": "WARN", + "message": "AccessControl property is deprecated. Use bucket policies instead", + "source": "CFN_LINT", "entity": { - "logicalId": "PolicyList", + "logicalId": "Bucket1", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "DeletionPolicy", - "category": "Structure", - "startLine": 16, - "startColumn": 5, - "endLine": 16, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "DeletionPolicy must be valid", - "phase": "SCHEMA" + "propertyPath": "Properties.AccessControl", + "suggestedFix": "Remove AccessControl and use an AWS::S3::BucketPolicy resource", + "category": "Deprecation", + "startLine": 6, + "startColumn": 7, + "endLine": 6, + "endColumn": 20, + "ruleDescription": "Controlling access to an S3 bucket should be done with bucket policies", + "phase": "LINT", + "context": { + "actualValue": "Private" + } }, { - "ruleId": "F3016", - "severity": "FATAL", - "message": "DeletionPolicy must be one of Delete, Retain, RetainExceptOnCreate, Snapshot, got 'CopyRegion'", - "source": "SCHEMA", + "ruleId": "W3045", + "severity": "WARN", + "message": "AccessControl property is deprecated. Use bucket policies instead", + "source": "CFN_LINT", "entity": { - "logicalId": "MadeUpPolicy", + "logicalId": "Bucket2", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "DeletionPolicy", - "category": "Structure", - "startLine": 23, - "startColumn": 5, - "endLine": 23, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "DeletionPolicy must be valid", - "phase": "SCHEMA" - }, - { - "ruleId": "F3016", - "severity": "FATAL", - "message": "DeletionPolicy must be one of Delete, Retain, RetainExceptOnCreate, got 'Snapshot'", - "source": "SCHEMA", + "propertyPath": "Properties.AccessControl", + "suggestedFix": "Remove AccessControl and use an AWS::S3::BucketPolicy resource", + "category": "Deprecation", + "startLine": 11, + "startColumn": 7, + "endLine": 11, + "endColumn": 20, + "ruleDescription": "Controlling access to an S3 bucket should be done with bucket policies", + "phase": "LINT", + "context": { + "actualValue": "BucketOwnerFullControl" + } + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Bucket1' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "MyIAMUser", + "logicalId": "Bucket1", "entityType": "Resource", - "resourceType": "AWS::IAM::User" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "DeletionPolicy", - "category": "Structure", - "startLine": 29, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 5, "startColumn": 5, - "endLine": 29, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", - "ruleDescription": "DeletionPolicy must be valid", - "phase": "SCHEMA" + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "F3016", - "severity": "FATAL", - "message": "DeletionPolicy must be one of Delete, Retain, RetainExceptOnCreate, got a list", - "source": "SCHEMA", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Bucket2' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "UnsupportedIntrinsic", + "logicalId": "Bucket2", "entityType": "Resource", - "resourceType": "AWS::CloudFormation::WaitConditionHandle" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "DeletionPolicy", - "category": "Structure", - "startLine": 32, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 10, "startColumn": 5, - "endLine": 32, - "endColumn": 19, - "ruleDescription": "DeletionPolicy must be valid", - "phase": "SCHEMA" + "endLine": 10, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "bad/resources/sns/topic_name.yaml": { + "filePath": "bad/resources/sns/topic_name.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 1, + "errors": 0, + "warnings": 0, + "informational": 2, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "F3016", + "ruleId": "F3033", "severity": "FATAL", - "message": "DeletionPolicy must be one of Delete, Retain, RetainExceptOnCreate, Snapshot, got an object", + "message": "length 362 exceeds maximum 256", "source": "SCHEMA", "entity": { - "logicalId": "InvalidMapping", + "logicalId": "MyTopic", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "DeletionPolicy", - "category": "Structure", - "startLine": 43, - "startColumn": 5, - "endLine": 43, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "DeletionPolicy must be valid", - "phase": "SCHEMA" + "propertyPath": "Properties.TopicName", + "category": "Schema", + "startLine": 7, + "startColumn": 7, + "endLine": 7, + "endColumn": 16, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sns", + "ruleDescription": "String length out of bounds", + "phase": "SCHEMA", + "context": { + "actualValue": "DXPPuqwhVLODAIIVeagGODxciscAVDptCqTYUlDZCNoFchzHdsWBvtQVHjLldJSLrjgbheDXPPuqwhVLODAIIVeagGODxciscAVDptCqTYUlDZCNoFchzHdsWBvtQVHjLldJSLrjgbheDXPPuqwhVLODAIIVeagGODxciscAVDptCqTYUlDZCNoFchzHdsWBvtQVHjLldJSLrjgbheDXPPuqwhVLODAIIVeagGODxciscAVDptCqTYUlDZCNoFchzHdsWBvtQVHjLldJSLrjgbheDXPPuqwhVLODAIIVeagGODxciscAVDptCqTYUlDZCNoFchzHdsWBvtQVHjLldJSLrjgbheSNSTopicName", + "extra": { + "actual_length": 362, + "max_length": 256 + } + } }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'DBPolicy' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'TopicName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "DBPolicy", - "entityType": "Parameter" + "logicalId": "MyTopic", + "entityType": "Resource", + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Parameters/DBPolicy", + "propertyPath": "Properties.TopicName", "category": "Best Practice", - "startLine": 6, - "startColumn": 3, - "endLine": 6, - "endColumn": 11, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "startLine": 7, + "startColumn": 7, + "endLine": 7, + "endColumn": 16, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sns", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W3011", - "severity": "WARN", - "message": "Both 'UpdateReplacePolicy' and 'DeletionPolicy' are needed to protect resource from deletion", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'MyTopic' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "PolicyList", + "logicalId": "MyTopic", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::SNS::Topic" }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 10, - "startColumn": 3, - "endLine": 10, - "endColumn": 13, - "ruleDescription": "Check resources with UpdateReplacePolicy/DeletionPolicy have both", + "startLine": 6, + "startColumn": 5, + "endLine": 6, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "bad/resources/uniqueNames.yaml": { + "filePath": "bad/resources/uniqueNames.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 1, + "errors": 0, + "warnings": 1, + "informational": 1, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "W3011", - "severity": "WARN", - "message": "Both 'UpdateReplacePolicy' and 'DeletionPolicy' are needed to protect resource from deletion", - "source": "CFN_LINT", + "ruleId": "F3007", + "severity": "FATAL", + "message": "'Name' is used as both a parameter and resource logical ID", + "source": "SCHEMA", "entity": { - "logicalId": "MadeUpPolicy", + "logicalId": "Name", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::SNS::Topic" }, - "category": "Best Practice", - "startLine": 17, + "category": "Structure", + "startLine": 5, "startColumn": 3, - "endLine": 17, - "endColumn": 15, - "ruleDescription": "Check resources with UpdateReplacePolicy/DeletionPolicy have both", - "phase": "LINT" + "endLine": 5, + "endColumn": 7, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sns", + "ruleDescription": "Logical ID used as both parameter and resource", + "phase": "SCHEMA" }, { - "ruleId": "W3011", + "ruleId": "W2001", "severity": "WARN", - "message": "Both 'UpdateReplacePolicy' and 'DeletionPolicy' are needed to protect resource from deletion", + "message": "Parameter 'Name' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "MyIAMUser", - "entityType": "Resource", - "resourceType": "AWS::IAM::User" + "logicalId": "Name", + "entityType": "Parameter" }, + "propertyPath": "Parameters/Name", "category": "Best Practice", - "startLine": 24, + "startLine": 2, "startColumn": 3, - "endLine": 24, - "endColumn": 12, - "ruleDescription": "Check resources with UpdateReplacePolicy/DeletionPolicy have both", + "endLine": 2, + "endColumn": 7, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W3011", - "severity": "WARN", - "message": "Both 'UpdateReplacePolicy' and 'DeletionPolicy' are needed to protect resource from deletion", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Name' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "UnsupportedIntrinsic", + "logicalId": "Name", "entityType": "Resource", - "resourceType": "AWS::CloudFormation::WaitConditionHandle" + "resourceType": "AWS::SNS::Topic" }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 30, + "startLine": 5, "startColumn": 3, - "endLine": 30, - "endColumn": 23, - "ruleDescription": "Check resources with UpdateReplacePolicy/DeletionPolicy have both", - "phase": "LINT" + "endLine": 5, + "endColumn": 7, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "bad/resources/update_policy_unsupported_e3016.yaml": { + "filePath": "bad/resources/update_policy_unsupported_e3016.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 1, + "warnings": 0, + "informational": 2, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "W9008", - "severity": "WARN", - "message": "RDS instance should have StorageEncrypted set to true", - "source": "ENGINE", + "ruleId": "E3016", + "severity": "ERROR", + "message": "UpdatePolicy is not supported on resource type 'AWS::S3::Bucket'", + "source": "CFN_LINT", "entity": { - "logicalId": "PolicyList", + "logicalId": "MyBucket", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.StorageEncrypted", - "suggestedFix": "Set StorageEncrypted to true", - "category": "Security", - "startLine": 12, + "propertyPath": "UpdatePolicy", + "suggestedFix": "Remove UpdatePolicy or change resource type to one of: AWS::AppStream::Fleet, AWS::AutoScaling::AutoScalingGroup, AWS::ElastiCache::ReplicationGroup, AWS::Elasticsearch::Domain, AWS::Lambda::Alias, AWS::OpenSearchService::Domain", + "category": "Resource", + "startLine": 5, "startColumn": 5, - "endLine": 12, - "endColumn": 15, - "ruleDescription": "RDS instance should have StorageEncrypted", + "endLine": 5, + "endColumn": 17, + "ruleDescription": "Check UpdatePolicy values for Resources", "phase": "LINT" }, { - "ruleId": "W9008", - "severity": "WARN", - "message": "RDS instance should have StorageEncrypted set to true", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MadeUpPolicy", + "logicalId": "MyBucket", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.StorageEncrypted", - "suggestedFix": "Set StorageEncrypted to true", - "category": "Security", - "startLine": 19, - "startColumn": 5, - "endLine": 19, - "endColumn": 15, - "ruleDescription": "RDS instance should have StorageEncrypted", - "phase": "LINT" + "propertyPath": "Properties.BucketName", + "category": "Best Practice", + "startLine": 9, + "startColumn": 7, + "endLine": 9, + "endColumn": 17, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W9008", - "severity": "WARN", - "message": "RDS instance should have StorageEncrypted set to true", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'MyBucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "InvalidMapping", + "logicalId": "MyBucket", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.StorageEncrypted", - "suggestedFix": "Set StorageEncrypted to true", - "category": "Security", - "startLine": 39, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 8, "startColumn": 5, - "endLine": 39, + "endLine": 8, "endColumn": 15, - "ruleDescription": "RDS instance should have StorageEncrypted", + "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "bad/resources_circular_dependency.yaml": { + "filePath": "bad/resources_circular_dependency.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 11, + "counts": { + "fatal": 6, + "errors": 9, + "warnings": 9, + "informational": 38, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "ruleId": "F3004", + "severity": "FATAL", + "message": "Circular Dependencies for resource mySecurityGroupVpc1. Circular dependency with [mySecurityGroupVpc1 -> mySecurityGroupVpc2 -> mySecurityGroupVpc1]", + "source": "SCHEMA", "entity": { - "logicalId": "PolicyList", + "logicalId": "mySecurityGroupVpc1", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::SecurityGroup" }, - "category": "Best Practice", - "startLine": 10, + "propertyPath": "Resources/mySecurityGroupVpc1", + "category": "Reference", + "startLine": 23, "startColumn": 3, - "endLine": 10, - "endColumn": 13, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "endLine": 23, + "endColumn": 22, + "ruleDescription": "Circular dependency detected", "phase": "LINT" }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "ruleId": "F3004", + "severity": "FATAL", + "message": "Circular Dependencies for resource mySecurityGroupVpc2. Circular dependency with [mySecurityGroupVpc2 -> mySecurityGroupVpc1 -> mySecurityGroupVpc2]", + "source": "SCHEMA", "entity": { - "logicalId": "MadeUpPolicy", + "logicalId": "mySecurityGroupVpc2", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::SecurityGroup" }, - "category": "Best Practice", - "startLine": 17, + "propertyPath": "Resources/mySecurityGroupVpc2", + "category": "Reference", + "startLine": 33, "startColumn": 3, - "endLine": 17, - "endColumn": 15, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "endLine": 33, + "endColumn": 22, + "ruleDescription": "Circular dependency detected", "phase": "LINT" }, { - "ruleId": "I3013", - "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", + "ruleId": "F3004", + "severity": "FATAL", + "message": "Circular Dependencies for resource mySecurityGroupVpc3. Circular dependency with [mySecurityGroupVpc3 -> mySecurityGroupVpc3]", + "source": "SCHEMA", "entity": { - "logicalId": "PolicyList", + "logicalId": "mySecurityGroupVpc3", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties", - "category": "Best Practice", - "startLine": 12, - "startColumn": 5, - "endLine": 12, - "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "propertyPath": "Resources/mySecurityGroupVpc3", + "category": "Reference", + "startLine": 41, + "startColumn": 3, + "endLine": 41, + "endColumn": 22, + "ruleDescription": "Circular dependency detected", "phase": "LINT" }, { - "ruleId": "I3013", - "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", + "ruleId": "F3004", + "severity": "FATAL", + "message": "Circular Dependencies for resource myRoleToWriteToS3. Circular dependency with [myRoleToWriteToS3 -> myKms -> myInstanceProfile -> myRoleToWriteToS3]", + "source": "SCHEMA", "entity": { - "logicalId": "MadeUpPolicy", + "logicalId": "myRoleToWriteToS3", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties", - "category": "Best Practice", - "startLine": 19, - "startColumn": 5, - "endLine": 19, - "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "propertyPath": "Resources/myRoleToWriteToS3", + "category": "Reference", + "startLine": 96, + "startColumn": 3, + "endLine": 96, + "endColumn": 20, + "ruleDescription": "Circular dependency detected", "phase": "LINT" }, { - "ruleId": "I3013", - "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", + "ruleId": "F3004", + "severity": "FATAL", + "message": "Circular Dependencies for resource myInstanceProfile. Circular dependency with [myInstanceProfile -> myRoleToWriteToS3 -> myKms -> myInstanceProfile]", + "source": "SCHEMA", "entity": { - "logicalId": "InvalidMapping", + "logicalId": "myInstanceProfile", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::IAM::InstanceProfile" }, - "propertyPath": "Properties", - "category": "Best Practice", - "startLine": 39, - "startColumn": 5, - "endLine": 39, - "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "propertyPath": "Resources/myInstanceProfile", + "category": "Reference", + "startLine": 145, + "startColumn": 3, + "endLine": 145, + "endColumn": 20, + "ruleDescription": "Circular dependency detected", "phase": "LINT" }, { - "ruleId": "I3100", - "severity": "INFO", - "message": "Previous generation instance type 'db.m1.small' - consider upgrading", - "source": "CFN_LINT", + "ruleId": "F3004", + "severity": "FATAL", + "message": "Circular Dependencies for resource myKms. Circular dependency with [myKms -> myInstanceProfile -> myRoleToWriteToS3 -> myKms]", + "source": "SCHEMA", "entity": { - "logicalId": "PolicyList", + "logicalId": "myKms", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::KMS::Key" }, - "propertyPath": "Properties.DBInstanceClass", - "suggestedFix": "Upgrade to a current generation instance type", - "category": "Best Practice", - "startLine": 14, - "startColumn": 7, - "endLine": 14, - "endColumn": 22, - "ruleDescription": "Checks for legacy instance type generations", - "phase": "LINT" - }, - { - "ruleId": "I3100", - "severity": "INFO", - "message": "Previous generation instance type 'db.m1.small' - consider upgrading", - "source": "CFN_LINT", - "entity": { - "logicalId": "MadeUpPolicy", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" - }, - "propertyPath": "Properties.DBInstanceClass", - "suggestedFix": "Upgrade to a current generation instance type", - "category": "Best Practice", - "startLine": 21, - "startColumn": 7, - "endLine": 21, - "endColumn": 22, - "ruleDescription": "Checks for legacy instance type generations", + "propertyPath": "Resources/myKms", + "category": "Reference", + "startLine": 153, + "startColumn": 3, + "endLine": 153, + "endColumn": 8, + "ruleDescription": "Circular dependency detected", "phase": "LINT" }, { - "ruleId": "I3100", - "severity": "INFO", - "message": "Previous generation instance type 'db.m1.small' - consider upgrading", + "ruleId": "E1150", + "severity": "ERROR", + "message": "'sg-1234567' does not match format 'AWS::EC2::SecurityGroup.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "InvalidMapping", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" - }, - "propertyPath": "Properties.DBInstanceClass", - "suggestedFix": "Upgrade to a current generation instance type", - "category": "Best Practice", - "startLine": 41, - "startColumn": 7, - "endLine": 41, - "endColumn": 22, - "ruleDescription": "Checks for legacy instance type generations", - "phase": "LINT" - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "PolicyList", + "logicalId": "mySecurityGroupVpc1", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.Engine", - "category": "Best Practice", - "startLine": 15, - "startColumn": 7, - "endLine": 15, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", + "propertyPath": "Properties.SecurityGroupIngress.0.SourceSecurityGroupId", + "category": "Intrinsic Function", + "startLine": 30, + "startColumn": 11, + "endLine": 30, + "endColumn": 32, + "ruleDescription": "Validate security group format", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "actualValue": "sg-1234567" } }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'String' does not match format 'AWS::EC2::Image.Id'", + "source": "CFN_LINT", "entity": { - "logicalId": "MadeUpPolicy", + "logicalId": "myInstanceSub", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Engine", - "category": "Best Practice", - "startLine": 22, + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 216, "startColumn": 7, - "endLine": 22, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", + "endLine": 216, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "actualValue": "String" } }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'UserName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E3048", + "severity": "ERROR", + "message": "Fargate requires Cpu to be specified", + "source": "CFN_LINT", "entity": { - "logicalId": "MyIAMUser", + "logicalId": "taskdefinition", "entityType": "Resource", - "resourceType": "AWS::IAM::User" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.UserName", - "category": "Best Practice", - "startLine": 28, - "startColumn": 7, - "endLine": 28, + "propertyPath": "Properties", + "suggestedFix": "Set Cpu to a valid Fargate value (256, 512, 1024, 2048, 4096, 8192, 16384, or 32768)", + "category": "Resource", + "startLine": 222, + "startColumn": 5, + "endLine": 222, "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "InvalidMapping", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" - }, - "propertyPath": "Properties.Engine", - "category": "Best Practice", - "startLine": 42, - "startColumn": 7, - "endLine": 42, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } - }, - { - "ruleId": "I9003", - "severity": "INFO", - "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", - "source": "ENGINE", - "category": "Best Practice", - "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", + "ruleDescription": "Validate ECS Fargate tasks have required properties and values", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'PolicyList' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "E3048", + "severity": "ERROR", + "message": "Fargate requires Memory to be specified", + "source": "CFN_LINT", "entity": { - "logicalId": "PolicyList", + "logicalId": "taskdefinition", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 12, + "propertyPath": "Properties", + "suggestedFix": "Set Memory to a valid Fargate value", + "category": "Resource", + "startLine": 222, "startColumn": 5, - "endLine": 12, + "endLine": 222, "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Validate ECS Fargate tasks have required properties and values", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'MadeUpPolicy' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "E3048", + "severity": "ERROR", + "message": "Fargate requires NetworkMode to be specified as 'awsvpc'", + "source": "CFN_LINT", "entity": { - "logicalId": "MadeUpPolicy", + "logicalId": "taskdefinition", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 19, + "propertyPath": "Properties", + "suggestedFix": "Set NetworkMode to 'awsvpc'", + "category": "Resource", + "startLine": 222, "startColumn": 5, - "endLine": 19, + "endLine": 222, "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Validate ECS Fargate tasks have required properties and values", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'MyIAMUser' of type 'AWS::IAM::User' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "E3687", + "severity": "ERROR", + "message": "['FromPort', 'ToPort'] are required properties when using 'IpProtocol' value 1", + "source": "CFN_LINT", "entity": { - "logicalId": "MyIAMUser", + "logicalId": "mySecurityGroupVpc1", "entityType": "Resource", - "resourceType": "AWS::IAM::User" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 26, - "startColumn": 5, - "endLine": 26, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "propertyPath": "Properties.SecurityGroupIngress.0", + "category": "Resource", + "startLine": 29, + "startColumn": 21, + "endLine": 29, + "endColumn": 22, + "ruleDescription": "Validate to and from ports based on the protocol", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'InvalidMapping' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "E3687", + "severity": "ERROR", + "message": "['FromPort', 'ToPort'] are required properties when using 'IpProtocol' value 1", + "source": "CFN_LINT", "entity": { - "logicalId": "InvalidMapping", + "logicalId": "mySecurityGroupVpc1", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 39, - "startColumn": 5, - "endLine": 39, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "propertyPath": "Properties.SecurityGroupIngress.1", + "category": "Resource", + "startLine": 31, + "startColumn": 21, + "endLine": 31, + "endColumn": 22, + "ruleDescription": "Validate to and from ports based on the protocol", "phase": "LINT" - } - ] - }, - "bad/resources_iam_instanceprofile_roles.yaml": { - "filePath": "bad/resources_iam_instanceprofile_roles.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 1, - "errors": 0, - "warnings": 0, - "informational": 0, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "F3032", - "severity": "FATAL", - "message": "expected maximum item count: 1, found: 2", - "source": "SCHEMA", - "entity": { - "logicalId": "IamUser", - "entityType": "Resource", - "resourceType": "AWS::IAM::InstanceProfile" - }, - "propertyPath": "Properties.Roles", - "category": "Schema", - "startLine": 7, - "startColumn": 7, - "endLine": 7, - "endColumn": 12, - "ruleDescription": "Array item count out of bounds", - "phase": "SCHEMA", - "context": { - "extra": { - "actual_count": 2, - "max_items": 1, - "min_items": 0 - } - } - } - ] - }, - "bad/resources_updatereplacepolicy.yaml": { - "filePath": "bad/resources_updatereplacepolicy.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 5, - "counts": { - "fatal": 5, - "errors": 0, - "warnings": 9, - "informational": 18, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "F0018", - "severity": "FATAL", - "message": "UpdateReplacePolicy must be one of Delete, Retain, Snapshot, got a list", - "source": "SCHEMA", + "ruleId": "E3687", + "severity": "ERROR", + "message": "['FromPort', 'ToPort'] are required properties when using 'IpProtocol' value 1", + "source": "CFN_LINT", "entity": { - "logicalId": "PolicyList", + "logicalId": "mySecurityGroupVpc2", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "UpdateReplacePolicy", - "category": "Structure", - "startLine": 16, - "startColumn": 5, - "endLine": 16, - "endColumn": 24, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "UpdateReplacePolicy must be valid", - "phase": "SCHEMA" + "propertyPath": "Properties.SecurityGroupIngress.0", + "category": "Resource", + "startLine": 39, + "startColumn": 21, + "endLine": 39, + "endColumn": 22, + "ruleDescription": "Validate to and from ports based on the protocol", + "phase": "LINT" }, { - "ruleId": "F0018", - "severity": "FATAL", - "message": "UpdateReplacePolicy must be one of Delete, Retain, Snapshot, got 'CopyRegion'", - "source": "SCHEMA", + "ruleId": "E3687", + "severity": "ERROR", + "message": "['FromPort', 'ToPort'] are required properties when using 'IpProtocol' value 1", + "source": "CFN_LINT", "entity": { - "logicalId": "MadeUpPolicy", + "logicalId": "mySecurityGroupVpc3", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "UpdateReplacePolicy", - "category": "Structure", - "startLine": 23, - "startColumn": 5, - "endLine": 23, - "endColumn": 24, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "UpdateReplacePolicy must be valid", - "phase": "SCHEMA" + "propertyPath": "Properties.SecurityGroupIngress.0", + "category": "Resource", + "startLine": 47, + "startColumn": 21, + "endLine": 47, + "endColumn": 22, + "ruleDescription": "Validate to and from ports based on the protocol", + "phase": "LINT" }, { - "ruleId": "F0018", - "severity": "FATAL", - "message": "UpdateReplacePolicy must be one of Delete, Retain, got 'Snapshot'", - "source": "SCHEMA", + "ruleId": "W3005", + "severity": "WARN", + "message": "'myInstanceProfile' dependency already enforced by a 'Ref' at 'Properties.IamInstanceProfile'", + "source": "CFN_LINT", "entity": { - "logicalId": "MyIAMUser", + "logicalId": "myInstance", "entityType": "Resource", - "resourceType": "AWS::IAM::User" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "UpdateReplacePolicy", - "category": "Structure", - "startLine": 29, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 51, "startColumn": 5, - "endLine": 29, - "endColumn": 24, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", - "ruleDescription": "UpdateReplacePolicy must be valid", - "phase": "SCHEMA" + "endLine": 51, + "endColumn": 14, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" }, { - "ruleId": "F0018", - "severity": "FATAL", - "message": "UpdateReplacePolicy must be one of Delete, Retain, got a list", - "source": "SCHEMA", + "ruleId": "W3005", + "severity": "WARN", + "message": "'myKms' dependency already enforced by a 'Ref' at 'Properties.BucketEncryption.ServerSideEncryptionConfiguration.0.ServerSideEncryptionByDefault.KMSMasterKeyID'", + "source": "CFN_LINT", "entity": { - "logicalId": "UnsupportedIntrinsic", + "logicalId": "myBucket", "entityType": "Resource", - "resourceType": "AWS::CloudFormation::WaitConditionHandle" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "UpdateReplacePolicy", - "category": "Structure", - "startLine": 32, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 64, "startColumn": 5, - "endLine": 32, - "endColumn": 24, - "ruleDescription": "UpdateReplacePolicy must be valid", - "phase": "SCHEMA" + "endLine": 64, + "endColumn": 14, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" }, { - "ruleId": "F0018", - "severity": "FATAL", - "message": "UpdateReplacePolicy must be one of Delete, Retain, Snapshot, got an object", - "source": "SCHEMA", + "ruleId": "W3005", + "severity": "WARN", + "message": "'myKms' dependency already enforced by a 'Ref' at 'Properties.Policies.0.PolicyDocument.Statement.0.Condition.StringEquals.s3:x-amz-server-side-encryption-aws-kms-key-id'", + "source": "CFN_LINT", "entity": { - "logicalId": "InvalidMapping", + "logicalId": "myRoleToWriteToS3", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "UpdateReplacePolicy", - "category": "Structure", - "startLine": 43, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 98, "startColumn": 5, - "endLine": 43, - "endColumn": 24, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "UpdateReplacePolicy must be valid", - "phase": "SCHEMA" + "endLine": 98, + "endColumn": 14, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" }, { - "ruleId": "W2001", + "ruleId": "W3005", "severity": "WARN", - "message": "Parameter 'DBPolicy' is not referenced anywhere in the template", + "message": "'myRoleToWriteToS3' dependency already enforced by a 'Ref' at 'Properties.Roles.0'", "source": "CFN_LINT", "entity": { - "logicalId": "DBPolicy", - "entityType": "Parameter" + "logicalId": "myInstanceProfile", + "entityType": "Resource", + "resourceType": "AWS::IAM::InstanceProfile" }, - "propertyPath": "Parameters/DBPolicy", + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", "category": "Best Practice", - "startLine": 6, - "startColumn": 3, - "endLine": 6, - "endColumn": 11, - "ruleDescription": "Check if Parameters are Used", + "startLine": 147, + "startColumn": 5, + "endLine": 147, + "endColumn": 14, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", "phase": "LINT" }, { - "ruleId": "W3011", + "ruleId": "W9003", "severity": "WARN", - "message": "Both 'UpdateReplacePolicy' and 'DeletionPolicy' are needed to protect resource from deletion", + "message": "1 is not of type 'string' - automatically coerced (number to string)", "source": "CFN_LINT", "entity": { - "logicalId": "PolicyList", + "logicalId": "mySecurityGroupVpc1", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::SecurityGroup" }, + "propertyPath": "Properties.SecurityGroupIngress.0.IpProtocol", "category": "Best Practice", - "startLine": 10, - "startColumn": 3, - "endLine": 10, - "endColumn": 13, - "ruleDescription": "Check resources with UpdateReplacePolicy/DeletionPolicy have both", - "phase": "LINT" + "startLine": 29, + "startColumn": 11, + "endLine": 29, + "endColumn": 21, + "ruleDescription": "Property type coercion warning", + "phase": "SCHEMA" }, { - "ruleId": "W3011", + "ruleId": "W9003", "severity": "WARN", - "message": "Both 'UpdateReplacePolicy' and 'DeletionPolicy' are needed to protect resource from deletion", + "message": "1 is not of type 'string' - automatically coerced (number to string)", "source": "CFN_LINT", "entity": { - "logicalId": "MadeUpPolicy", + "logicalId": "mySecurityGroupVpc1", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::SecurityGroup" }, + "propertyPath": "Properties.SecurityGroupIngress.1.IpProtocol", "category": "Best Practice", - "startLine": 17, - "startColumn": 3, - "endLine": 17, - "endColumn": 15, - "ruleDescription": "Check resources with UpdateReplacePolicy/DeletionPolicy have both", - "phase": "LINT" + "startLine": 31, + "startColumn": 11, + "endLine": 31, + "endColumn": 21, + "ruleDescription": "Property type coercion warning", + "phase": "SCHEMA" }, { - "ruleId": "W3011", + "ruleId": "W9003", "severity": "WARN", - "message": "Both 'UpdateReplacePolicy' and 'DeletionPolicy' are needed to protect resource from deletion", + "message": "1 is not of type 'string' - automatically coerced (number to string)", "source": "CFN_LINT", "entity": { - "logicalId": "MyIAMUser", + "logicalId": "mySecurityGroupVpc2", "entityType": "Resource", - "resourceType": "AWS::IAM::User" + "resourceType": "AWS::EC2::SecurityGroup" }, + "propertyPath": "Properties.SecurityGroupIngress.0.IpProtocol", "category": "Best Practice", - "startLine": 24, - "startColumn": 3, - "endLine": 24, - "endColumn": 12, - "ruleDescription": "Check resources with UpdateReplacePolicy/DeletionPolicy have both", - "phase": "LINT" + "startLine": 39, + "startColumn": 11, + "endLine": 39, + "endColumn": 21, + "ruleDescription": "Property type coercion warning", + "phase": "SCHEMA" }, { - "ruleId": "W3011", + "ruleId": "W9003", "severity": "WARN", - "message": "Both 'UpdateReplacePolicy' and 'DeletionPolicy' are needed to protect resource from deletion", + "message": "1 is not of type 'string' - automatically coerced (number to string)", "source": "CFN_LINT", "entity": { - "logicalId": "UnsupportedIntrinsic", + "logicalId": "mySecurityGroupVpc3", "entityType": "Resource", - "resourceType": "AWS::CloudFormation::WaitConditionHandle" + "resourceType": "AWS::EC2::SecurityGroup" }, + "propertyPath": "Properties.SecurityGroupIngress.0.IpProtocol", "category": "Best Practice", - "startLine": 30, - "startColumn": 3, - "endLine": 30, - "endColumn": 23, - "ruleDescription": "Check resources with UpdateReplacePolicy/DeletionPolicy have both", - "phase": "LINT" + "startLine": 47, + "startColumn": 11, + "endLine": 47, + "endColumn": 21, + "ruleDescription": "Property type coercion warning", + "phase": "SCHEMA" }, { - "ruleId": "W3011", + "ruleId": "W9003", "severity": "WARN", - "message": "Both 'UpdateReplacePolicy' and 'DeletionPolicy' are needed to protect resource from deletion", + "message": "0 is not of type 'string' - automatically coerced (number to string)", "source": "CFN_LINT", "entity": { - "logicalId": "InvalidMapping", + "logicalId": "myInstance", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Instance" }, + "propertyPath": "Properties.NetworkInterfaces.0.DeviceIndex", "category": "Best Practice", - "startLine": 37, - "startColumn": 3, - "endLine": 37, - "endColumn": 17, - "ruleDescription": "Check resources with UpdateReplacePolicy/DeletionPolicy have both", - "phase": "LINT" - }, - { - "ruleId": "W9008", - "severity": "WARN", - "message": "RDS instance should have StorageEncrypted set to true", - "source": "ENGINE", - "entity": { - "logicalId": "PolicyList", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" - }, - "propertyPath": "Properties.StorageEncrypted", - "suggestedFix": "Set StorageEncrypted to true", - "category": "Security", - "startLine": 12, - "startColumn": 5, - "endLine": 12, - "endColumn": 15, - "ruleDescription": "RDS instance should have StorageEncrypted", - "phase": "LINT" - }, - { - "ruleId": "W9008", - "severity": "WARN", - "message": "RDS instance should have StorageEncrypted set to true", - "source": "ENGINE", - "entity": { - "logicalId": "MadeUpPolicy", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" - }, - "propertyPath": "Properties.StorageEncrypted", - "suggestedFix": "Set StorageEncrypted to true", - "category": "Security", - "startLine": 19, - "startColumn": 5, - "endLine": 19, - "endColumn": 15, - "ruleDescription": "RDS instance should have StorageEncrypted", - "phase": "LINT" - }, - { - "ruleId": "W9008", - "severity": "WARN", - "message": "RDS instance should have StorageEncrypted set to true", - "source": "ENGINE", - "entity": { - "logicalId": "InvalidMapping", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" - }, - "propertyPath": "Properties.StorageEncrypted", - "suggestedFix": "Set StorageEncrypted to true", - "category": "Security", - "startLine": 39, - "startColumn": 5, - "endLine": 39, - "endColumn": 15, - "ruleDescription": "RDS instance should have StorageEncrypted", - "phase": "LINT" + "startLine": 61, + "startColumn": 11, + "endLine": 61, + "endColumn": 22, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Property type coercion warning", + "phase": "SCHEMA" }, { "ruleId": "I3011", @@ -6801,2045 +6733,2155 @@ "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "PolicyList", + "logicalId": "myKms", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::KMS::Key" }, "category": "Best Practice", - "startLine": 10, + "startLine": 153, "startColumn": 3, - "endLine": 10, - "endColumn": 13, + "endLine": 153, + "endColumn": 8, "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { "ruleId": "I3011", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "MadeUpPolicy", + "logicalId": "myKms", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::KMS::Key" }, "category": "Best Practice", - "startLine": 17, + "startLine": 153, "startColumn": 3, - "endLine": 17, - "endColumn": 15, + "endLine": 153, + "endColumn": 8, "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "I3011", + "ruleId": "I3042", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "message": "ARN in Resource myBucketPolicy contains hardcoded Partition in ARN or incorrectly placed Pseudo Parameters", "source": "CFN_LINT", "entity": { - "logicalId": "InvalidMapping", + "logicalId": "myBucketPolicy", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::S3::BucketPolicy" }, + "propertyPath": "Properties.PolicyDocument.Statement.0.Resource.Fn::Sub", "category": "Best Practice", - "startLine": 37, - "startColumn": 3, - "endLine": 37, - "endColumn": 17, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "startLine": 84, + "startColumn": 13, + "endLine": 84, + "endColumn": 20, + "ruleDescription": "ARNs should use correctly placed Pseudo Parameters", "phase": "LINT" }, { - "ruleId": "I3013", + "ruleId": "I3042", "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "message": "ARN in Resource myBucketPolicy contains hardcoded Partition in ARN or incorrectly placed Pseudo Parameters", "source": "CFN_LINT", "entity": { - "logicalId": "PolicyList", + "logicalId": "myBucketPolicy", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::S3::BucketPolicy" }, - "propertyPath": "Properties", + "propertyPath": "Properties.PolicyDocument.Statement.1.Resource.Fn::Sub", "category": "Best Practice", - "startLine": 12, - "startColumn": 5, - "endLine": 12, - "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "startLine": 92, + "startColumn": 13, + "endLine": 92, + "endColumn": 20, + "ruleDescription": "ARNs should use correctly placed Pseudo Parameters", "phase": "LINT" }, { - "ruleId": "I3013", + "ruleId": "I3042", "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "message": "ARN in Resource myKms contains hardcoded Partition in ARN or incorrectly placed Pseudo Parameters", "source": "CFN_LINT", "entity": { - "logicalId": "MadeUpPolicy", + "logicalId": "myKms", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::KMS::Key" }, - "propertyPath": "Properties", + "propertyPath": "Properties.KeyPolicy.Statement.0.Principal.AWS.Fn::Sub", "category": "Best Practice", - "startLine": 19, - "startColumn": 5, - "endLine": 19, - "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "startLine": 165, + "startColumn": 15, + "endLine": 165, + "endColumn": 22, + "ruleDescription": "ARNs should use correctly placed Pseudo Parameters", "phase": "LINT" }, { - "ruleId": "I3013", + "ruleId": "I3042", "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "message": "ARN in Resource myKms contains hardcoded Partition in ARN or incorrectly placed Pseudo Parameters", "source": "CFN_LINT", "entity": { - "logicalId": "InvalidMapping", + "logicalId": "myKms", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::KMS::Key" }, - "propertyPath": "Properties", + "propertyPath": "Properties.KeyPolicy.Statement.1.Principal.AWS.Fn::Sub", "category": "Best Practice", - "startLine": 39, - "startColumn": 5, - "endLine": 39, - "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "startLine": 171, + "startColumn": 15, + "endLine": 171, + "endColumn": 22, + "ruleDescription": "ARNs should use correctly placed Pseudo Parameters", "phase": "LINT" }, { - "ruleId": "I3100", + "ruleId": "I3042", "severity": "INFO", - "message": "Previous generation instance type 'db.m1.small' - consider upgrading", + "message": "ARN in Resource myKms contains hardcoded Partition in ARN or incorrectly placed Pseudo Parameters", "source": "CFN_LINT", "entity": { - "logicalId": "PolicyList", + "logicalId": "myKms", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::KMS::Key" }, - "propertyPath": "Properties.DBInstanceClass", - "suggestedFix": "Upgrade to a current generation instance type", + "propertyPath": "Properties.KeyPolicy.Statement.2.Principal.AWS.0.Fn::Sub", "category": "Best Practice", - "startLine": 14, - "startColumn": 7, - "endLine": 14, - "endColumn": 22, - "ruleDescription": "Checks for legacy instance type generations", + "startLine": 192, + "startColumn": 24, + "endLine": 192, + "endColumn": 31, + "ruleDescription": "ARNs should use correctly placed Pseudo Parameters", "phase": "LINT" }, { - "ruleId": "I3100", + "ruleId": "I3042", "severity": "INFO", - "message": "Previous generation instance type 'db.m1.small' - consider upgrading", + "message": "ARN in Resource myKms contains hardcoded Partition in ARN or incorrectly placed Pseudo Parameters", "source": "CFN_LINT", "entity": { - "logicalId": "MadeUpPolicy", + "logicalId": "myKms", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::KMS::Key" }, - "propertyPath": "Properties.DBInstanceClass", - "suggestedFix": "Upgrade to a current generation instance type", + "propertyPath": "Properties.KeyPolicy.Statement.3.Principal.AWS.Fn::Sub", "category": "Best Practice", - "startLine": 21, - "startColumn": 7, - "endLine": 21, + "startLine": 204, + "startColumn": 15, + "endLine": 204, "endColumn": 22, - "ruleDescription": "Checks for legacy instance type generations", + "ruleDescription": "ARNs should use correctly placed Pseudo Parameters", "phase": "LINT" }, { - "ruleId": "I3100", + "ruleId": "I9001", "severity": "INFO", - "message": "Previous generation instance type 'db.m1.small' - consider upgrading", - "source": "CFN_LINT", + "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "InvalidMapping", + "logicalId": "mySecurityGroupVpc1", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.DBInstanceClass", - "suggestedFix": "Upgrade to a current generation instance type", + "propertyPath": "Properties.GroupDescription", "category": "Best Practice", - "startLine": 41, + "startLine": 26, "startColumn": 7, - "endLine": 41, - "endColumn": 22, - "ruleDescription": "Checks for legacy instance type generations", - "phase": "LINT" + "endLine": 26, + "endColumn": 23, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "PolicyList", + "logicalId": "mySecurityGroupVpc1", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 15, + "startLine": 27, "startColumn": 7, - "endLine": 15, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "endLine": 27, + "endColumn": 12, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only", + "resolutionSource": "parameter 'myVpcId' (type AWS::EC2::VPC::Id)" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MadeUpPolicy", + "logicalId": "mySecurityGroupVpc2", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.GroupDescription", "category": "Best Practice", - "startLine": 22, + "startLine": 36, "startColumn": 7, - "endLine": 22, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "endLine": 36, + "endColumn": 23, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'UserName' is create-only; updating it will cause resource replacement", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MyIAMUser", + "logicalId": "mySecurityGroupVpc2", "entityType": "Resource", - "resourceType": "AWS::IAM::User" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.UserName", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 28, + "startLine": 37, "startColumn": 7, - "endLine": 28, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "endLine": 37, + "endColumn": 12, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "parameter 'myVpcId' (type AWS::EC2::VPC::Id)" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "InvalidMapping", + "logicalId": "mySecurityGroupVpc3", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.GroupDescription", "category": "Best Practice", - "startLine": 42, + "startLine": 44, "startColumn": 7, - "endLine": 42, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "endLine": 44, + "endColumn": 23, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only" } }, { - "ruleId": "I9003", + "ruleId": "I9001", "severity": "INFO", - "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", + "entity": { + "logicalId": "mySecurityGroupVpc3", + "entityType": "Resource", + "resourceType": "AWS::EC2::SecurityGroup" + }, + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", - "phase": "LINT" + "startLine": 45, + "startColumn": 7, + "endLine": 45, + "endColumn": 12, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "parameter 'myVpcId' (type AWS::EC2::VPC::Id)" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'PolicyList' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "PolicyList", + "logicalId": "myInstance", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 12, - "startColumn": 5, - "endLine": 12, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 54, + "startColumn": 7, + "endLine": 54, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "parameter 'Ec2ImageId' (type AWS::EC2::Image::Id)" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'MadeUpPolicy' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MadeUpPolicy", + "logicalId": "myInstance", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 19, - "startColumn": 5, - "endLine": 19, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 55, + "startColumn": 7, + "endLine": 55, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'MyIAMUser' of type 'AWS::IAM::User' supports Tags but none are configured", + "message": "Property 'NetworkInterfaces' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MyIAMUser", + "logicalId": "myInstance", "entityType": "Resource", - "resourceType": "AWS::IAM::User" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.NetworkInterfaces", "category": "Best Practice", - "startLine": 26, - "startColumn": 5, - "endLine": 26, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 56, + "startColumn": 7, + "endLine": 56, + "endColumn": 24, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'InvalidMapping' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "InvalidMapping", + "logicalId": "myBucket", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.BucketName", "category": "Best Practice", - "startLine": 39, - "startColumn": 5, - "endLine": 39, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "bad/route53.yaml": { - "filePath": "bad/route53.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 11, - "counts": { - "fatal": 0, - "errors": 30, - "warnings": 1, - "informational": 12, - "debug": 0 + "startLine": 71, + "startColumn": 7, + "endLine": 71, + "endColumn": 17, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "parameter 'myBucketName' (type String)" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "E3023", - "severity": "ERROR", - "message": "TXT record value '\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"' must be enclosed in double quotes", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Bucket' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "MyTXTRecordSet", + "logicalId": "myBucketPolicy", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSet" + "resourceType": "AWS::S3::BucketPolicy" }, - "propertyPath": "Properties.ResourceRecords.0", - "category": "Resource", - "startLine": 32, - "startColumn": 11, - "endLine": 32, - "endColumn": 12, - "ruleDescription": "Validate Route53 RecordSets", - "phase": "LINT" + "propertyPath": "Properties.Bucket", + "category": "Best Practice", + "startLine": 75, + "startColumn": 7, + "endLine": 75, + "endColumn": 13, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'myBucket'" + } }, { - "ruleId": "E3023", - "severity": "ERROR", - "message": "TXT record value '\"a\"\"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"' must be enclosed in double quotes", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'RoleName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "MyTXTRecordSet", + "logicalId": "myRoleToWriteToS3", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSet" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.ResourceRecords.1", - "category": "Resource", - "startLine": 33, - "startColumn": 11, - "endLine": 33, - "endColumn": 12, - "ruleDescription": "Validate Route53 RecordSets", - "phase": "LINT" + "propertyPath": "Properties.RoleName", + "category": "Best Practice", + "startLine": 100, + "startColumn": 7, + "endLine": 100, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "E3023", - "severity": "ERROR", - "message": "TXT record value 'test2' must be enclosed in double quotes", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Path' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "MyTXTRecordSet", + "logicalId": "myRoleToWriteToS3", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSet" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.ResourceRecords.3", - "category": "Resource", - "startLine": 35, - "startColumn": 11, - "endLine": 35, - "endColumn": 12, - "ruleDescription": "Validate Route53 RecordSets", - "phase": "LINT" + "propertyPath": "Properties.Path", + "category": "Best Practice", + "startLine": 110, + "startColumn": 7, + "endLine": 110, + "endColumn": 11, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "E3023", - "severity": "ERROR", - "message": "'127.0.0.1' is not a valid IPv6 address for record type 'AAAA'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'InstanceProfileName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "MyAAAARecordSet", + "logicalId": "myInstanceProfile", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSet" + "resourceType": "AWS::IAM::InstanceProfile" }, - "propertyPath": "Properties.ResourceRecords.0", - "category": "Resource", - "startLine": 55, - "startColumn": 11, - "endLine": 55, - "endColumn": 12, - "ruleDescription": "Validate Route53 RecordSets", - "phase": "LINT" + "propertyPath": "Properties.InstanceProfileName", + "category": "Best Practice", + "startLine": 149, + "startColumn": 7, + "endLine": 149, + "endColumn": 26, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "E3023", - "severity": "ERROR", - "message": "'XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:1.2.3.4' is not a valid IPv6 address for record type 'AAAA'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Path' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "MyAAAARecordSet", + "logicalId": "myInstanceProfile", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSet" + "resourceType": "AWS::IAM::InstanceProfile" }, - "propertyPath": "Properties.ResourceRecords.1", - "category": "Resource", - "startLine": 56, - "startColumn": 11, - "endLine": 56, - "endColumn": 12, - "ruleDescription": "Validate Route53 RecordSets", - "phase": "LINT" + "propertyPath": "Properties.Path", + "category": "Best Practice", + "startLine": 150, + "startColumn": 7, + "endLine": 150, + "endColumn": 11, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "E3023", - "severity": "ERROR", - "message": "'2001:0db8: 85a3:0:0:8a2e:0370:7334' is not a valid IPv6 address for record type 'AAAA'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "MyAAAARecordSet", + "logicalId": "myInstanceSub", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSet" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.ResourceRecords.2", - "category": "Resource", - "startLine": 57, - "startColumn": 11, - "endLine": 57, - "endColumn": 12, - "ruleDescription": "Validate Route53 RecordSets", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Best Practice", + "startLine": 216, + "startColumn": 7, + "endLine": 216, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "E3023", - "severity": "ERROR", - "message": "'1111:2222:3333:4444:5555:6666:7777' is not a valid IPv6 address for record type 'AAAA'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "MyAAAARecordSet", + "logicalId": "myInstanceSub", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSet" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.ResourceRecords.3", - "category": "Resource", - "startLine": 58, - "startColumn": 11, - "endLine": 58, - "endColumn": 12, - "ruleDescription": "Validate Route53 RecordSets", - "phase": "LINT" + "propertyPath": "Properties.UserData", + "category": "Best Practice", + "startLine": 217, + "startColumn": 7, + "endLine": 217, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "E3023", - "severity": "ERROR", - "message": "'1111:2222:3333:4444:5555:6666:7777:8888::' is not a valid IPv6 address for record type 'AAAA'", - "source": "CFN_LINT", - "entity": { - "logicalId": "MyAAAARecordSet", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "taskdefinition", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSet" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.ResourceRecords.4", - "category": "Resource", - "startLine": 59, - "startColumn": 11, - "endLine": 59, - "endColumn": 12, - "ruleDescription": "Validate Route53 RecordSets", - "phase": "LINT" + "propertyPath": "Properties.RequiresCompatibilities", + "category": "Best Practice", + "startLine": 223, + "startColumn": 7, + "endLine": 223, + "endColumn": 30, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "E3023", - "severity": "ERROR", - "message": "CAA record value '127.0.0.1' must match format: flag tag 'value'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "MyCAARecordSet", + "logicalId": "taskdefinition", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSet" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.ResourceRecords.0", - "category": "Resource", - "startLine": 69, - "startColumn": 11, - "endLine": 69, - "endColumn": 12, - "ruleDescription": "Validate Route53 RecordSets", - "phase": "LINT" + "propertyPath": "Properties.ContainerDefinitions", + "category": "Best Practice", + "startLine": 226, + "startColumn": 7, + "endLine": 226, + "endColumn": 27, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "E3023", - "severity": "ERROR", - "message": "CAA record value '0 issue amazon.com; henk' must match format: flag tag 'value'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Volumes' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "MyCAARecordSet", + "logicalId": "taskdefinition", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSet" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.ResourceRecords.1", - "category": "Resource", - "startLine": 70, - "startColumn": 11, - "endLine": 70, - "endColumn": 12, - "ruleDescription": "Validate Route53 RecordSets", + "propertyPath": "Properties.Volumes", + "category": "Best Practice", + "startLine": 258, + "startColumn": 7, + "endLine": 258, + "endColumn": 14, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9003", + "severity": "INFO", + "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", + "source": "ENGINE", + "category": "Best Practice", + "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", "phase": "LINT" }, { - "ruleId": "E3023", - "severity": "ERROR", - "message": "CNAME records must have at most 1 ResourceRecord", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'mySecurityGroupVpc1' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "MyCNAMERecordSet", + "logicalId": "mySecurityGroupVpc1", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSet" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.ResourceRecords", - "category": "Resource", - "startLine": 79, - "startColumn": 7, - "endLine": 79, - "endColumn": 22, - "ruleDescription": "Validate Route53 RecordSets", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 25, + "startColumn": 5, + "endLine": 25, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "E3023", - "severity": "ERROR", - "message": "CNAME records must have at most 1 ResourceRecord", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'mySecurityGroupVpc2' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "MyCNAMERecordSetConditions", + "logicalId": "mySecurityGroupVpc2", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSet" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.ResourceRecords", - "category": "Resource", - "startLine": 93, - "startColumn": 11, - "endLine": 93, - "endColumn": 12, - "ruleDescription": "Validate Route53 RecordSets", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 35, + "startColumn": 5, + "endLine": 35, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "E3023", - "severity": "ERROR", - "message": "MX record value '127.0.0.1' must match format: priority domain", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'mySecurityGroupVpc3' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "MyMXRecordSet", + "logicalId": "mySecurityGroupVpc3", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSet" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.ResourceRecords.0", - "category": "Resource", - "startLine": 104, - "startColumn": 11, - "endLine": 104, - "endColumn": 12, - "ruleDescription": "Validate Route53 RecordSets", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 43, + "startColumn": 5, + "endLine": 43, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "E3023", - "severity": "ERROR", - "message": "MX record value '10 my domain' must match format: priority domain", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'myInstance' of type 'AWS::EC2::Instance' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "MyMXRecordSet", + "logicalId": "myInstance", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSet" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.ResourceRecords.1", - "category": "Resource", - "startLine": 105, - "startColumn": 11, - "endLine": 105, - "endColumn": 12, - "ruleDescription": "Validate Route53 RecordSets", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 52, + "startColumn": 5, + "endLine": 52, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "E3023", - "severity": "ERROR", - "message": "TXT record value 'test4' must be enclosed in double quotes", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'myBucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "MyRecordSetGroup", + "logicalId": "myBucket", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSetGroup" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.RecordSets.0.ResourceRecords.0", - "category": "Resource", - "startLine": 127, - "startColumn": 15, - "endLine": 127, - "endColumn": 16, - "ruleDescription": "Validate Route53 RecordSets", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 65, + "startColumn": 5, + "endLine": 65, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "E3023", - "severity": "ERROR", - "message": "'a.example.com' is not a valid IPv4 address for record type 'A'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'myRoleToWriteToS3' of type 'AWS::IAM::Role' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "MyRecordSetGroup", + "logicalId": "myRoleToWriteToS3", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSetGroup" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.RecordSets.1.ResourceRecords.0", - "category": "Resource", - "startLine": 132, - "startColumn": 15, - "endLine": 132, - "endColumn": 16, - "ruleDescription": "Validate Route53 RecordSets", - "phase": "LINT" - }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 99, + "startColumn": 5, + "endLine": 99, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, { - "ruleId": "E3023", - "severity": "ERROR", - "message": "'1111:2222:3333:4444:55556666:7777:8888' is not a valid IPv6 address for record type 'AAAA'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'myKms' of type 'AWS::KMS::Key' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "MyRecordSetGroup", + "logicalId": "myKms", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSetGroup" + "resourceType": "AWS::KMS::Key" }, - "propertyPath": "Properties.RecordSets.2.ResourceRecords.0", - "category": "Resource", - "startLine": 137, - "startColumn": 15, - "endLine": 137, - "endColumn": 16, - "ruleDescription": "Validate Route53 RecordSets", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 155, + "startColumn": 5, + "endLine": 155, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "E3023", - "severity": "ERROR", - "message": "'1111:2222:3333:4444:5555:6666:7777:8888:' is not a valid IPv6 address for record type 'AAAA'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'myInstanceSub' of type 'AWS::EC2::Instance' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "MyRecordSetGroup", + "logicalId": "myInstanceSub", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSetGroup" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.RecordSets.2.ResourceRecords.1", - "category": "Resource", - "startLine": 138, - "startColumn": 15, - "endLine": 138, - "endColumn": 16, - "ruleDescription": "Validate Route53 RecordSets", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 215, + "startColumn": 5, + "endLine": 215, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "E3023", - "severity": "ERROR", - "message": "'1111:2222:3333:::5555:6666:7777:8888' is not a valid IPv6 address for record type 'AAAA'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'taskdefinition' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "MyRecordSetGroup", + "logicalId": "taskdefinition", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSetGroup" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.RecordSets.2.ResourceRecords.2", - "category": "Resource", - "startLine": 139, - "startColumn": 15, - "endLine": 139, - "endColumn": 16, - "ruleDescription": "Validate Route53 RecordSets", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 222, + "startColumn": 5, + "endLine": 222, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "bad/resources_circular_dependency_2.yaml": { + "filePath": "bad/resources_circular_dependency_2.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 9, + "counts": { + "fatal": 9, + "errors": 0, + "warnings": 0, + "informational": 9, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "E3023", - "severity": "ERROR", - "message": "'1111::3333:4444:5555::7777:8888' is not a valid IPv6 address for record type 'AAAA'", - "source": "CFN_LINT", + "ruleId": "F3004", + "severity": "FATAL", + "message": "Circular Dependencies for resource Resource. Circular dependency with [Resource -> Resource2 -> Resource3 -> Resource4 -> Resource5 -> Resource6 -> Resource7 -> Resource8 -> Resource9 -> Resource]", + "source": "SCHEMA", "entity": { - "logicalId": "MyRecordSetGroup", + "logicalId": "Resource", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSetGroup" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.RecordSets.2.ResourceRecords.3", - "category": "Resource", - "startLine": 140, - "startColumn": 15, - "endLine": 140, - "endColumn": 16, - "ruleDescription": "Validate Route53 RecordSets", + "propertyPath": "Resources/Resource", + "category": "Reference", + "startLine": 2, + "startColumn": 3, + "endLine": 2, + "endColumn": 11, + "ruleDescription": "Circular dependency detected", "phase": "LINT" }, { - "ruleId": "E3023", - "severity": "ERROR", - "message": "'::1.2.3.' is not a valid IPv6 address for record type 'AAAA'", - "source": "CFN_LINT", + "ruleId": "F3004", + "severity": "FATAL", + "message": "Circular Dependencies for resource Resource2. Circular dependency with [Resource2 -> Resource3 -> Resource4 -> Resource5 -> Resource6 -> Resource7 -> Resource8 -> Resource9 -> Resource -> Resource2]", + "source": "SCHEMA", "entity": { - "logicalId": "MyRecordSetGroup", + "logicalId": "Resource2", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSetGroup" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.RecordSets.2.ResourceRecords.4", - "category": "Resource", - "startLine": 141, - "startColumn": 15, - "endLine": 141, - "endColumn": 16, - "ruleDescription": "Validate Route53 RecordSets", + "propertyPath": "Resources/Resource2", + "category": "Reference", + "startLine": 7, + "startColumn": 3, + "endLine": 7, + "endColumn": 12, + "ruleDescription": "Circular dependency detected", "phase": "LINT" }, { - "ruleId": "E3023", - "severity": "ERROR", - "message": "':1111:2222:3333:4444:5555::7777:8888' is not a valid IPv6 address for record type 'AAAA'", - "source": "CFN_LINT", + "ruleId": "F3004", + "severity": "FATAL", + "message": "Circular Dependencies for resource Resource3. Circular dependency with [Resource3 -> Resource4 -> Resource5 -> Resource6 -> Resource7 -> Resource8 -> Resource9 -> Resource -> Resource2 -> Resource3]", + "source": "SCHEMA", "entity": { - "logicalId": "MyRecordSetGroup", + "logicalId": "Resource3", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSetGroup" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.RecordSets.2.ResourceRecords.5", - "category": "Resource", - "startLine": 142, - "startColumn": 15, - "endLine": 142, - "endColumn": 16, - "ruleDescription": "Validate Route53 RecordSets", + "propertyPath": "Resources/Resource3", + "category": "Reference", + "startLine": 12, + "startColumn": 3, + "endLine": 12, + "endColumn": 12, + "ruleDescription": "Circular dependency detected", "phase": "LINT" }, { - "ruleId": "E3023", - "severity": "ERROR", - "message": "'127.0.0.1 ' is not a valid IPv4 address for record type 'A'", - "source": "CFN_LINT", + "ruleId": "F3004", + "severity": "FATAL", + "message": "Circular Dependencies for resource Resource4. Circular dependency with [Resource4 -> Resource5 -> Resource6 -> Resource7 -> Resource8 -> Resource9 -> Resource -> Resource2 -> Resource3 -> Resource4]", + "source": "SCHEMA", "entity": { - "logicalId": "MyRecordSetGroup", + "logicalId": "Resource4", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSetGroup" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.RecordSets.3.ResourceRecords.0", - "category": "Resource", - "startLine": 147, - "startColumn": 15, - "endLine": 147, - "endColumn": 16, - "ruleDescription": "Validate Route53 RecordSets", + "propertyPath": "Resources/Resource4", + "category": "Reference", + "startLine": 17, + "startColumn": 3, + "endLine": 17, + "endColumn": 12, + "ruleDescription": "Circular dependency detected", "phase": "LINT" }, { - "ruleId": "E3023", - "severity": "ERROR", - "message": "'256.10.1.256' is not a valid IPv4 address for record type 'A'", - "source": "CFN_LINT", + "ruleId": "F3004", + "severity": "FATAL", + "message": "Circular Dependencies for resource Resource5. Circular dependency with [Resource5 -> Resource6 -> Resource7 -> Resource8 -> Resource9 -> Resource -> Resource2 -> Resource3 -> Resource4 -> Resource5]", + "source": "SCHEMA", "entity": { - "logicalId": "MyRecordSetGroup", + "logicalId": "Resource5", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSetGroup" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.RecordSets.4.ResourceRecords.0", - "category": "Resource", - "startLine": 152, - "startColumn": 15, - "endLine": 152, - "endColumn": 16, - "ruleDescription": "Validate Route53 RecordSets", + "propertyPath": "Resources/Resource5", + "category": "Reference", + "startLine": 22, + "startColumn": 3, + "endLine": 22, + "endColumn": 12, + "ruleDescription": "Circular dependency detected", "phase": "LINT" }, { - "ruleId": "E3023", - "severity": "ERROR", - "message": "CAA record value '1 issue \"amazon.com; example.com\"' must match format: flag tag 'value'", - "source": "CFN_LINT", + "ruleId": "F3004", + "severity": "FATAL", + "message": "Circular Dependencies for resource Resource6. Circular dependency with [Resource6 -> Resource7 -> Resource8 -> Resource9 -> Resource -> Resource2 -> Resource3 -> Resource4 -> Resource5 -> Resource6]", + "source": "SCHEMA", "entity": { - "logicalId": "MyRecordSetGroup", + "logicalId": "Resource6", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSetGroup" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.RecordSets.5.ResourceRecords.0", - "category": "Resource", - "startLine": 157, - "startColumn": 15, - "endLine": 157, - "endColumn": 16, - "ruleDescription": "Validate Route53 RecordSets", + "propertyPath": "Resources/Resource6", + "category": "Reference", + "startLine": 27, + "startColumn": 3, + "endLine": 27, + "endColumn": 12, + "ruleDescription": "Circular dependency detected", "phase": "LINT" }, { - "ruleId": "E3023", - "severity": "ERROR", - "message": "CAA record value 'A issue \"amazon.com; example.com\"' must match format: flag tag 'value'", - "source": "CFN_LINT", + "ruleId": "F3004", + "severity": "FATAL", + "message": "Circular Dependencies for resource Resource7. Circular dependency with [Resource7 -> Resource8 -> Resource9 -> Resource -> Resource2 -> Resource3 -> Resource4 -> Resource5 -> Resource6 -> Resource7]", + "source": "SCHEMA", "entity": { - "logicalId": "MyRecordSetGroup", + "logicalId": "Resource7", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSetGroup" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.RecordSets.5.ResourceRecords.1", - "category": "Resource", - "startLine": 158, - "startColumn": 15, - "endLine": 158, - "endColumn": 16, - "ruleDescription": "Validate Route53 RecordSets", + "propertyPath": "Resources/Resource7", + "category": "Reference", + "startLine": 32, + "startColumn": 3, + "endLine": 32, + "endColumn": 12, + "ruleDescription": "Circular dependency detected", "phase": "LINT" }, { - "ruleId": "E3023", - "severity": "ERROR", - "message": "CAA record value '0 special-value \"amazon.com\"' must match format: flag tag 'value'", - "source": "CFN_LINT", + "ruleId": "F3004", + "severity": "FATAL", + "message": "Circular Dependencies for resource Resource8. Circular dependency with [Resource8 -> Resource9 -> Resource -> Resource2 -> Resource3 -> Resource4 -> Resource5 -> Resource6 -> Resource7 -> Resource8]", + "source": "SCHEMA", "entity": { - "logicalId": "MyRecordSetGroup", + "logicalId": "Resource8", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSetGroup" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.RecordSets.5.ResourceRecords.2", - "category": "Resource", - "startLine": 159, - "startColumn": 15, - "endLine": 159, - "endColumn": 16, - "ruleDescription": "Validate Route53 RecordSets", + "propertyPath": "Resources/Resource8", + "category": "Reference", + "startLine": 37, + "startColumn": 3, + "endLine": 37, + "endColumn": 12, + "ruleDescription": "Circular dependency detected", "phase": "LINT" }, { - "ruleId": "E3023", - "severity": "ERROR", - "message": "MX record value 'mx1.example.com' must match format: priority domain", - "source": "CFN_LINT", + "ruleId": "F3004", + "severity": "FATAL", + "message": "Circular Dependencies for resource Resource9. Circular dependency with [Resource9 -> Resource -> Resource2 -> Resource3 -> Resource4 -> Resource5 -> Resource6 -> Resource7 -> Resource8 -> Resource9]", + "source": "SCHEMA", "entity": { - "logicalId": "MyRecordSetGroup", + "logicalId": "Resource9", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSetGroup" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.RecordSets.7.ResourceRecords.0", - "category": "Resource", - "startLine": 169, - "startColumn": 15, - "endLine": 169, - "endColumn": 16, - "ruleDescription": "Validate Route53 RecordSets", + "propertyPath": "Resources/Resource9", + "category": "Reference", + "startLine": 42, + "startColumn": 3, + "endLine": 42, + "endColumn": 12, + "ruleDescription": "Circular dependency detected", "phase": "LINT" }, { - "ruleId": "E3023", - "severity": "ERROR", - "message": "MX record value '65536 mx2.example.com' must match format: priority domain", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "MyRecordSetGroup", + "logicalId": "Resource", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSetGroup" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.RecordSets.7.ResourceRecords.1", - "category": "Resource", - "startLine": 170, - "startColumn": 15, - "endLine": 170, - "endColumn": 16, - "ruleDescription": "Validate Route53 RecordSets", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 4, + "startColumn": 5, + "endLine": 4, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "E3029", - "severity": "ERROR", - "message": "TTL must not be set when AliasTarget is specified", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource2' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "MyAliasRecordSet", + "logicalId": "Resource2", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSet" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.TTL", - "category": "Resource", - "startLine": 113, - "startColumn": 7, - "endLine": 113, - "endColumn": 10, - "ruleDescription": "Validate Route53 record set aliases", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 9, + "startColumn": 5, + "endLine": 9, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "W1054", - "severity": "WARN", - "message": "Found a string 'AWS::Region' that appears to be a pseudo parameter reference; use 'Ref: AWS::Region' instead", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Resource3' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "MyHostedZone", + "logicalId": "Resource3", "entityType": "Resource", - "resourceType": "AWS::Route53::HostedZone" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.VPCs.0.VPCRegion", - "suggestedFix": "Use Ref to reference pseudo parameters instead of embedding them as literal strings", - "category": "Intrinsic Function", - "startLine": 22, - "startColumn": 11, - "endLine": 22, - "endColumn": 20, - "ruleDescription": "String value matches a pseudo parameter; use Ref instead", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 14, + "startColumn": 5, + "endLine": 14, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Name' is create-only; updating it will cause resource replacement", + "message": "Resource 'Resource4' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "MyHostedZone", + "logicalId": "Resource4", "entityType": "Resource", - "resourceType": "AWS::Route53::HostedZone" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.Name", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", "startLine": 19, - "startColumn": 7, + "startColumn": 5, "endLine": 19, - "endColumn": 11, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'HostedZoneId' is create-only; updating it will cause resource replacement", + "message": "Resource 'Resource5' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "MyTXTRecordSet", + "logicalId": "Resource5", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSet" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.HostedZoneId", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 27, - "startColumn": 7, - "endLine": 27, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53-recordset", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'MyHostedZone'" - } + "startLine": 24, + "startColumn": 5, + "endLine": 24, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'HostedZoneId' is create-only; updating it will cause resource replacement", + "message": "Resource 'Resource6' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "MyARecordSet", + "logicalId": "Resource6", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSet" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.HostedZoneId", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 40, - "startColumn": 7, - "endLine": 40, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53-recordset", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'MyHostedZone'" - } + "startLine": 29, + "startColumn": 5, + "endLine": 29, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'HostedZoneId' is create-only; updating it will cause resource replacement", + "message": "Resource 'Resource7' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "MyAAAARecordSet", + "logicalId": "Resource7", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSet" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.HostedZoneId", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 50, - "startColumn": 7, - "endLine": 50, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53-recordset", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'MyHostedZone'" - } + "startLine": 34, + "startColumn": 5, + "endLine": 34, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'HostedZoneId' is create-only; updating it will cause resource replacement", + "message": "Resource 'Resource8' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "MyCAARecordSet", + "logicalId": "Resource8", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSet" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.HostedZoneId", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 64, - "startColumn": 7, - "endLine": 64, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53-recordset", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'MyHostedZone'" - } + "startLine": 39, + "startColumn": 5, + "endLine": 39, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'HostedZoneId' is create-only; updating it will cause resource replacement", + "message": "Resource 'Resource9' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "MyCNAMERecordSet", + "logicalId": "Resource9", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSet" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.HostedZoneId", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 75, - "startColumn": 7, - "endLine": 75, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53-recordset", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'MyHostedZone'" - } + "startLine": 42, + "startColumn": 3, + "endLine": 42, + "endColumn": 12, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "bad/resources_circular_dependency_dependson.yaml": { + "filePath": "bad/resources_circular_dependency_dependson.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 2, + "counts": { + "fatal": 2, + "errors": 0, + "warnings": 0, + "informational": 2, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'HostedZoneId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "F3004", + "severity": "FATAL", + "message": "Circular Dependencies for resource Resource. Circular dependency with [Resource -> Resource2 -> Resource]", + "source": "SCHEMA", "entity": { - "logicalId": "MyCNAMERecordSetConditions", + "logicalId": "Resource", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSet" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.HostedZoneId", - "category": "Best Practice", - "startLine": 86, - "startColumn": 7, - "endLine": 86, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53-recordset", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'MyHostedZone'" - } + "propertyPath": "Resources/Resource", + "category": "Reference", + "startLine": 4, + "startColumn": 3, + "endLine": 4, + "endColumn": 11, + "ruleDescription": "Circular dependency detected", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'HostedZoneId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "F3004", + "severity": "FATAL", + "message": "Circular Dependencies for resource Resource2. Circular dependency with [Resource2 -> Resource -> Resource2]", + "source": "SCHEMA", "entity": { - "logicalId": "MyMXRecordSet", + "logicalId": "Resource2", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSet" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.HostedZoneId", - "category": "Best Practice", - "startLine": 99, - "startColumn": 7, - "endLine": 99, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53-recordset", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'MyHostedZone'" - } + "propertyPath": "Resources/Resource2", + "category": "Reference", + "startLine": 7, + "startColumn": 3, + "endLine": 7, + "endColumn": 12, + "ruleDescription": "Circular dependency detected", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'HostedZoneId' is create-only; updating it will cause resource replacement", + "message": "Resource 'Resource' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "MyAliasRecordSet", + "logicalId": "Resource", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSet" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.HostedZoneId", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 110, - "startColumn": 7, - "endLine": 110, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53-recordset", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'MyHostedZone'" - } + "startLine": 4, + "startColumn": 3, + "endLine": 4, + "endColumn": 11, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'HostedZoneId' is create-only; updating it will cause resource replacement", + "message": "Resource 'Resource2' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "MyRecordSetGroup", + "logicalId": "Resource2", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSetGroup" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.HostedZoneId", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 121, - "startColumn": 7, - "endLine": 121, - "endColumn": 19, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'MyHostedZone'" - } + "startLine": 7, + "startColumn": 3, + "endLine": 7, + "endColumn": 12, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "bad/resources_cloudfront_invalid_aliases.yaml": { + "filePath": "bad/resources_cloudfront_invalid_aliases.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 8, + "warnings": 0, + "informational": 1, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'HostedZoneId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E3013", + "severity": "ERROR", + "message": "CloudFront alias 'email.*.example.com' has wildcard in invalid position", + "source": "CFN_LINT", "entity": { - "logicalId": "PoorlyConfiguredRoute53", + "logicalId": "CloudFrontDistribution", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSetGroup" + "resourceType": "AWS::CloudFront::Distribution" }, - "propertyPath": "Properties.HostedZoneId", - "category": "Best Practice", - "startLine": 174, - "startColumn": 7, - "endLine": 174, - "endColumn": 19, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'MyHostedZone'" - } - }, - { - "ruleId": "I9002", - "severity": "INFO", - "message": "'TTL' is ignored in this configuration (from extension)", - "source": "ENGINE", - "entity": { - "logicalId": "MyAliasRecordSet", - "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSet" - }, - "propertyPath": "Properties.TTL", - "category": "Best Practice", - "startLine": 113, - "startColumn": 7, - "endLine": 113, - "endColumn": 10, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53-recordset", - "ruleDescription": "Property is ignored in this configuration (from extension)", - "phase": "SCHEMA" - } - ] - }, - "bad/route53_conditional_record_arrays.yaml": { - "filePath": "bad/route53_conditional_record_arrays.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 10, - "counts": { - "fatal": 0, - "errors": 10, - "warnings": 0, - "informational": 10, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "E3023", - "severity": "ERROR", - "message": "'invalid-standalone-true' is not a valid IPv4 address for record type 'A'", - "source": "CFN_LINT", - "entity": { - "logicalId": "StandaloneInvalidTrue", - "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSet" - }, - "propertyPath": "Properties.ResourceRecords.0", + "propertyPath": "Properties.DistributionConfig.Aliases.13", "category": "Resource", "startLine": 21, - "startColumn": 12, + "startColumn": 13, "endLine": 21, - "endColumn": 13, - "ruleDescription": "Validate Route53 RecordSets", + "endColumn": 15, + "ruleDescription": "CloudFront Aliases", "phase": "LINT" }, { - "ruleId": "E3023", + "ruleId": "E3013", "severity": "ERROR", - "message": "'invalid-standalone-false' is not a valid IPv4 address for record type 'A'", + "message": "CloudFront alias 'WWW.EXAMPLE.COM' is not a valid domain name", "source": "CFN_LINT", "entity": { - "logicalId": "StandaloneInvalidFalse", + "logicalId": "CloudFrontDistribution", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSet" + "resourceType": "AWS::CloudFront::Distribution" }, - "propertyPath": "Properties.ResourceRecords.0", + "propertyPath": "Properties.DistributionConfig.Aliases.14", "category": "Resource", - "startLine": 33, - "startColumn": 12, - "endLine": 33, - "endColumn": 13, - "ruleDescription": "Validate Route53 RecordSets", + "startLine": 22, + "startColumn": 13, + "endLine": 22, + "endColumn": 15, + "ruleDescription": "CloudFront Aliases", "phase": "LINT" }, { - "ruleId": "E3023", + "ruleId": "E3013", "severity": "ERROR", - "message": "'invalid-standalone-mixed-true' is not a valid IPv4 address for record type 'A'", + "message": "CloudFront alias '-example.com' is not a valid domain name", "source": "CFN_LINT", "entity": { - "logicalId": "StandaloneMixedInvalidTrue", + "logicalId": "CloudFrontDistribution", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSet" + "resourceType": "AWS::CloudFront::Distribution" }, - "propertyPath": "Properties.ResourceRecords.1", + "propertyPath": "Properties.DistributionConfig.Aliases.15", "category": "Resource", - "startLine": 44, + "startLine": 23, "startColumn": 13, - "endLine": 44, - "endColumn": 14, - "ruleDescription": "Validate Route53 RecordSets", + "endLine": 23, + "endColumn": 15, + "ruleDescription": "CloudFront Aliases", "phase": "LINT" }, { - "ruleId": "E3023", + "ruleId": "E3013", "severity": "ERROR", - "message": "'invalid-standalone-mixed-false' is not a valid IPv4 address for record type 'A'", + "message": "CloudFront alias 'example.c' is not a valid domain name", "source": "CFN_LINT", "entity": { - "logicalId": "StandaloneMixedInvalidFalse", + "logicalId": "CloudFrontDistribution", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSet" + "resourceType": "AWS::CloudFront::Distribution" }, - "propertyPath": "Properties.ResourceRecords.1", + "propertyPath": "Properties.DistributionConfig.Aliases.16", "category": "Resource", - "startLine": 57, + "startLine": 24, "startColumn": 13, - "endLine": 57, - "endColumn": 14, - "ruleDescription": "Validate Route53 RecordSets", + "endLine": 24, + "endColumn": 15, + "ruleDescription": "CloudFront Aliases", "phase": "LINT" }, { - "ruleId": "E3023", + "ruleId": "E3013", "severity": "ERROR", - "message": "'invalid-group-true' is not a valid IPv4 address for record type 'A'", + "message": "CloudFront alias 'www.example.com ' is not a valid domain name", "source": "CFN_LINT", "entity": { - "logicalId": "GroupInvalidTrue", + "logicalId": "CloudFrontDistribution", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSetGroup" + "resourceType": "AWS::CloudFront::Distribution" }, - "propertyPath": "Properties.RecordSets.0.ResourceRecords.0", + "propertyPath": "Properties.DistributionConfig.Aliases.17", "category": "Resource", - "startLine": 67, - "startColumn": 31, - "endLine": 67, - "endColumn": 32, - "ruleDescription": "Validate Route53 RecordSets", + "startLine": 25, + "startColumn": 13, + "endLine": 25, + "endColumn": 15, + "ruleDescription": "CloudFront Aliases", "phase": "LINT" }, { - "ruleId": "E3023", + "ruleId": "E3013", "severity": "ERROR", - "message": "'invalid-group-false' is not a valid IPv4 address for record type 'A'", + "message": "CloudFront alias 'www.-example.com' is not a valid domain name", "source": "CFN_LINT", "entity": { - "logicalId": "GroupInvalidFalse", + "logicalId": "CloudFrontDistribution", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSetGroup" + "resourceType": "AWS::CloudFront::Distribution" }, - "propertyPath": "Properties.RecordSets.0.ResourceRecords.0", + "propertyPath": "Properties.DistributionConfig.Aliases.18", "category": "Resource", - "startLine": 85, - "startColumn": 31, - "endLine": 85, - "endColumn": 32, - "ruleDescription": "Validate Route53 RecordSets", + "startLine": 26, + "startColumn": 13, + "endLine": 26, + "endColumn": 15, + "ruleDescription": "CloudFront Aliases", "phase": "LINT" }, { - "ruleId": "E3023", + "ruleId": "E3013", "severity": "ERROR", - "message": "'invalid-group-mixed-true' is not a valid IPv4 address for record type 'A'", + "message": "CloudFront alias '-www.example.com' is not a valid domain name", "source": "CFN_LINT", "entity": { - "logicalId": "GroupMixedInvalidTrue", + "logicalId": "CloudFrontDistribution", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSetGroup" + "resourceType": "AWS::CloudFront::Distribution" }, - "propertyPath": "Properties.RecordSets.0.ResourceRecords.1", + "propertyPath": "Properties.DistributionConfig.Aliases.19", "category": "Resource", - "startLine": 97, - "startColumn": 17, - "endLine": 97, - "endColumn": 18, - "ruleDescription": "Validate Route53 RecordSets", + "startLine": 27, + "startColumn": 13, + "endLine": 27, + "endColumn": 15, + "ruleDescription": "CloudFront Aliases", "phase": "LINT" }, { - "ruleId": "E3023", + "ruleId": "E3013", "severity": "ERROR", - "message": "'invalid-group-mixed-false' is not a valid IPv4 address for record type 'A'", + "message": "CloudFront alias 'www.example.com-' is not a valid domain name", "source": "CFN_LINT", "entity": { - "logicalId": "GroupMixedInvalidFalse", + "logicalId": "CloudFrontDistribution", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSetGroup" + "resourceType": "AWS::CloudFront::Distribution" }, - "propertyPath": "Properties.RecordSets.0.ResourceRecords.1", + "propertyPath": "Properties.DistributionConfig.Aliases.20", "category": "Resource", - "startLine": 117, - "startColumn": 17, - "endLine": 117, - "endColumn": 18, - "ruleDescription": "Validate Route53 RecordSets", + "startLine": 28, + "startColumn": 13, + "endLine": 28, + "endColumn": 15, + "ruleDescription": "CloudFront Aliases", "phase": "LINT" }, { - "ruleId": "E3023", - "severity": "ERROR", - "message": "CNAME records must have at most 1 ResourceRecord", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'CloudFrontDistribution' of type 'AWS::CloudFront::Distribution' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "StandaloneUnresolvedCnameCardinality", + "logicalId": "CloudFrontDistribution", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSet" + "resourceType": "AWS::CloudFront::Distribution" }, - "propertyPath": "Properties.ResourceRecords", - "category": "Resource", - "startLine": 125, - "startColumn": 7, - "endLine": 125, - "endColumn": 22, - "ruleDescription": "Validate Route53 RecordSets", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "bad/resources_cognito_userpool_tag_is_list.yaml": { + "filePath": "bad/resources_cognito_userpool_tag_is_list.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 1, + "errors": 0, + "warnings": 0, + "informational": 2, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "E3023", - "severity": "ERROR", - "message": "CNAME records must have at most 1 ResourceRecord", - "source": "CFN_LINT", + "ruleId": "F3012", + "severity": "FATAL", + "message": "[{'Key': 'Key1', 'Value': 'Value1'}, {'Key': 'Key2', 'Value': 'Value2'}] is not of type 'object'", + "source": "SCHEMA", "entity": { - "logicalId": "GroupUnresolvedCnameCardinality", + "logicalId": "MyCognitoUserPool", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSetGroup" + "resourceType": "AWS::Cognito::UserPool" }, - "propertyPath": "Properties.RecordSets.0.ResourceRecords", - "category": "Resource", - "startLine": 136, - "startColumn": 11, - "endLine": 136, - "endColumn": 26, - "ruleDescription": "Validate Route53 RecordSets", - "phase": "LINT" - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'HostedZoneName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "StandaloneInvalidTrue", - "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSet" - }, - "propertyPath": "Properties.HostedZoneName", - "category": "Best Practice", - "startLine": 15, + "propertyPath": "Properties.UserPoolTags", + "category": "Schema", + "startLine": 16, "startColumn": 7, - "endLine": 15, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53-recordset", - "ruleDescription": "Create-only property updated triggers resource replacement", + "endLine": 16, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Property type mismatch", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "actualValue": [ + { + "Key": "Key1", + "Value": "Value1" + }, + { + "Key": "Key2", + "Value": "Value2" + } + ], + "expectedConstraint": "object" } }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'HostedZoneName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "StandaloneInvalidFalse", + "logicalId": "MyCognitoUserPool", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSet" + "resourceType": "AWS::Cognito::UserPool" }, - "propertyPath": "Properties.HostedZoneName", "category": "Best Practice", - "startLine": 26, - "startColumn": 7, - "endLine": 26, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53-recordset", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 20, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'HostedZoneName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "StandaloneMixedInvalidTrue", + "logicalId": "MyCognitoUserPool", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSet" + "resourceType": "AWS::Cognito::UserPool" }, - "propertyPath": "Properties.HostedZoneName", "category": "Best Practice", - "startLine": 37, - "startColumn": 7, - "endLine": 37, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53-recordset", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 20, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + } + ] + }, + "bad/resources_deletionpolicy.yaml": { + "filePath": "bad/resources_deletionpolicy.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 5, + "counts": { + "fatal": 5, + "errors": 0, + "warnings": 8, + "informational": 17, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'HostedZoneName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "F3016", + "severity": "FATAL", + "message": "DeletionPolicy must be one of Delete, Retain, RetainExceptOnCreate, Snapshot, got a list", + "source": "SCHEMA", "entity": { - "logicalId": "StandaloneMixedInvalidFalse", + "logicalId": "PolicyList", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSet" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.HostedZoneName", - "category": "Best Practice", - "startLine": 49, - "startColumn": 7, - "endLine": 49, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53-recordset", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "propertyPath": "DeletionPolicy", + "category": "Structure", + "startLine": 16, + "startColumn": 5, + "endLine": 16, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "DeletionPolicy must be valid", + "phase": "SCHEMA" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'HostedZoneName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "F3016", + "severity": "FATAL", + "message": "DeletionPolicy must be one of Delete, Retain, RetainExceptOnCreate, Snapshot, got 'CopyRegion'", + "source": "SCHEMA", "entity": { - "logicalId": "GroupInvalidTrue", + "logicalId": "MadeUpPolicy", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSetGroup" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.HostedZoneName", - "category": "Best Practice", - "startLine": 61, - "startColumn": 7, - "endLine": 61, - "endColumn": 21, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "propertyPath": "DeletionPolicy", + "category": "Structure", + "startLine": 23, + "startColumn": 5, + "endLine": 23, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "DeletionPolicy must be valid", + "phase": "SCHEMA" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'HostedZoneName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "F3016", + "severity": "FATAL", + "message": "DeletionPolicy must be one of Delete, Retain, RetainExceptOnCreate, got 'Snapshot'", + "source": "SCHEMA", "entity": { - "logicalId": "GroupInvalidFalse", + "logicalId": "MyIAMUser", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSetGroup" + "resourceType": "AWS::IAM::User" }, - "propertyPath": "Properties.HostedZoneName", - "category": "Best Practice", - "startLine": 75, - "startColumn": 7, - "endLine": 75, - "endColumn": 21, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "propertyPath": "DeletionPolicy", + "category": "Structure", + "startLine": 29, + "startColumn": 5, + "endLine": 29, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "ruleDescription": "DeletionPolicy must be valid", + "phase": "SCHEMA" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'HostedZoneName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "F3016", + "severity": "FATAL", + "message": "DeletionPolicy must be one of Delete, Retain, RetainExceptOnCreate, got a list", + "source": "SCHEMA", "entity": { - "logicalId": "GroupMixedInvalidTrue", + "logicalId": "UnsupportedIntrinsic", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSetGroup" + "resourceType": "AWS::CloudFormation::WaitConditionHandle" }, - "propertyPath": "Properties.HostedZoneName", - "category": "Best Practice", - "startLine": 89, - "startColumn": 7, - "endLine": 89, - "endColumn": 21, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "propertyPath": "DeletionPolicy", + "category": "Structure", + "startLine": 32, + "startColumn": 5, + "endLine": 32, + "endColumn": 19, + "ruleDescription": "DeletionPolicy must be valid", + "phase": "SCHEMA" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'HostedZoneName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "F3016", + "severity": "FATAL", + "message": "DeletionPolicy must be one of Delete, Retain, RetainExceptOnCreate, Snapshot, got an object", + "source": "SCHEMA", "entity": { - "logicalId": "GroupMixedInvalidFalse", + "logicalId": "InvalidMapping", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSetGroup" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.HostedZoneName", - "category": "Best Practice", - "startLine": 105, - "startColumn": 7, - "endLine": 105, - "endColumn": 21, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "propertyPath": "DeletionPolicy", + "category": "Structure", + "startLine": 43, + "startColumn": 5, + "endLine": 43, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "DeletionPolicy must be valid", + "phase": "SCHEMA" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'HostedZoneName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'DBPolicy' is not referenced anywhere in the template", + "source": "CFN_LINT", "entity": { - "logicalId": "StandaloneUnresolvedCnameCardinality", - "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSet" + "logicalId": "DBPolicy", + "entityType": "Parameter" }, - "propertyPath": "Properties.HostedZoneName", + "propertyPath": "Parameters/DBPolicy", "category": "Best Practice", - "startLine": 121, - "startColumn": 7, - "endLine": 121, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53-recordset", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 6, + "startColumn": 3, + "endLine": 6, + "endColumn": 11, + "ruleDescription": "Check if Parameters are Used", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'HostedZoneName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W3011", + "severity": "WARN", + "message": "Both 'UpdateReplacePolicy' and 'DeletionPolicy' are needed to protect resource from deletion", + "source": "CFN_LINT", "entity": { - "logicalId": "GroupUnresolvedCnameCardinality", + "logicalId": "PolicyList", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSetGroup" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.HostedZoneName", "category": "Best Practice", - "startLine": 131, - "startColumn": 7, - "endLine": 131, - "endColumn": 21, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - } - ] - }, - "bad/route53_conditional_scenarios.yaml": { - "filePath": "bad/route53_conditional_scenarios.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 7, - "counts": { - "fatal": 0, - "errors": 8, - "warnings": 0, - "informational": 3, - "debug": 0 + "startLine": 10, + "startColumn": 3, + "endLine": 10, + "endColumn": 13, + "ruleDescription": "Check resources with UpdateReplacePolicy/DeletionPolicy have both", + "phase": "LINT" }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "E3023", - "severity": "ERROR", - "message": "'not-an-ipv4-address' is not a valid IPv4 address for record type 'A'", + "ruleId": "W3011", + "severity": "WARN", + "message": "Both 'UpdateReplacePolicy' and 'DeletionPolicy' are needed to protect resource from deletion", "source": "CFN_LINT", "entity": { - "logicalId": "ConditionalRecordSetsInvalidFirst", + "logicalId": "MadeUpPolicy", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSetGroup" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.RecordSets.0.ResourceRecords.0", - "category": "Resource", - "startLine": 60, - "startColumn": 31, - "endLine": 60, - "endColumn": 32, - "ruleDescription": "Validate Route53 RecordSets", + "category": "Best Practice", + "startLine": 17, + "startColumn": 3, + "endLine": 17, + "endColumn": 15, + "ruleDescription": "Check resources with UpdateReplacePolicy/DeletionPolicy have both", "phase": "LINT" }, { - "ruleId": "E3023", - "severity": "ERROR", - "message": "'still-not-an-ipv4-address' is not a valid IPv4 address for record type 'A'", + "ruleId": "W3011", + "severity": "WARN", + "message": "Both 'UpdateReplacePolicy' and 'DeletionPolicy' are needed to protect resource from deletion", "source": "CFN_LINT", "entity": { - "logicalId": "ConditionalRecordSetsInvalidSecond", + "logicalId": "MyIAMUser", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSetGroup" + "resourceType": "AWS::IAM::User" }, - "propertyPath": "Properties.RecordSets.0.ResourceRecords.0", - "category": "Resource", - "startLine": 78, - "startColumn": 31, - "endLine": 78, - "endColumn": 32, - "ruleDescription": "Validate Route53 RecordSets", + "category": "Best Practice", + "startLine": 24, + "startColumn": 3, + "endLine": 24, + "endColumn": 12, + "ruleDescription": "Check resources with UpdateReplacePolicy/DeletionPolicy have both", "phase": "LINT" }, { - "ruleId": "E3023", - "severity": "ERROR", - "message": "'invalid-first-branch' is not a valid IPv4 address for record type 'A'", + "ruleId": "W3011", + "severity": "WARN", + "message": "Both 'UpdateReplacePolicy' and 'DeletionPolicy' are needed to protect resource from deletion", "source": "CFN_LINT", "entity": { - "logicalId": "WholePropertiesRecordsInvalidFirst", + "logicalId": "UnsupportedIntrinsic", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSetGroup" + "resourceType": "AWS::CloudFormation::WaitConditionHandle" }, - "propertyPath": "Properties.RecordSets.0.ResourceRecords.0", - "category": "Resource", - "startLine": 88, - "startColumn": 31, - "endLine": 88, - "endColumn": 32, - "ruleDescription": "Validate Route53 RecordSets", + "category": "Best Practice", + "startLine": 30, + "startColumn": 3, + "endLine": 30, + "endColumn": 23, + "ruleDescription": "Check resources with UpdateReplacePolicy/DeletionPolicy have both", "phase": "LINT" }, { - "ruleId": "E3023", - "severity": "ERROR", - "message": "'invalid-second-branch' is not a valid IPv4 address for record type 'A'", - "source": "CFN_LINT", + "ruleId": "W9008", + "severity": "WARN", + "message": "RDS instance should have StorageEncrypted set to true", + "source": "ENGINE", "entity": { - "logicalId": "WholePropertiesRecordsInvalidSecond", + "logicalId": "PolicyList", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSetGroup" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.RecordSets.0.ResourceRecords.0", - "category": "Resource", - "startLine": 110, - "startColumn": 31, - "endLine": 110, - "endColumn": 32, - "ruleDescription": "Validate Route53 RecordSets", + "propertyPath": "Properties.StorageEncrypted", + "suggestedFix": "Set StorageEncrypted to true", + "category": "Security", + "startLine": 12, + "startColumn": 5, + "endLine": 12, + "endColumn": 15, + "ruleDescription": "RDS instance should have StorageEncrypted", "phase": "LINT" }, { - "ruleId": "E3029", - "severity": "ERROR", - "message": "TTL must not be set when AliasTarget is specified", - "source": "CFN_LINT", + "ruleId": "W9008", + "severity": "WARN", + "message": "RDS instance should have StorageEncrypted set to true", + "source": "ENGINE", "entity": { - "logicalId": "AliasConflictFirst", + "logicalId": "MadeUpPolicy", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSet" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.TTL", - "category": "Resource", - "startLine": 12, + "propertyPath": "Properties.StorageEncrypted", + "suggestedFix": "Set StorageEncrypted to true", + "category": "Security", + "startLine": 19, "startColumn": 5, - "endLine": 12, + "endLine": 19, "endColumn": 15, - "ruleDescription": "Validate Route53 record set aliases", + "ruleDescription": "RDS instance should have StorageEncrypted", "phase": "LINT" }, { - "ruleId": "E3029", - "severity": "ERROR", - "message": "TTL must not be set when AliasTarget is specified", - "source": "CFN_LINT", + "ruleId": "W9008", + "severity": "WARN", + "message": "RDS instance should have StorageEncrypted set to true", + "source": "ENGINE", "entity": { - "logicalId": "AliasConflictSecond", + "logicalId": "InvalidMapping", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSet" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.TTL", - "category": "Resource", - "startLine": 28, + "propertyPath": "Properties.StorageEncrypted", + "suggestedFix": "Set StorageEncrypted to true", + "category": "Security", + "startLine": 39, "startColumn": 5, - "endLine": 28, + "endLine": 39, "endColumn": 15, - "ruleDescription": "Validate Route53 record set aliases", + "ruleDescription": "RDS instance should have StorageEncrypted", "phase": "LINT" }, { - "ruleId": "E3029", - "severity": "ERROR", - "message": "AliasTarget cannot be used with record type 'NS'", + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "ConditionalInvalidAliasTypes", + "logicalId": "PolicyList", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSet" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.AliasTarget", - "category": "Resource", - "startLine": 48, - "startColumn": 7, - "endLine": 48, - "endColumn": 18, - "ruleDescription": "Validate Route53 record set aliases", + "category": "Best Practice", + "startLine": 10, + "startColumn": 3, + "endLine": 10, + "endColumn": 13, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "E3029", - "severity": "ERROR", - "message": "AliasTarget cannot be used with record type 'SOA'", + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "ConditionalInvalidAliasTypes", + "logicalId": "MadeUpPolicy", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSet" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.AliasTarget", - "category": "Resource", - "startLine": 48, - "startColumn": 7, - "endLine": 48, - "endColumn": 18, - "ruleDescription": "Validate Route53 record set aliases", + "category": "Best Practice", + "startLine": 17, + "startColumn": 3, + "endLine": 17, + "endColumn": 15, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3013", "severity": "INFO", - "message": "Property 'HostedZoneName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "ConditionalInvalidAliasTypes", + "logicalId": "PolicyList", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSet" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.HostedZoneName", + "propertyPath": "Properties", "category": "Best Practice", - "startLine": 45, - "startColumn": 7, - "endLine": 45, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53-recordset", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 12, + "startColumn": 5, + "endLine": 12, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3013", "severity": "INFO", - "message": "Property 'HostedZoneName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "ConditionalRecordSetsInvalidFirst", + "logicalId": "MadeUpPolicy", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSetGroup" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.HostedZoneName", + "propertyPath": "Properties", "category": "Best Practice", - "startLine": 54, - "startColumn": 7, - "endLine": 54, - "endColumn": 21, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 19, + "startColumn": 5, + "endLine": 19, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3013", "severity": "INFO", - "message": "Property 'HostedZoneName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "ConditionalRecordSetsInvalidSecond", + "logicalId": "InvalidMapping", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSetGroup" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.HostedZoneName", + "propertyPath": "Properties", "category": "Best Practice", - "startLine": 68, - "startColumn": 7, - "endLine": 68, - "endColumn": 21, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - } - ] - }, - "bad/s3_tiering_bad_days.yaml": { - "filePath": "bad/s3_tiering_bad_days.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 4, - "warnings": 0, - "informational": 1, - "debug": 0 + "startLine": 39, + "startColumn": 5, + "endLine": 39, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "phase": "LINT" }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "E3061", - "severity": "ERROR", - "message": "Days 30 for ARCHIVE_ACCESS must be between 90 and 730", + "ruleId": "I3100", + "severity": "INFO", + "message": "Previous generation instance type 'db.m1.small' - consider upgrading", "source": "CFN_LINT", "entity": { - "logicalId": "Bucket", + "logicalId": "PolicyList", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.IntelligentTieringConfigurations[0].Tierings[0].Days", - "suggestedFix": "Set Days between 90 and 730", - "category": "Resource", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "Validate the days for tierings in IntelligentTieringConfigurations", + "propertyPath": "Properties.DBInstanceClass", + "suggestedFix": "Upgrade to a current generation instance type", + "category": "Best Practice", + "startLine": 14, + "startColumn": 7, + "endLine": 14, + "endColumn": 22, + "ruleDescription": "Checks for legacy instance type generations", "phase": "LINT" }, { - "ruleId": "E3061", - "severity": "ERROR", - "message": "Days 800 for ARCHIVE_ACCESS must be between 90 and 730", + "ruleId": "I3100", + "severity": "INFO", + "message": "Previous generation instance type 'db.m1.small' - consider upgrading", "source": "CFN_LINT", "entity": { - "logicalId": "Bucket", + "logicalId": "MadeUpPolicy", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.IntelligentTieringConfigurations[1].Tierings[0].Days", - "suggestedFix": "Set Days between 90 and 730", - "category": "Resource", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "Validate the days for tierings in IntelligentTieringConfigurations", + "propertyPath": "Properties.DBInstanceClass", + "suggestedFix": "Upgrade to a current generation instance type", + "category": "Best Practice", + "startLine": 21, + "startColumn": 7, + "endLine": 21, + "endColumn": 22, + "ruleDescription": "Checks for legacy instance type generations", "phase": "LINT" }, { - "ruleId": "E3061", - "severity": "ERROR", - "message": "Days 100 for DEEP_ARCHIVE_ACCESS must be between 180 and 730", + "ruleId": "I3100", + "severity": "INFO", + "message": "Previous generation instance type 'db.m1.small' - consider upgrading", "source": "CFN_LINT", "entity": { - "logicalId": "Bucket", + "logicalId": "InvalidMapping", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.IntelligentTieringConfigurations[1].Tierings[1].Days", - "suggestedFix": "Set Days between 180 and 730", - "category": "Resource", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "Validate the days for tierings in IntelligentTieringConfigurations", + "propertyPath": "Properties.DBInstanceClass", + "suggestedFix": "Upgrade to a current generation instance type", + "category": "Best Practice", + "startLine": 41, + "startColumn": 7, + "endLine": 41, + "endColumn": 22, + "ruleDescription": "Checks for legacy instance type generations", "phase": "LINT" }, { - "ruleId": "E3061", - "severity": "ERROR", - "message": "Days 900 for DEEP_ARCHIVE_ACCESS must be between 180 and 730", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Bucket", + "logicalId": "PolicyList", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.IntelligentTieringConfigurations[1].Tierings[2].Days", - "suggestedFix": "Set Days between 180 and 730", - "category": "Resource", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "Validate the days for tierings in IntelligentTieringConfigurations", - "phase": "LINT" + "propertyPath": "Properties.Engine", + "category": "Best Practice", + "startLine": 15, + "startColumn": 7, + "endLine": 15, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Bucket", + "logicalId": "MadeUpPolicy", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.Engine", "category": "Best Practice", - "startLine": 5, + "startLine": 22, + "startColumn": 7, + "endLine": 22, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'UserName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "MyIAMUser", + "entityType": "Resource", + "resourceType": "AWS::IAM::User" + }, + "propertyPath": "Properties.UserName", + "category": "Best Practice", + "startLine": 28, + "startColumn": 7, + "endLine": 28, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "InvalidMapping", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.Engine", + "category": "Best Practice", + "startLine": 42, + "startColumn": 7, + "endLine": 42, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } + }, + { + "ruleId": "I9003", + "severity": "INFO", + "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", + "source": "ENGINE", + "category": "Best Practice", + "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'PolicyList' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "PolicyList", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 12, "startColumn": 5, - "endLine": 5, + "endLine": 12, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'MadeUpPolicy' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "MadeUpPolicy", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 19, + "startColumn": 5, + "endLine": 19, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'MyIAMUser' of type 'AWS::IAM::User' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "MyIAMUser", + "entityType": "Resource", + "resourceType": "AWS::IAM::User" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 26, + "startColumn": 5, + "endLine": 26, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'InvalidMapping' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "InvalidMapping", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 39, + "startColumn": 5, + "endLine": 39, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "bad/sagemaker_instance_types.yaml": { - "filePath": "bad/sagemaker_instance_types.yaml", + "bad/resources_iam_instanceprofile_roles.yaml": { + "filePath": "bad/resources_iam_instanceprofile_roles.yaml", "status": "OK", "metadata": { - "resourcesScanned": 5, + "resourcesScanned": 1, "counts": { - "fatal": 36, - "errors": 5, + "fatal": 1, + "errors": 0, "warnings": 0, - "informational": 8, + "informational": 0, "debug": 0 }, "suppressed": 0, @@ -8848,1665 +8890,1571 @@ }, "diagnostics": [ { - "ruleId": "F3003", + "ruleId": "F3032", "severity": "FATAL", - "message": "'MonitoringScheduleName' is a required property", + "message": "expected maximum item count: 1, found: 2", "source": "SCHEMA", "entity": { - "logicalId": "MonitoringSchedule", + "logicalId": "IamUser", "entityType": "Resource", - "resourceType": "AWS::SageMaker::MonitoringSchedule" + "resourceType": "AWS::IAM::InstanceProfile" }, - "propertyPath": "Properties", - "suggestedFix": "Add the required property 'MonitoringScheduleName'", + "propertyPath": "Properties.Roles", "category": "Schema", - "startLine": 6, - "startColumn": 5, - "endLine": 6, - "endColumn": 15, - "ruleDescription": "Required property missing", - "phase": "SCHEMA" + "startLine": 7, + "startColumn": 7, + "endLine": 7, + "endColumn": 12, + "ruleDescription": "Array item count out of bounds", + "phase": "SCHEMA", + "context": { + "extra": { + "actual_count": 2, + "max_items": 1, + "min_items": 0 + } + } + } + ] + }, + "bad/resources_updatereplacepolicy.yaml": { + "filePath": "bad/resources_updatereplacepolicy.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 5, + "counts": { + "fatal": 5, + "errors": 0, + "warnings": 9, + "informational": 18, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "F3003", + "ruleId": "F0018", "severity": "FATAL", - "message": "'MonitoringAppSpecification' is a required property", + "message": "UpdateReplacePolicy must be one of Delete, Retain, Snapshot, got a list", "source": "SCHEMA", "entity": { - "logicalId": "MonitoringSchedule", + "logicalId": "PolicyList", "entityType": "Resource", - "resourceType": "AWS::SageMaker::MonitoringSchedule" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.MonitoringScheduleConfig.MonitoringJobDefinition", - "suggestedFix": "Add the required property 'MonitoringAppSpecification'", - "category": "Schema", - "startLine": 8, - "startColumn": 9, - "endLine": 8, - "endColumn": 32, - "ruleDescription": "Required property missing", + "propertyPath": "UpdateReplacePolicy", + "category": "Structure", + "startLine": 16, + "startColumn": 5, + "endLine": 16, + "endColumn": 24, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "UpdateReplacePolicy must be valid", "phase": "SCHEMA" }, { - "ruleId": "F3003", + "ruleId": "F0018", "severity": "FATAL", - "message": "'MonitoringInputs' is a required property", + "message": "UpdateReplacePolicy must be one of Delete, Retain, Snapshot, got 'CopyRegion'", "source": "SCHEMA", "entity": { - "logicalId": "MonitoringSchedule", + "logicalId": "MadeUpPolicy", "entityType": "Resource", - "resourceType": "AWS::SageMaker::MonitoringSchedule" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.MonitoringScheduleConfig.MonitoringJobDefinition", - "suggestedFix": "Add the required property 'MonitoringInputs'", - "category": "Schema", - "startLine": 8, - "startColumn": 9, - "endLine": 8, - "endColumn": 32, - "ruleDescription": "Required property missing", + "propertyPath": "UpdateReplacePolicy", + "category": "Structure", + "startLine": 23, + "startColumn": 5, + "endLine": 23, + "endColumn": 24, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "UpdateReplacePolicy must be valid", "phase": "SCHEMA" }, { - "ruleId": "F3003", + "ruleId": "F0018", "severity": "FATAL", - "message": "'MonitoringOutputConfig' is a required property", + "message": "UpdateReplacePolicy must be one of Delete, Retain, got 'Snapshot'", "source": "SCHEMA", "entity": { - "logicalId": "MonitoringSchedule", + "logicalId": "MyIAMUser", "entityType": "Resource", - "resourceType": "AWS::SageMaker::MonitoringSchedule" + "resourceType": "AWS::IAM::User" }, - "propertyPath": "Properties.MonitoringScheduleConfig.MonitoringJobDefinition", - "suggestedFix": "Add the required property 'MonitoringOutputConfig'", - "category": "Schema", - "startLine": 8, - "startColumn": 9, - "endLine": 8, - "endColumn": 32, - "ruleDescription": "Required property missing", + "propertyPath": "UpdateReplacePolicy", + "category": "Structure", + "startLine": 29, + "startColumn": 5, + "endLine": 29, + "endColumn": 24, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "ruleDescription": "UpdateReplacePolicy must be valid", "phase": "SCHEMA" }, { - "ruleId": "F3003", + "ruleId": "F0018", "severity": "FATAL", - "message": "'RoleArn' is a required property", + "message": "UpdateReplacePolicy must be one of Delete, Retain, got a list", "source": "SCHEMA", "entity": { - "logicalId": "MonitoringSchedule", + "logicalId": "UnsupportedIntrinsic", "entityType": "Resource", - "resourceType": "AWS::SageMaker::MonitoringSchedule" + "resourceType": "AWS::CloudFormation::WaitConditionHandle" }, - "propertyPath": "Properties.MonitoringScheduleConfig.MonitoringJobDefinition", - "suggestedFix": "Add the required property 'RoleArn'", - "category": "Schema", - "startLine": 8, - "startColumn": 9, - "endLine": 8, - "endColumn": 32, - "ruleDescription": "Required property missing", + "propertyPath": "UpdateReplacePolicy", + "category": "Structure", + "startLine": 32, + "startColumn": 5, + "endLine": 32, + "endColumn": 24, + "ruleDescription": "UpdateReplacePolicy must be valid", "phase": "SCHEMA" }, { - "ruleId": "F3003", + "ruleId": "F0018", "severity": "FATAL", - "message": "'InstanceCount' is a required property", + "message": "UpdateReplacePolicy must be one of Delete, Retain, Snapshot, got an object", "source": "SCHEMA", "entity": { - "logicalId": "MonitoringSchedule", + "logicalId": "InvalidMapping", "entityType": "Resource", - "resourceType": "AWS::SageMaker::MonitoringSchedule" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.MonitoringScheduleConfig.MonitoringJobDefinition.MonitoringResources.ClusterConfig", - "suggestedFix": "Add the required property 'InstanceCount'", - "category": "Schema", - "startLine": 10, - "startColumn": 13, - "endLine": 10, - "endColumn": 26, - "ruleDescription": "Required property missing", + "propertyPath": "UpdateReplacePolicy", + "category": "Structure", + "startLine": 43, + "startColumn": 5, + "endLine": 43, + "endColumn": 24, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "UpdateReplacePolicy must be valid", "phase": "SCHEMA" }, { - "ruleId": "F3003", - "severity": "FATAL", - "message": "'VolumeSizeInGB' is a required property", - "source": "SCHEMA", + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'DBPolicy' is not referenced anywhere in the template", + "source": "CFN_LINT", "entity": { - "logicalId": "MonitoringSchedule", + "logicalId": "DBPolicy", + "entityType": "Parameter" + }, + "propertyPath": "Parameters/DBPolicy", + "category": "Best Practice", + "startLine": 6, + "startColumn": 3, + "endLine": 6, + "endColumn": 11, + "ruleDescription": "Check if Parameters are Used", + "phase": "LINT" + }, + { + "ruleId": "W3011", + "severity": "WARN", + "message": "Both 'UpdateReplacePolicy' and 'DeletionPolicy' are needed to protect resource from deletion", + "source": "CFN_LINT", + "entity": { + "logicalId": "PolicyList", "entityType": "Resource", - "resourceType": "AWS::SageMaker::MonitoringSchedule" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.MonitoringScheduleConfig.MonitoringJobDefinition.MonitoringResources.ClusterConfig", - "suggestedFix": "Add the required property 'VolumeSizeInGB'", - "category": "Schema", + "category": "Best Practice", "startLine": 10, - "startColumn": 13, + "startColumn": 3, "endLine": 10, - "endColumn": 26, - "ruleDescription": "Required property missing", - "phase": "SCHEMA" + "endColumn": 13, + "ruleDescription": "Check resources with UpdateReplacePolicy/DeletionPolicy have both", + "phase": "LINT" }, { - "ruleId": "F3003", - "severity": "FATAL", - "message": "'ModelQualityAppSpecification' is a required property", - "source": "SCHEMA", + "ruleId": "W3011", + "severity": "WARN", + "message": "Both 'UpdateReplacePolicy' and 'DeletionPolicy' are needed to protect resource from deletion", + "source": "CFN_LINT", "entity": { - "logicalId": "ModelQualityJobDefinition", + "logicalId": "MadeUpPolicy", "entityType": "Resource", - "resourceType": "AWS::SageMaker::ModelQualityJobDefinition" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties", - "suggestedFix": "Add the required property 'ModelQualityAppSpecification'", - "category": "Schema", - "startLine": 14, - "startColumn": 5, - "endLine": 14, + "category": "Best Practice", + "startLine": 17, + "startColumn": 3, + "endLine": 17, "endColumn": 15, - "ruleDescription": "Required property missing", - "phase": "SCHEMA" + "ruleDescription": "Check resources with UpdateReplacePolicy/DeletionPolicy have both", + "phase": "LINT" }, { - "ruleId": "F3003", - "severity": "FATAL", - "message": "'ModelQualityJobInput' is a required property", - "source": "SCHEMA", + "ruleId": "W3011", + "severity": "WARN", + "message": "Both 'UpdateReplacePolicy' and 'DeletionPolicy' are needed to protect resource from deletion", + "source": "CFN_LINT", "entity": { - "logicalId": "ModelQualityJobDefinition", + "logicalId": "MyIAMUser", "entityType": "Resource", - "resourceType": "AWS::SageMaker::ModelQualityJobDefinition" + "resourceType": "AWS::IAM::User" }, - "propertyPath": "Properties", - "suggestedFix": "Add the required property 'ModelQualityJobInput'", - "category": "Schema", - "startLine": 14, - "startColumn": 5, - "endLine": 14, - "endColumn": 15, - "ruleDescription": "Required property missing", - "phase": "SCHEMA" + "category": "Best Practice", + "startLine": 24, + "startColumn": 3, + "endLine": 24, + "endColumn": 12, + "ruleDescription": "Check resources with UpdateReplacePolicy/DeletionPolicy have both", + "phase": "LINT" }, { - "ruleId": "F3003", - "severity": "FATAL", - "message": "'ModelQualityJobOutputConfig' is a required property", - "source": "SCHEMA", + "ruleId": "W3011", + "severity": "WARN", + "message": "Both 'UpdateReplacePolicy' and 'DeletionPolicy' are needed to protect resource from deletion", + "source": "CFN_LINT", "entity": { - "logicalId": "ModelQualityJobDefinition", + "logicalId": "UnsupportedIntrinsic", "entityType": "Resource", - "resourceType": "AWS::SageMaker::ModelQualityJobDefinition" + "resourceType": "AWS::CloudFormation::WaitConditionHandle" }, - "propertyPath": "Properties", - "suggestedFix": "Add the required property 'ModelQualityJobOutputConfig'", - "category": "Schema", - "startLine": 14, - "startColumn": 5, - "endLine": 14, - "endColumn": 15, - "ruleDescription": "Required property missing", - "phase": "SCHEMA" + "category": "Best Practice", + "startLine": 30, + "startColumn": 3, + "endLine": 30, + "endColumn": 23, + "ruleDescription": "Check resources with UpdateReplacePolicy/DeletionPolicy have both", + "phase": "LINT" }, { - "ruleId": "F3003", - "severity": "FATAL", - "message": "'RoleArn' is a required property", - "source": "SCHEMA", + "ruleId": "W3011", + "severity": "WARN", + "message": "Both 'UpdateReplacePolicy' and 'DeletionPolicy' are needed to protect resource from deletion", + "source": "CFN_LINT", "entity": { - "logicalId": "ModelQualityJobDefinition", + "logicalId": "InvalidMapping", "entityType": "Resource", - "resourceType": "AWS::SageMaker::ModelQualityJobDefinition" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties", - "suggestedFix": "Add the required property 'RoleArn'", - "category": "Schema", - "startLine": 14, - "startColumn": 5, - "endLine": 14, - "endColumn": 15, - "ruleDescription": "Required property missing", - "phase": "SCHEMA" + "category": "Best Practice", + "startLine": 37, + "startColumn": 3, + "endLine": 37, + "endColumn": 17, + "ruleDescription": "Check resources with UpdateReplacePolicy/DeletionPolicy have both", + "phase": "LINT" }, { - "ruleId": "F3003", - "severity": "FATAL", - "message": "'InstanceCount' is a required property", - "source": "SCHEMA", + "ruleId": "W9008", + "severity": "WARN", + "message": "RDS instance should have StorageEncrypted set to true", + "source": "ENGINE", "entity": { - "logicalId": "ModelQualityJobDefinition", + "logicalId": "PolicyList", "entityType": "Resource", - "resourceType": "AWS::SageMaker::ModelQualityJobDefinition" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.JobResources.ClusterConfig", - "suggestedFix": "Add the required property 'InstanceCount'", - "category": "Schema", - "startLine": 16, - "startColumn": 9, - "endLine": 16, - "endColumn": 22, - "ruleDescription": "Required property missing", - "phase": "SCHEMA" + "propertyPath": "Properties.StorageEncrypted", + "suggestedFix": "Set StorageEncrypted to true", + "category": "Security", + "startLine": 12, + "startColumn": 5, + "endLine": 12, + "endColumn": 15, + "ruleDescription": "RDS instance should have StorageEncrypted", + "phase": "LINT" }, { - "ruleId": "F3003", - "severity": "FATAL", - "message": "'VolumeSizeInGB' is a required property", - "source": "SCHEMA", + "ruleId": "W9008", + "severity": "WARN", + "message": "RDS instance should have StorageEncrypted set to true", + "source": "ENGINE", "entity": { - "logicalId": "ModelQualityJobDefinition", + "logicalId": "MadeUpPolicy", "entityType": "Resource", - "resourceType": "AWS::SageMaker::ModelQualityJobDefinition" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.JobResources.ClusterConfig", - "suggestedFix": "Add the required property 'VolumeSizeInGB'", - "category": "Schema", - "startLine": 16, - "startColumn": 9, - "endLine": 16, - "endColumn": 22, - "ruleDescription": "Required property missing", - "phase": "SCHEMA" + "propertyPath": "Properties.StorageEncrypted", + "suggestedFix": "Set StorageEncrypted to true", + "category": "Security", + "startLine": 19, + "startColumn": 5, + "endLine": 19, + "endColumn": 15, + "ruleDescription": "RDS instance should have StorageEncrypted", + "phase": "LINT" }, { - "ruleId": "F3003", - "severity": "FATAL", - "message": "'EndpointName' is a required property", - "source": "SCHEMA", + "ruleId": "W9008", + "severity": "WARN", + "message": "RDS instance should have StorageEncrypted set to true", + "source": "ENGINE", "entity": { - "logicalId": "InferenceExperiment", + "logicalId": "InvalidMapping", "entityType": "Resource", - "resourceType": "AWS::SageMaker::InferenceExperiment" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties", - "suggestedFix": "Add the required property 'EndpointName'", - "category": "Schema", - "startLine": 22, + "propertyPath": "Properties.StorageEncrypted", + "suggestedFix": "Set StorageEncrypted to true", + "category": "Security", + "startLine": 39, "startColumn": 5, - "endLine": 22, + "endLine": 39, "endColumn": 15, - "ruleDescription": "Required property missing", - "phase": "SCHEMA" + "ruleDescription": "RDS instance should have StorageEncrypted", + "phase": "LINT" }, { - "ruleId": "F3003", - "severity": "FATAL", - "message": "'Name' is a required property", - "source": "SCHEMA", + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "InferenceExperiment", + "logicalId": "PolicyList", "entityType": "Resource", - "resourceType": "AWS::SageMaker::InferenceExperiment" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties", - "suggestedFix": "Add the required property 'Name'", - "category": "Schema", - "startLine": 22, - "startColumn": 5, - "endLine": 22, + "category": "Best Practice", + "startLine": 10, + "startColumn": 3, + "endLine": 10, + "endColumn": 13, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "MadeUpPolicy", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 17, + "startColumn": 3, + "endLine": 17, "endColumn": 15, - "ruleDescription": "Required property missing", - "phase": "SCHEMA" + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "F3003", - "severity": "FATAL", - "message": "'RoleArn' is a required property", - "source": "SCHEMA", + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "InferenceExperiment", + "logicalId": "InvalidMapping", "entityType": "Resource", - "resourceType": "AWS::SageMaker::InferenceExperiment" + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 37, + "startColumn": 3, + "endLine": 37, + "endColumn": 17, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3013", + "severity": "INFO", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "PolicyList", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" }, "propertyPath": "Properties", - "suggestedFix": "Add the required property 'RoleArn'", - "category": "Schema", - "startLine": 22, + "category": "Best Practice", + "startLine": 12, "startColumn": 5, - "endLine": 22, + "endLine": 12, "endColumn": 15, - "ruleDescription": "Required property missing", - "phase": "SCHEMA" + "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "phase": "LINT" }, { - "ruleId": "F3003", - "severity": "FATAL", - "message": "'Type' is a required property", - "source": "SCHEMA", + "ruleId": "I3013", + "severity": "INFO", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "InferenceExperiment", + "logicalId": "MadeUpPolicy", "entityType": "Resource", - "resourceType": "AWS::SageMaker::InferenceExperiment" + "resourceType": "AWS::RDS::DBInstance" }, "propertyPath": "Properties", - "suggestedFix": "Add the required property 'Type'", - "category": "Schema", - "startLine": 22, + "category": "Best Practice", + "startLine": 19, "startColumn": 5, - "endLine": 22, + "endLine": 19, "endColumn": 15, - "ruleDescription": "Required property missing", - "phase": "SCHEMA" + "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "phase": "LINT" }, { - "ruleId": "F3003", - "severity": "FATAL", - "message": "'InfrastructureType' is a required property", - "source": "SCHEMA", + "ruleId": "I3013", + "severity": "INFO", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "InferenceExperiment", + "logicalId": "InvalidMapping", "entityType": "Resource", - "resourceType": "AWS::SageMaker::InferenceExperiment" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.ModelVariants.0.InfrastructureConfig", - "suggestedFix": "Add the required property 'InfrastructureType'", - "category": "Schema", - "startLine": 24, - "startColumn": 11, - "endLine": 24, - "endColumn": 31, - "ruleDescription": "Required property missing", - "phase": "SCHEMA" + "propertyPath": "Properties", + "category": "Best Practice", + "startLine": 39, + "startColumn": 5, + "endLine": 39, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "phase": "LINT" }, { - "ruleId": "F3003", - "severity": "FATAL", - "message": "'ModelName' is a required property", - "source": "SCHEMA", + "ruleId": "I3100", + "severity": "INFO", + "message": "Previous generation instance type 'db.m1.small' - consider upgrading", + "source": "CFN_LINT", "entity": { - "logicalId": "InferenceExperiment", + "logicalId": "PolicyList", "entityType": "Resource", - "resourceType": "AWS::SageMaker::InferenceExperiment" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.ModelVariants.0", - "suggestedFix": "Add the required property 'ModelName'", - "category": "Schema", - "startLine": 24, - "startColumn": 31, - "endLine": 24, - "endColumn": 32, - "ruleDescription": "Required property missing", - "phase": "SCHEMA" + "propertyPath": "Properties.DBInstanceClass", + "suggestedFix": "Upgrade to a current generation instance type", + "category": "Best Practice", + "startLine": 14, + "startColumn": 7, + "endLine": 14, + "endColumn": 22, + "ruleDescription": "Checks for legacy instance type generations", + "phase": "LINT" }, { - "ruleId": "F3003", - "severity": "FATAL", - "message": "'VariantName' is a required property", - "source": "SCHEMA", + "ruleId": "I3100", + "severity": "INFO", + "message": "Previous generation instance type 'db.m1.small' - consider upgrading", + "source": "CFN_LINT", "entity": { - "logicalId": "InferenceExperiment", + "logicalId": "MadeUpPolicy", "entityType": "Resource", - "resourceType": "AWS::SageMaker::InferenceExperiment" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.ModelVariants.0", - "suggestedFix": "Add the required property 'VariantName'", - "category": "Schema", - "startLine": 24, - "startColumn": 31, - "endLine": 24, - "endColumn": 32, - "ruleDescription": "Required property missing", - "phase": "SCHEMA" + "propertyPath": "Properties.DBInstanceClass", + "suggestedFix": "Upgrade to a current generation instance type", + "category": "Best Practice", + "startLine": 21, + "startColumn": 7, + "endLine": 21, + "endColumn": 22, + "ruleDescription": "Checks for legacy instance type generations", + "phase": "LINT" }, { - "ruleId": "F3003", - "severity": "FATAL", - "message": "'InstanceCount' is a required property", - "source": "SCHEMA", + "ruleId": "I3100", + "severity": "INFO", + "message": "Previous generation instance type 'db.m1.small' - consider upgrading", + "source": "CFN_LINT", "entity": { - "logicalId": "InferenceExperiment", + "logicalId": "InvalidMapping", "entityType": "Resource", - "resourceType": "AWS::SageMaker::InferenceExperiment" - }, - "propertyPath": "Properties.ModelVariants.0.InfrastructureConfig.RealTimeInferenceConfig", - "suggestedFix": "Add the required property 'InstanceCount'", - "category": "Schema", - "startLine": 25, - "startColumn": 13, - "endLine": 25, - "endColumn": 36, - "ruleDescription": "Required property missing", - "phase": "SCHEMA" - }, - { - "ruleId": "F3003", - "severity": "FATAL", - "message": "'InfrastructureType' is a required property", - "source": "SCHEMA", - "entity": { - "logicalId": "InferenceExperiment", - "entityType": "Resource", - "resourceType": "AWS::SageMaker::InferenceExperiment" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.ModelVariants.1.InfrastructureConfig", - "suggestedFix": "Add the required property 'InfrastructureType'", - "category": "Schema", - "startLine": 27, - "startColumn": 11, - "endLine": 27, - "endColumn": 31, - "ruleDescription": "Required property missing", - "phase": "SCHEMA" + "propertyPath": "Properties.DBInstanceClass", + "suggestedFix": "Upgrade to a current generation instance type", + "category": "Best Practice", + "startLine": 41, + "startColumn": 7, + "endLine": 41, + "endColumn": 22, + "ruleDescription": "Checks for legacy instance type generations", + "phase": "LINT" }, { - "ruleId": "F3003", - "severity": "FATAL", - "message": "'ModelName' is a required property", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "InferenceExperiment", + "logicalId": "PolicyList", "entityType": "Resource", - "resourceType": "AWS::SageMaker::InferenceExperiment" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.ModelVariants.1", - "suggestedFix": "Add the required property 'ModelName'", - "category": "Schema", - "startLine": 27, - "startColumn": 31, - "endLine": 27, - "endColumn": 32, - "ruleDescription": "Required property missing", - "phase": "SCHEMA" + "propertyPath": "Properties.Engine", + "category": "Best Practice", + "startLine": 15, + "startColumn": 7, + "endLine": 15, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "F3003", - "severity": "FATAL", - "message": "'VariantName' is a required property", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "InferenceExperiment", + "logicalId": "MadeUpPolicy", "entityType": "Resource", - "resourceType": "AWS::SageMaker::InferenceExperiment" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.ModelVariants.1", - "suggestedFix": "Add the required property 'VariantName'", - "category": "Schema", - "startLine": 27, - "startColumn": 31, - "endLine": 27, - "endColumn": 32, - "ruleDescription": "Required property missing", - "phase": "SCHEMA" + "propertyPath": "Properties.Engine", + "category": "Best Practice", + "startLine": 22, + "startColumn": 7, + "endLine": 22, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "F3003", - "severity": "FATAL", - "message": "'InstanceCount' is a required property", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'UserName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "InferenceExperiment", + "logicalId": "MyIAMUser", "entityType": "Resource", - "resourceType": "AWS::SageMaker::InferenceExperiment" + "resourceType": "AWS::IAM::User" }, - "propertyPath": "Properties.ModelVariants.1.InfrastructureConfig.RealTimeInferenceConfig", - "suggestedFix": "Add the required property 'InstanceCount'", - "category": "Schema", + "propertyPath": "Properties.UserName", + "category": "Best Practice", "startLine": 28, - "startColumn": 13, + "startColumn": 7, "endLine": 28, - "endColumn": 36, - "ruleDescription": "Required property missing", - "phase": "SCHEMA" + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "F3003", - "severity": "FATAL", - "message": "'ValidationRole' is a required property", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ModelPackage", + "logicalId": "InvalidMapping", "entityType": "Resource", - "resourceType": "AWS::SageMaker::ModelPackage" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.ValidationSpecification", - "suggestedFix": "Add the required property 'ValidationRole'", - "category": "Schema", - "startLine": 35, + "propertyPath": "Properties.Engine", + "category": "Best Practice", + "startLine": 42, "startColumn": 7, - "endLine": 35, - "endColumn": 30, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sagemaker", - "ruleDescription": "Required property missing", - "phase": "SCHEMA" + "endLine": 42, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "F3003", - "severity": "FATAL", - "message": "'TransformInput' is a required property", - "source": "SCHEMA", + "ruleId": "I9003", + "severity": "INFO", + "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", + "source": "ENGINE", + "category": "Best Practice", + "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'PolicyList' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "ModelPackage", + "logicalId": "PolicyList", "entityType": "Resource", - "resourceType": "AWS::SageMaker::ModelPackage" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.ValidationSpecification.ValidationProfiles.0.TransformJobDefinition", - "suggestedFix": "Add the required property 'TransformInput'", - "category": "Schema", - "startLine": 37, - "startColumn": 13, - "endLine": 37, - "endColumn": 35, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sagemaker", - "ruleDescription": "Required property missing", - "phase": "SCHEMA" + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 12, + "startColumn": 5, + "endLine": 12, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "F3003", - "severity": "FATAL", - "message": "'TransformOutput' is a required property", - "source": "SCHEMA", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'MadeUpPolicy' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "ModelPackage", + "logicalId": "MadeUpPolicy", "entityType": "Resource", - "resourceType": "AWS::SageMaker::ModelPackage" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.ValidationSpecification.ValidationProfiles.0.TransformJobDefinition", - "suggestedFix": "Add the required property 'TransformOutput'", - "category": "Schema", - "startLine": 37, - "startColumn": 13, - "endLine": 37, - "endColumn": 35, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sagemaker", - "ruleDescription": "Required property missing", - "phase": "SCHEMA" + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 19, + "startColumn": 5, + "endLine": 19, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "F3003", - "severity": "FATAL", - "message": "'ProfileName' is a required property", - "source": "SCHEMA", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'MyIAMUser' of type 'AWS::IAM::User' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "ModelPackage", + "logicalId": "MyIAMUser", "entityType": "Resource", - "resourceType": "AWS::SageMaker::ModelPackage" + "resourceType": "AWS::IAM::User" }, - "propertyPath": "Properties.ValidationSpecification.ValidationProfiles.0", - "suggestedFix": "Add the required property 'ProfileName'", - "category": "Schema", - "startLine": 37, - "startColumn": 35, - "endLine": 37, - "endColumn": 36, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sagemaker", - "ruleDescription": "Required property missing", - "phase": "SCHEMA" - }, - { - "ruleId": "F3003", - "severity": "FATAL", - "message": "'InstanceCount' is a required property", - "source": "SCHEMA", - "entity": { - "logicalId": "ModelPackage", - "entityType": "Resource", - "resourceType": "AWS::SageMaker::ModelPackage" - }, - "propertyPath": "Properties.ValidationSpecification.ValidationProfiles.0.TransformJobDefinition.TransformResources", - "suggestedFix": "Add the required property 'InstanceCount'", - "category": "Schema", - "startLine": 38, - "startColumn": 15, - "endLine": 38, - "endColumn": 33, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sagemaker", - "ruleDescription": "Required property missing", - "phase": "SCHEMA" + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 26, + "startColumn": 5, + "endLine": 26, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "F3003", - "severity": "FATAL", - "message": "'ExecutionRole' is a required property", - "source": "SCHEMA", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'InvalidMapping' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Cluster", + "logicalId": "InvalidMapping", "entityType": "Resource", - "resourceType": "AWS::SageMaker::Cluster" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.InstanceGroups.0", - "suggestedFix": "Add the required property 'ExecutionRole'", - "category": "Schema", - "startLine": 46, - "startColumn": 23, - "endLine": 46, - "endColumn": 24, - "ruleDescription": "Required property missing", - "phase": "SCHEMA" + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 39, + "startColumn": 5, + "endLine": 39, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "bad/route53.yaml": { + "filePath": "bad/route53.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 11, + "counts": { + "fatal": 0, + "errors": 30, + "warnings": 1, + "informational": 12, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "F3003", - "severity": "FATAL", - "message": "'InstanceCount' is a required property", - "source": "SCHEMA", + "ruleId": "E3023", + "severity": "ERROR", + "message": "TXT record value '\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"' must be enclosed in double quotes", + "source": "CFN_LINT", "entity": { - "logicalId": "Cluster", + "logicalId": "MyTXTRecordSet", "entityType": "Resource", - "resourceType": "AWS::SageMaker::Cluster" + "resourceType": "AWS::Route53::RecordSet" }, - "propertyPath": "Properties.InstanceGroups.0", - "suggestedFix": "Add the required property 'InstanceCount'", - "category": "Schema", - "startLine": 46, - "startColumn": 23, - "endLine": 46, - "endColumn": 24, - "ruleDescription": "Required property missing", - "phase": "SCHEMA" + "propertyPath": "Properties.ResourceRecords.0", + "category": "Resource", + "startLine": 32, + "startColumn": 11, + "endLine": 32, + "endColumn": 12, + "ruleDescription": "Validate Route53 RecordSets", + "phase": "LINT" }, { - "ruleId": "F3003", - "severity": "FATAL", - "message": "'InstanceGroupName' is a required property", - "source": "SCHEMA", + "ruleId": "E3023", + "severity": "ERROR", + "message": "TXT record value '\"a\"\"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"' must be enclosed in double quotes", + "source": "CFN_LINT", "entity": { - "logicalId": "Cluster", + "logicalId": "MyTXTRecordSet", "entityType": "Resource", - "resourceType": "AWS::SageMaker::Cluster" + "resourceType": "AWS::Route53::RecordSet" }, - "propertyPath": "Properties.InstanceGroups.0", - "suggestedFix": "Add the required property 'InstanceGroupName'", - "category": "Schema", - "startLine": 46, - "startColumn": 23, - "endLine": 46, - "endColumn": 24, - "ruleDescription": "Required property missing", - "phase": "SCHEMA" + "propertyPath": "Properties.ResourceRecords.1", + "category": "Resource", + "startLine": 33, + "startColumn": 11, + "endLine": 33, + "endColumn": 12, + "ruleDescription": "Validate Route53 RecordSets", + "phase": "LINT" }, { - "ruleId": "F3003", - "severity": "FATAL", - "message": "'ExecutionRole' is a required property", - "source": "SCHEMA", + "ruleId": "E3023", + "severity": "ERROR", + "message": "TXT record value 'test2' must be enclosed in double quotes", + "source": "CFN_LINT", "entity": { - "logicalId": "Cluster", + "logicalId": "MyTXTRecordSet", "entityType": "Resource", - "resourceType": "AWS::SageMaker::Cluster" + "resourceType": "AWS::Route53::RecordSet" }, - "propertyPath": "Properties.RestrictedInstanceGroups.0", - "suggestedFix": "Add the required property 'ExecutionRole'", - "category": "Schema", - "startLine": 48, - "startColumn": 23, - "endLine": 48, - "endColumn": 24, - "ruleDescription": "Required property missing", - "phase": "SCHEMA" + "propertyPath": "Properties.ResourceRecords.3", + "category": "Resource", + "startLine": 35, + "startColumn": 11, + "endLine": 35, + "endColumn": 12, + "ruleDescription": "Validate Route53 RecordSets", + "phase": "LINT" }, { - "ruleId": "F3003", - "severity": "FATAL", - "message": "'InstanceCount' is a required property", - "source": "SCHEMA", + "ruleId": "E3023", + "severity": "ERROR", + "message": "'127.0.0.1' is not a valid IPv6 address for record type 'AAAA'", + "source": "CFN_LINT", "entity": { - "logicalId": "Cluster", + "logicalId": "MyAAAARecordSet", "entityType": "Resource", - "resourceType": "AWS::SageMaker::Cluster" + "resourceType": "AWS::Route53::RecordSet" }, - "propertyPath": "Properties.RestrictedInstanceGroups.0", - "suggestedFix": "Add the required property 'InstanceCount'", - "category": "Schema", - "startLine": 48, - "startColumn": 23, - "endLine": 48, - "endColumn": 24, - "ruleDescription": "Required property missing", - "phase": "SCHEMA" + "propertyPath": "Properties.ResourceRecords.0", + "category": "Resource", + "startLine": 55, + "startColumn": 11, + "endLine": 55, + "endColumn": 12, + "ruleDescription": "Validate Route53 RecordSets", + "phase": "LINT" }, { - "ruleId": "F3003", - "severity": "FATAL", - "message": "'InstanceGroupName' is a required property", - "source": "SCHEMA", + "ruleId": "E3023", + "severity": "ERROR", + "message": "'XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:1.2.3.4' is not a valid IPv6 address for record type 'AAAA'", + "source": "CFN_LINT", "entity": { - "logicalId": "Cluster", + "logicalId": "MyAAAARecordSet", "entityType": "Resource", - "resourceType": "AWS::SageMaker::Cluster" + "resourceType": "AWS::Route53::RecordSet" }, - "propertyPath": "Properties.RestrictedInstanceGroups.0", - "suggestedFix": "Add the required property 'InstanceGroupName'", - "category": "Schema", - "startLine": 48, - "startColumn": 23, - "endLine": 48, - "endColumn": 24, - "ruleDescription": "Required property missing", - "phase": "SCHEMA" + "propertyPath": "Properties.ResourceRecords.1", + "category": "Resource", + "startLine": 56, + "startColumn": 11, + "endLine": 56, + "endColumn": 12, + "ruleDescription": "Validate Route53 RecordSets", + "phase": "LINT" }, { - "ruleId": "E3640", + "ruleId": "E3023", "severity": "ERROR", - "message": "'ml.fake.xlarge' is not valid in any region", + "message": "'2001:0db8: 85a3:0:0:8a2e:0370:7334' is not a valid IPv6 address for record type 'AAAA'", "source": "CFN_LINT", "entity": { - "logicalId": "MonitoringSchedule", + "logicalId": "MyAAAARecordSet", "entityType": "Resource", - "resourceType": "AWS::SageMaker::MonitoringSchedule" + "resourceType": "AWS::Route53::RecordSet" }, - "propertyPath": "Properties.MonitoringScheduleConfig.MonitoringJobDefinition.MonitoringResources.ClusterConfig.InstanceType", + "propertyPath": "Properties.ResourceRecords.2", "category": "Resource", - "startLine": 11, - "startColumn": 15, - "endLine": 11, - "endColumn": 27, - "ruleDescription": "Validate SageMaker processing instance types based on region", + "startLine": 57, + "startColumn": 11, + "endLine": 57, + "endColumn": 12, + "ruleDescription": "Validate Route53 RecordSets", "phase": "LINT" }, { - "ruleId": "E3642", + "ruleId": "E3023", "severity": "ERROR", - "message": "'ml.fake.xlarge' is not valid in any region", + "message": "'1111:2222:3333:4444:5555:6666:7777' is not a valid IPv6 address for record type 'AAAA'", "source": "CFN_LINT", "entity": { - "logicalId": "InferenceExperiment", + "logicalId": "MyAAAARecordSet", "entityType": "Resource", - "resourceType": "AWS::SageMaker::InferenceExperiment" + "resourceType": "AWS::Route53::RecordSet" }, - "propertyPath": "Properties.ModelVariants.InfrastructureConfig.RealTimeInferenceConfig.InstanceType", + "propertyPath": "Properties.ResourceRecords.3", "category": "Resource", - "startLine": 23, - "startColumn": 7, - "endLine": 23, - "endColumn": 20, - "ruleDescription": "Validate SageMaker hosting instance types based on region", + "startLine": 58, + "startColumn": 11, + "endLine": 58, + "endColumn": 12, + "ruleDescription": "Validate Route53 RecordSets", "phase": "LINT" }, { - "ruleId": "E3643", + "ruleId": "E3023", "severity": "ERROR", - "message": "'ml.bogus.large' is not valid in any region", + "message": "'1111:2222:3333:4444:5555:6666:7777:8888::' is not a valid IPv6 address for record type 'AAAA'", "source": "CFN_LINT", "entity": { - "logicalId": "ModelPackage", + "logicalId": "MyAAAARecordSet", "entityType": "Resource", - "resourceType": "AWS::SageMaker::ModelPackage" + "resourceType": "AWS::Route53::RecordSet" }, - "propertyPath": "Properties.ValidationSpecification.ValidationProfiles.TransformJobDefinition.TransformResources.InstanceType", + "propertyPath": "Properties.ResourceRecords.4", "category": "Resource", - "startLine": 36, - "startColumn": 9, - "endLine": 36, - "endColumn": 27, - "ruleDescription": "Validate SageMaker transform instance types based on region", + "startLine": 59, + "startColumn": 11, + "endLine": 59, + "endColumn": 12, + "ruleDescription": "Validate Route53 RecordSets", "phase": "LINT" }, { - "ruleId": "E3644", + "ruleId": "E3023", "severity": "ERROR", - "message": "'ml.fake.xlarge' is not valid in any region", + "message": "CAA record value '127.0.0.1' must match format: flag tag 'value'", "source": "CFN_LINT", "entity": { - "logicalId": "Cluster", + "logicalId": "MyCAARecordSet", "entityType": "Resource", - "resourceType": "AWS::SageMaker::Cluster" + "resourceType": "AWS::Route53::RecordSet" }, - "propertyPath": "Properties.InstanceGroups.InstanceType", + "propertyPath": "Properties.ResourceRecords.0", "category": "Resource", - "startLine": 45, - "startColumn": 7, - "endLine": 45, - "endColumn": 21, - "ruleDescription": "Validate SageMaker cluster instance types based on region", + "startLine": 69, + "startColumn": 11, + "endLine": 69, + "endColumn": 12, + "ruleDescription": "Validate Route53 RecordSets", "phase": "LINT" }, { - "ruleId": "E3644", + "ruleId": "E3023", "severity": "ERROR", - "message": "'ml.bogus.large' is not valid in any region", + "message": "CAA record value '0 issue amazon.com; henk' must match format: flag tag 'value'", "source": "CFN_LINT", "entity": { - "logicalId": "Cluster", + "logicalId": "MyCAARecordSet", "entityType": "Resource", - "resourceType": "AWS::SageMaker::Cluster" + "resourceType": "AWS::Route53::RecordSet" }, - "propertyPath": "Properties.RestrictedInstanceGroups.InstanceType", + "propertyPath": "Properties.ResourceRecords.1", "category": "Resource", - "startLine": 47, - "startColumn": 7, - "endLine": 47, - "endColumn": 31, - "ruleDescription": "Validate SageMaker cluster instance types based on region", + "startLine": 70, + "startColumn": 11, + "endLine": 70, + "endColumn": 12, + "ruleDescription": "Validate Route53 RecordSets", "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'JobResources' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E3023", + "severity": "ERROR", + "message": "CNAME records must have at most 1 ResourceRecord", + "source": "CFN_LINT", "entity": { - "logicalId": "ModelQualityJobDefinition", + "logicalId": "MyCNAMERecordSet", "entityType": "Resource", - "resourceType": "AWS::SageMaker::ModelQualityJobDefinition" + "resourceType": "AWS::Route53::RecordSet" }, - "propertyPath": "Properties.JobResources", - "category": "Best Practice", - "startLine": 15, + "propertyPath": "Properties.ResourceRecords", + "category": "Resource", + "startLine": 79, "startColumn": 7, - "endLine": 15, - "endColumn": 19, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "endLine": 79, + "endColumn": 22, + "ruleDescription": "Validate Route53 RecordSets", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ValidationSpecification' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E3023", + "severity": "ERROR", + "message": "CNAME records must have at most 1 ResourceRecord", + "source": "CFN_LINT", "entity": { - "logicalId": "ModelPackage", + "logicalId": "MyCNAMERecordSetConditions", "entityType": "Resource", - "resourceType": "AWS::SageMaker::ModelPackage" + "resourceType": "AWS::Route53::RecordSet" }, - "propertyPath": "Properties.ValidationSpecification", - "category": "Best Practice", - "startLine": 35, - "startColumn": 7, - "endLine": 35, - "endColumn": 30, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sagemaker", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9003", - "severity": "INFO", - "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", - "source": "ENGINE", - "category": "Best Practice", - "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", + "propertyPath": "Properties.ResourceRecords", + "category": "Resource", + "startLine": 93, + "startColumn": 11, + "endLine": 93, + "endColumn": 12, + "ruleDescription": "Validate Route53 RecordSets", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'MonitoringSchedule' of type 'AWS::SageMaker::MonitoringSchedule' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "E3023", + "severity": "ERROR", + "message": "MX record value '127.0.0.1' must match format: priority domain", + "source": "CFN_LINT", "entity": { - "logicalId": "MonitoringSchedule", + "logicalId": "MyMXRecordSet", "entityType": "Resource", - "resourceType": "AWS::SageMaker::MonitoringSchedule" + "resourceType": "AWS::Route53::RecordSet" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 6, - "startColumn": 5, - "endLine": 6, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "propertyPath": "Properties.ResourceRecords.0", + "category": "Resource", + "startLine": 104, + "startColumn": 11, + "endLine": 104, + "endColumn": 12, + "ruleDescription": "Validate Route53 RecordSets", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'ModelQualityJobDefinition' of type 'AWS::SageMaker::ModelQualityJobDefinition' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "E3023", + "severity": "ERROR", + "message": "MX record value '10 my domain' must match format: priority domain", + "source": "CFN_LINT", "entity": { - "logicalId": "ModelQualityJobDefinition", + "logicalId": "MyMXRecordSet", "entityType": "Resource", - "resourceType": "AWS::SageMaker::ModelQualityJobDefinition" + "resourceType": "AWS::Route53::RecordSet" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 14, - "startColumn": 5, - "endLine": 14, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "propertyPath": "Properties.ResourceRecords.1", + "category": "Resource", + "startLine": 105, + "startColumn": 11, + "endLine": 105, + "endColumn": 12, + "ruleDescription": "Validate Route53 RecordSets", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'InferenceExperiment' of type 'AWS::SageMaker::InferenceExperiment' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "E3023", + "severity": "ERROR", + "message": "TXT record value 'test4' must be enclosed in double quotes", + "source": "CFN_LINT", "entity": { - "logicalId": "InferenceExperiment", + "logicalId": "MyRecordSetGroup", "entityType": "Resource", - "resourceType": "AWS::SageMaker::InferenceExperiment" + "resourceType": "AWS::Route53::RecordSetGroup" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 22, - "startColumn": 5, - "endLine": 22, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "propertyPath": "Properties.RecordSets.0.ResourceRecords.0", + "category": "Resource", + "startLine": 127, + "startColumn": 15, + "endLine": 127, + "endColumn": 16, + "ruleDescription": "Validate Route53 RecordSets", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'ModelPackage' of type 'AWS::SageMaker::ModelPackage' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "E3023", + "severity": "ERROR", + "message": "'a.example.com' is not a valid IPv4 address for record type 'A'", + "source": "CFN_LINT", "entity": { - "logicalId": "ModelPackage", + "logicalId": "MyRecordSetGroup", "entityType": "Resource", - "resourceType": "AWS::SageMaker::ModelPackage" + "resourceType": "AWS::Route53::RecordSetGroup" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 34, - "startColumn": 5, - "endLine": 34, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "propertyPath": "Properties.RecordSets.1.ResourceRecords.0", + "category": "Resource", + "startLine": 132, + "startColumn": 15, + "endLine": 132, + "endColumn": 16, + "ruleDescription": "Validate Route53 RecordSets", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Cluster' of type 'AWS::SageMaker::Cluster' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "E3023", + "severity": "ERROR", + "message": "'1111:2222:3333:4444:55556666:7777:8888' is not a valid IPv6 address for record type 'AAAA'", + "source": "CFN_LINT", "entity": { - "logicalId": "Cluster", + "logicalId": "MyRecordSetGroup", "entityType": "Resource", - "resourceType": "AWS::SageMaker::Cluster" + "resourceType": "AWS::Route53::RecordSetGroup" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 44, - "startColumn": 5, - "endLine": 44, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "propertyPath": "Properties.RecordSets.2.ResourceRecords.0", + "category": "Resource", + "startLine": 137, + "startColumn": 15, + "endLine": 137, + "endColumn": 16, + "ruleDescription": "Validate Route53 RecordSets", "phase": "LINT" - } - ] - }, - "bad/sam/api_missing_stagename.yaml": { - "filePath": "bad/sam/api_missing_stagename.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 0, - "informational": 0, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "E0001", + "ruleId": "E3023", "severity": "ERROR", - "message": "Error transforming template: Resource with id [MyApi] is invalid. Missing required property 'StageName'.", + "message": "'1111:2222:3333:4444:5555:6666:7777:8888:' is not a valid IPv6 address for record type 'AAAA'", "source": "CFN_LINT", "entity": { - "logicalId": "MyApi", + "logicalId": "MyRecordSetGroup", "entityType": "Resource", - "resourceType": "AWS::Serverless::Api" + "resourceType": "AWS::Route53::RecordSetGroup" }, - "propertyPath": "Properties/StageName", - "category": "Structure", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 8, - "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", + "propertyPath": "Properties.RecordSets.2.ResourceRecords.1", + "category": "Resource", + "startLine": 138, + "startColumn": 15, + "endLine": 138, + "endColumn": 16, + "ruleDescription": "Validate Route53 RecordSets", "phase": "LINT" - } - ] - }, - "bad/sam/connector_missing_destination.yaml": { - "filePath": "bad/sam/connector_missing_destination.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 0, - "informational": 0, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "E0001", + "ruleId": "E3023", "severity": "ERROR", - "message": "Error transforming template: Resource with id [MyConn] is invalid. Missing required property 'Destination'.", + "message": "'1111:2222:3333:::5555:6666:7777:8888' is not a valid IPv6 address for record type 'AAAA'", "source": "CFN_LINT", "entity": { - "logicalId": "MyConn", + "logicalId": "MyRecordSetGroup", "entityType": "Resource", - "resourceType": "AWS::Serverless::Connector" + "resourceType": "AWS::Route53::RecordSetGroup" }, - "propertyPath": "Properties/Destination", - "category": "Structure", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 9, - "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", + "propertyPath": "Properties.RecordSets.2.ResourceRecords.2", + "category": "Resource", + "startLine": 139, + "startColumn": 15, + "endLine": 139, + "endColumn": 16, + "ruleDescription": "Validate Route53 RecordSets", "phase": "LINT" - } - ] - }, - "bad/sam/connector_missing_source.yaml": { - "filePath": "bad/sam/connector_missing_source.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 0, - "informational": 0, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "E0001", + "ruleId": "E3023", "severity": "ERROR", - "message": "Error transforming template: Resource with id [MyConn] is invalid. Missing required property 'Source'.", + "message": "'1111::3333:4444:5555::7777:8888' is not a valid IPv6 address for record type 'AAAA'", "source": "CFN_LINT", "entity": { - "logicalId": "MyConn", + "logicalId": "MyRecordSetGroup", "entityType": "Resource", - "resourceType": "AWS::Serverless::Connector" + "resourceType": "AWS::Route53::RecordSetGroup" }, - "propertyPath": "Properties/Source", - "category": "Structure", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 9, - "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", + "propertyPath": "Properties.RecordSets.2.ResourceRecords.3", + "category": "Resource", + "startLine": 140, + "startColumn": 15, + "endLine": 140, + "endColumn": 16, + "ruleDescription": "Validate Route53 RecordSets", "phase": "LINT" - } - ] - }, - "bad/sam/function_autopublishalias_invalid_name.yaml": { - "filePath": "bad/sam/function_autopublishalias_invalid_name.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 0, - "informational": 0, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "E0001", + "ruleId": "E3023", "severity": "ERROR", - "message": "Error transforming template: Resource with id [Fn] is invalid. AutoPublishAlias name ('123') must contain only alphanumeric characters, hyphens, or underscores matching (?!^[0-9]+$)([a-zA-Z0-9-_]+) pattern.", + "message": "'::1.2.3.' is not a valid IPv6 address for record type 'AAAA'", "source": "CFN_LINT", "entity": { - "logicalId": "Fn", + "logicalId": "MyRecordSetGroup", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::Route53::RecordSetGroup" }, - "propertyPath": "Properties", - "category": "Structure", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", + "propertyPath": "Properties.RecordSets.2.ResourceRecords.4", + "category": "Resource", + "startLine": 141, + "startColumn": 15, + "endLine": 141, + "endColumn": 16, + "ruleDescription": "Validate Route53 RecordSets", "phase": "LINT" - } - ] - }, - "bad/sam/function_capacityprovider_with_vpcconfig.yaml": { - "filePath": "bad/sam/function_capacityprovider_with_vpcconfig.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 0, - "informational": 0, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "E0001", + "ruleId": "E3023", "severity": "ERROR", - "message": "Error transforming template: Resource with id [Fn] is invalid. Cannot specify 'CapacityProviderConfig' and 'VpcConfig' together.", + "message": "':1111:2222:3333:4444:5555::7777:8888' is not a valid IPv6 address for record type 'AAAA'", "source": "CFN_LINT", "entity": { - "logicalId": "Fn", + "logicalId": "MyRecordSetGroup", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::Route53::RecordSetGroup" }, - "propertyPath": "Properties", - "category": "Structure", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", + "propertyPath": "Properties.RecordSets.2.ResourceRecords.5", + "category": "Resource", + "startLine": 142, + "startColumn": 15, + "endLine": 142, + "endColumn": 16, + "ruleDescription": "Validate Route53 RecordSets", "phase": "LINT" - } - ] - }, - "bad/sam/function_deploymentpreference_without_alias.yaml": { - "filePath": "bad/sam/function_deploymentpreference_without_alias.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 0, - "informational": 0, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "E0001", + "ruleId": "E3023", "severity": "ERROR", - "message": "Error transforming template: Resource with id [Fn] is invalid. 'DeploymentPreference' requires AutoPublishAlias property to be specified.", + "message": "'127.0.0.1 ' is not a valid IPv4 address for record type 'A'", "source": "CFN_LINT", "entity": { - "logicalId": "Fn", + "logicalId": "MyRecordSetGroup", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::Route53::RecordSetGroup" }, - "propertyPath": "Properties", - "category": "Structure", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", + "propertyPath": "Properties.RecordSets.3.ResourceRecords.0", + "category": "Resource", + "startLine": 147, + "startColumn": 15, + "endLine": 147, + "endColumn": 16, + "ruleDescription": "Validate Route53 RecordSets", "phase": "LINT" - } - ] - }, - "bad/sam/function_dlq_invalid_type.yaml": { - "filePath": "bad/sam/function_dlq_invalid_type.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 0, - "informational": 0, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "E0001", + "ruleId": "E3023", "severity": "ERROR", - "message": "Error transforming template: Resource with id [Fn] is invalid. 'DeadLetterQueue' requires Type of ['SQS', 'SNS']", + "message": "'256.10.1.256' is not a valid IPv4 address for record type 'A'", "source": "CFN_LINT", "entity": { - "logicalId": "Fn", + "logicalId": "MyRecordSetGroup", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::Route53::RecordSetGroup" }, - "propertyPath": "Properties", - "category": "Structure", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", + "propertyPath": "Properties.RecordSets.4.ResourceRecords.0", + "category": "Resource", + "startLine": 152, + "startColumn": 15, + "endLine": 152, + "endColumn": 16, + "ruleDescription": "Validate Route53 RecordSets", "phase": "LINT" - } - ] - }, - "bad/sam/function_dlq_missing_targetarn.yaml": { - "filePath": "bad/sam/function_dlq_missing_targetarn.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 0, - "informational": 0, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "E0001", + "ruleId": "E3023", "severity": "ERROR", - "message": "Error transforming template: Resource with id [Fn] is invalid. 'DeadLetterQueue' requires Type and TargetArn properties to be specified.", + "message": "CAA record value '1 issue \"amazon.com; example.com\"' must match format: flag tag 'value'", "source": "CFN_LINT", "entity": { - "logicalId": "Fn", + "logicalId": "MyRecordSetGroup", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::Route53::RecordSetGroup" }, - "propertyPath": "Properties", - "category": "Structure", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", + "propertyPath": "Properties.RecordSets.5.ResourceRecords.0", + "category": "Resource", + "startLine": 157, + "startColumn": 15, + "endLine": 157, + "endColumn": 16, + "ruleDescription": "Validate Route53 RecordSets", "phase": "LINT" - } - ] - }, - "bad/sam/function_functionscaling_without_capacityprovider.yaml": { - "filePath": "bad/sam/function_functionscaling_without_capacityprovider.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 0, - "informational": 0, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "E0001", + "ruleId": "E3023", "severity": "ERROR", - "message": "Error transforming template: Resource with id [Fn] is invalid. 'FunctionScalingConfig' requires 'CapacityProviderConfig'.", + "message": "CAA record value 'A issue \"amazon.com; example.com\"' must match format: flag tag 'value'", "source": "CFN_LINT", "entity": { - "logicalId": "Fn", + "logicalId": "MyRecordSetGroup", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::Route53::RecordSetGroup" }, - "propertyPath": "Properties", - "category": "Structure", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", + "propertyPath": "Properties.RecordSets.5.ResourceRecords.1", + "category": "Resource", + "startLine": 158, + "startColumn": 15, + "endLine": 158, + "endColumn": 16, + "ruleDescription": "Validate Route53 RecordSets", "phase": "LINT" - } - ] - }, - "bad/sam/function_image_with_handler_runtime.yaml": { - "filePath": "bad/sam/function_image_with_handler_runtime.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 0, - "informational": 0, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "E0001", + "ruleId": "E3023", "severity": "ERROR", - "message": "Error transforming template: Resource with id [Fn] is invalid. Runtime, Handler, Layers cannot be present when PackageType is of type `Image`", + "message": "CAA record value '0 special-value \"amazon.com\"' must match format: flag tag 'value'", "source": "CFN_LINT", "entity": { - "logicalId": "Fn", + "logicalId": "MyRecordSetGroup", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::Route53::RecordSetGroup" }, - "propertyPath": "Properties", - "category": "Structure", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", + "propertyPath": "Properties.RecordSets.5.ResourceRecords.2", + "category": "Resource", + "startLine": 159, + "startColumn": 15, + "endLine": 159, + "endColumn": 16, + "ruleDescription": "Validate Route53 RecordSets", "phase": "LINT" - } - ] - }, - "bad/sam/function_packagetype_invalid.yaml": { - "filePath": "bad/sam/function_packagetype_invalid.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 0, - "informational": 0, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "E0001", + "ruleId": "E3023", "severity": "ERROR", - "message": "Error transforming template: Resource with id [Fn] is invalid. invalid 'PackageType' : Banana", + "message": "MX record value 'mx1.example.com' must match format: priority domain", "source": "CFN_LINT", "entity": { - "logicalId": "Fn", + "logicalId": "MyRecordSetGroup", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::Route53::RecordSetGroup" }, - "propertyPath": "Properties", - "category": "Structure", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", + "propertyPath": "Properties.RecordSets.7.ResourceRecords.0", + "category": "Resource", + "startLine": 169, + "startColumn": 15, + "endLine": 169, + "endColumn": 16, + "ruleDescription": "Validate Route53 RecordSets", "phase": "LINT" - } - ] - }, - "bad/sam/function_provisioned_concurrency_without_alias.yaml": { - "filePath": "bad/sam/function_provisioned_concurrency_without_alias.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 0, - "informational": 0, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "E0001", + "ruleId": "E3023", "severity": "ERROR", - "message": "Error transforming template: Resource with id [Fn] is invalid. To set ProvisionedConcurrencyConfig AutoPublishALias must be defined on the function", + "message": "MX record value '65536 mx2.example.com' must match format: priority domain", "source": "CFN_LINT", "entity": { - "logicalId": "Fn", + "logicalId": "MyRecordSetGroup", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::Route53::RecordSetGroup" }, - "propertyPath": "Properties", - "category": "Structure", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", + "propertyPath": "Properties.RecordSets.7.ResourceRecords.1", + "category": "Resource", + "startLine": 170, + "startColumn": 15, + "endLine": 170, + "endColumn": 16, + "ruleDescription": "Validate Route53 RecordSets", "phase": "LINT" - } - ] - }, - "bad/sam/function_url_config_missing_authtype.yaml": { - "filePath": "bad/sam/function_url_config_missing_authtype.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 0, - "informational": 0, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "E0001", + "ruleId": "E3029", "severity": "ERROR", - "message": "Error transforming template: Resource with id [Fn] is invalid. AuthType is required to configure function property `FunctionUrlConfig`. Please provide either AWS_IAM or NONE.", + "message": "TTL must not be set when AliasTarget is specified", "source": "CFN_LINT", "entity": { - "logicalId": "Fn", + "logicalId": "MyAliasRecordSet", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::Route53::RecordSet" }, - "propertyPath": "Properties", - "category": "Structure", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", + "propertyPath": "Properties.TTL", + "category": "Resource", + "startLine": 113, + "startColumn": 7, + "endLine": 113, + "endColumn": 10, + "ruleDescription": "Validate Route53 record set aliases", "phase": "LINT" - } - ] - }, - "bad/sam/function_versiondeletionpolicy_without_alias.yaml": { - "filePath": "bad/sam/function_versiondeletionpolicy_without_alias.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 0, - "informational": 0, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "E0001", - "severity": "ERROR", - "message": "Error transforming template: Resource with id [Fn] is invalid. 'VersionDeletionPolicy' requires 'AutoPublishAlias'.", + "ruleId": "W1054", + "severity": "WARN", + "message": "Found a string 'AWS::Region' that appears to be a pseudo parameter reference; use 'Ref: AWS::Region' instead", "source": "CFN_LINT", "entity": { - "logicalId": "Fn", + "logicalId": "MyHostedZone", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::Route53::HostedZone" }, - "propertyPath": "Properties", - "category": "Structure", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", + "propertyPath": "Properties.VPCs.0.VPCRegion", + "suggestedFix": "Use Ref to reference pseudo parameters instead of embedding them as literal strings", + "category": "Intrinsic Function", + "startLine": 22, + "startColumn": 11, + "endLine": 22, + "endColumn": 20, + "ruleDescription": "String value matches a pseudo parameter; use Ref instead", "phase": "LINT" - } - ] - }, - "bad/sam/function_zip_missing_runtime_handler.yaml": { - "filePath": "bad/sam/function_zip_missing_runtime_handler.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 0, - "informational": 0, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "E0001", - "severity": "ERROR", - "message": "Error transforming template: Resource with id [Fn] is invalid. Runtime and Handler needs to be present when PackageType is of type `Zip`", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Name' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Fn", + "logicalId": "MyHostedZone", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::Route53::HostedZone" }, - "propertyPath": "Properties", - "category": "Structure", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", - "phase": "LINT" - } - ] - }, - "bad/sam/function_zip_with_imageuri.yaml": { - "filePath": "bad/sam/function_zip_with_imageuri.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 0, - "informational": 0, - "debug": 0 + "propertyPath": "Properties.Name", + "category": "Best Practice", + "startLine": 19, + "startColumn": 7, + "endLine": 19, + "endColumn": 11, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "E0001", - "severity": "ERROR", - "message": "Error transforming template: Resource with id [Fn] is invalid. ImageUri or ImageConfig cannot be present when PackageType is of type `Zip`", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'HostedZoneId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Fn", + "logicalId": "MyTXTRecordSet", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::Route53::RecordSet" }, - "propertyPath": "Properties", - "category": "Structure", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", - "phase": "LINT" - } - ] - }, - "bad/sam/globals_not_dict.yaml": { - "filePath": "bad/sam/globals_not_dict.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 0, - "informational": 0, - "debug": 0 + "propertyPath": "Properties.HostedZoneId", + "category": "Best Practice", + "startLine": 27, + "startColumn": 7, + "endLine": 27, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53-recordset", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'MyHostedZone'" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "E0001", - "severity": "ERROR", - "message": "Error transforming template: 'Globals' section is invalid. It must be a non-empty dictionary", - "source": "CFN_LINT", - "propertyPath": "Globals", - "category": "Structure", - "startLine": 2, - "startColumn": 1, - "endLine": 2, - "endColumn": 8, - "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", - "phase": "LINT" - } - ] - }, - "bad/sam/globals_section_not_dict.yaml": { - "filePath": "bad/sam/globals_section_not_dict.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 0, - "informational": 0, - "debug": 0 + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'HostedZoneId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "MyARecordSet", + "entityType": "Resource", + "resourceType": "AWS::Route53::RecordSet" + }, + "propertyPath": "Properties.HostedZoneId", + "category": "Best Practice", + "startLine": 40, + "startColumn": 7, + "endLine": 40, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53-recordset", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'MyHostedZone'" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "E0001", - "severity": "ERROR", - "message": "Error transforming template: 'Globals' section is invalid. Value of ${section} must be a dictionary", - "source": "CFN_LINT", - "propertyPath": "Globals", - "category": "Structure", - "startLine": 2, - "startColumn": 1, - "endLine": 2, - "endColumn": 8, - "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", - "phase": "LINT" + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'HostedZoneId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "MyAAAARecordSet", + "entityType": "Resource", + "resourceType": "AWS::Route53::RecordSet" + }, + "propertyPath": "Properties.HostedZoneId", + "category": "Best Practice", + "startLine": 50, + "startColumn": 7, + "endLine": 50, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53-recordset", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'MyHostedZone'" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'HostedZoneId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "MyCAARecordSet", + "entityType": "Resource", + "resourceType": "AWS::Route53::RecordSet" + }, + "propertyPath": "Properties.HostedZoneId", + "category": "Best Practice", + "startLine": 64, + "startColumn": 7, + "endLine": 64, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53-recordset", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'MyHostedZone'" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'HostedZoneId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "MyCNAMERecordSet", + "entityType": "Resource", + "resourceType": "AWS::Route53::RecordSet" + }, + "propertyPath": "Properties.HostedZoneId", + "category": "Best Practice", + "startLine": 75, + "startColumn": 7, + "endLine": 75, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53-recordset", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'MyHostedZone'" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'HostedZoneId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "MyCNAMERecordSetConditions", + "entityType": "Resource", + "resourceType": "AWS::Route53::RecordSet" + }, + "propertyPath": "Properties.HostedZoneId", + "category": "Best Practice", + "startLine": 86, + "startColumn": 7, + "endLine": 86, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53-recordset", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'MyHostedZone'" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'HostedZoneId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "MyMXRecordSet", + "entityType": "Resource", + "resourceType": "AWS::Route53::RecordSet" + }, + "propertyPath": "Properties.HostedZoneId", + "category": "Best Practice", + "startLine": 99, + "startColumn": 7, + "endLine": 99, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53-recordset", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'MyHostedZone'" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'HostedZoneId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "MyAliasRecordSet", + "entityType": "Resource", + "resourceType": "AWS::Route53::RecordSet" + }, + "propertyPath": "Properties.HostedZoneId", + "category": "Best Practice", + "startLine": 110, + "startColumn": 7, + "endLine": 110, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53-recordset", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'MyHostedZone'" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'HostedZoneId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "MyRecordSetGroup", + "entityType": "Resource", + "resourceType": "AWS::Route53::RecordSetGroup" + }, + "propertyPath": "Properties.HostedZoneId", + "category": "Best Practice", + "startLine": 121, + "startColumn": 7, + "endLine": 121, + "endColumn": 19, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'MyHostedZone'" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'HostedZoneId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "PoorlyConfiguredRoute53", + "entityType": "Resource", + "resourceType": "AWS::Route53::RecordSetGroup" + }, + "propertyPath": "Properties.HostedZoneId", + "category": "Best Practice", + "startLine": 174, + "startColumn": 7, + "endLine": 174, + "endColumn": 19, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'MyHostedZone'" + } + }, + { + "ruleId": "I9002", + "severity": "INFO", + "message": "'TTL' is ignored in this configuration (from extension)", + "source": "ENGINE", + "entity": { + "logicalId": "MyAliasRecordSet", + "entityType": "Resource", + "resourceType": "AWS::Route53::RecordSet" + }, + "propertyPath": "Properties.TTL", + "category": "Best Practice", + "startLine": 113, + "startColumn": 7, + "endLine": 113, + "endColumn": 10, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53-recordset", + "ruleDescription": "Property is ignored in this configuration (from extension)", + "phase": "SCHEMA" } ] }, - "bad/sam/globals_unknown_property.yaml": { - "filePath": "bad/sam/globals_unknown_property.yaml", + "bad/route53_conditional_record_arrays.yaml": { + "filePath": "bad/route53_conditional_record_arrays.yaml", "status": "OK", "metadata": { - "resourcesScanned": 1, + "resourcesScanned": 10, "counts": { "fatal": 0, - "errors": 1, + "errors": 10, "warnings": 0, - "informational": 0, + "informational": 10, "debug": 0 }, "suppressed": 0, @@ -10515,579 +10463,325 @@ }, "diagnostics": [ { - "ruleId": "E0001", + "ruleId": "E3023", "severity": "ERROR", - "message": "Error transforming template: 'Globals' section is invalid. 'NotARealProperty' is not a supported property of 'Function'. Must be one of the following values - ['Handler', 'Runtime', 'CodeUri', 'DeadLetterQueue', 'Description', 'MemorySize', 'Timeout', 'VpcConfig', 'Environment', 'Tags', 'PropagateTags', 'Tracing', 'KmsKeyArn', 'AutoPublishAlias', 'AutoPublishAliasAllProperties', 'Layers', 'DeploymentPreference', 'RolePath', 'PermissionsBoundary', 'ReservedConcurrentExecutions', 'ProvisionedConcurrencyConfig', 'AssumeRolePolicyDocument', 'EventInvokeConfig', 'FileSystemConfigs', 'CodeSigningConfigArn', 'Architectures', 'SnapStart', 'EphemeralStorage', 'FunctionUrlConfig', 'RuntimeManagementConfig', 'LoggingConfig', 'RecursiveLoop', 'SourceKMSKeyArn', 'TenancyConfig', 'DurableConfig', 'CapacityProviderConfig', 'FunctionScalingConfig', 'PublishToLatestPublished', 'VersionDeletionPolicy']", + "message": "'invalid-standalone-true' is not a valid IPv4 address for record type 'A'", "source": "CFN_LINT", - "propertyPath": "Globals", - "category": "Structure", - "startLine": 2, - "startColumn": 1, - "endLine": 2, - "endColumn": 8, - "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", + "entity": { + "logicalId": "StandaloneInvalidTrue", + "entityType": "Resource", + "resourceType": "AWS::Route53::RecordSet" + }, + "propertyPath": "Properties.ResourceRecords.0", + "category": "Resource", + "startLine": 21, + "startColumn": 12, + "endLine": 21, + "endColumn": 13, + "ruleDescription": "Validate Route53 RecordSets", "phase": "LINT" - } - ] - }, - "bad/sam/globals_unknown_section.yaml": { - "filePath": "bad/sam/globals_unknown_section.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 0, - "informational": 0, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "E0001", + "ruleId": "E3023", "severity": "ERROR", - "message": "Error transforming template: 'Globals' section is invalid. 'Foo' is not supported. Must be one of the following values - ['Api', 'CapacityProvider', 'Function', 'HttpApi', 'LayerVersion', 'MicrovmImage', 'NetworkConnector', 'SimpleTable', 'StateMachine', 'WebSocketApi']", + "message": "'invalid-standalone-false' is not a valid IPv4 address for record type 'A'", "source": "CFN_LINT", - "propertyPath": "Globals", - "category": "Structure", - "startLine": 2, - "startColumn": 1, - "endLine": 2, - "endColumn": 8, - "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", + "entity": { + "logicalId": "StandaloneInvalidFalse", + "entityType": "Resource", + "resourceType": "AWS::Route53::RecordSet" + }, + "propertyPath": "Properties.ResourceRecords.0", + "category": "Resource", + "startLine": 33, + "startColumn": 12, + "endLine": 33, + "endColumn": 13, + "ruleDescription": "Validate Route53 RecordSets", "phase": "LINT" - } - ] - }, - "bad/sam/graphqlapi_missing_auth.yaml": { - "filePath": "bad/sam/graphqlapi_missing_auth.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 0, - "informational": 0, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "E0001", + "ruleId": "E3023", "severity": "ERROR", - "message": "Error transforming template: Resource with id [MyApi] is invalid. Missing required property 'Auth'.", + "message": "'invalid-standalone-mixed-true' is not a valid IPv4 address for record type 'A'", "source": "CFN_LINT", "entity": { - "logicalId": "MyApi", + "logicalId": "StandaloneMixedInvalidTrue", "entityType": "Resource", - "resourceType": "AWS::Serverless::GraphQLApi" + "resourceType": "AWS::Route53::RecordSet" }, - "propertyPath": "Properties/Auth", - "category": "Structure", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 8, - "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", + "propertyPath": "Properties.ResourceRecords.1", + "category": "Resource", + "startLine": 44, + "startColumn": 13, + "endLine": 44, + "endColumn": 14, + "ruleDescription": "Validate Route53 RecordSets", "phase": "LINT" - } - ] - }, - "bad/sam/layerversion_invalid_compatible_architectures.yaml": { - "filePath": "bad/sam/layerversion_invalid_compatible_architectures.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 0, - "informational": 0, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "E0001", + "ruleId": "E3023", "severity": "ERROR", - "message": "Error transforming template: Resource with id [Layer] is invalid. CompatibleArchitectures needs to be a list of 'x86_64' or 'arm64'", + "message": "'invalid-standalone-mixed-false' is not a valid IPv4 address for record type 'A'", "source": "CFN_LINT", "entity": { - "logicalId": "Layer", + "logicalId": "StandaloneMixedInvalidFalse", "entityType": "Resource", - "resourceType": "AWS::Serverless::LayerVersion" + "resourceType": "AWS::Route53::RecordSet" }, - "propertyPath": "Properties", - "category": "Structure", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", + "propertyPath": "Properties.ResourceRecords.1", + "category": "Resource", + "startLine": 57, + "startColumn": 13, + "endLine": 57, + "endColumn": 14, + "ruleDescription": "Validate Route53 RecordSets", "phase": "LINT" - } - ] - }, - "bad/sam/layerversion_invalid_retention_policy.yaml": { - "filePath": "bad/sam/layerversion_invalid_retention_policy.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 0, - "informational": 0, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "E0001", + "ruleId": "E3023", "severity": "ERROR", - "message": "Error transforming template: Resource with id [Layer] is invalid. 'RetentionPolicy' must be one of the following options: ['Retain', 'Delete'].", + "message": "'invalid-group-true' is not a valid IPv4 address for record type 'A'", "source": "CFN_LINT", "entity": { - "logicalId": "Layer", + "logicalId": "GroupInvalidTrue", "entityType": "Resource", - "resourceType": "AWS::Serverless::LayerVersion" + "resourceType": "AWS::Route53::RecordSetGroup" }, - "propertyPath": "Properties", - "category": "Structure", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", + "propertyPath": "Properties.RecordSets.0.ResourceRecords.0", + "category": "Resource", + "startLine": 67, + "startColumn": 31, + "endLine": 67, + "endColumn": 32, + "ruleDescription": "Validate Route53 RecordSets", "phase": "LINT" - } - ] - }, - "bad/sam/simpletable_primarykey_invalid_type.yaml": { - "filePath": "bad/sam/simpletable_primarykey_invalid_type.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 0, - "informational": 0, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "E0001", + "ruleId": "E3023", "severity": "ERROR", - "message": "Error transforming template: Resource with id [MyTable] is invalid. Invalid 'Type' \"Banana\".", + "message": "'invalid-group-false' is not a valid IPv4 address for record type 'A'", "source": "CFN_LINT", "entity": { - "logicalId": "MyTable", + "logicalId": "GroupInvalidFalse", "entityType": "Resource", - "resourceType": "AWS::Serverless::SimpleTable" + "resourceType": "AWS::Route53::RecordSetGroup" }, - "propertyPath": "Properties/PrimaryKey", - "category": "Structure", - "startLine": 6, - "startColumn": 7, - "endLine": 6, - "endColumn": 17, - "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", + "propertyPath": "Properties.RecordSets.0.ResourceRecords.0", + "category": "Resource", + "startLine": 85, + "startColumn": 31, + "endLine": 85, + "endColumn": 32, + "ruleDescription": "Validate Route53 RecordSets", "phase": "LINT" - } - ] - }, - "bad/sam/simpletable_primarykey_missing_type.yaml": { - "filePath": "bad/sam/simpletable_primarykey_missing_type.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 0, - "informational": 0, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "E0001", + "ruleId": "E3023", "severity": "ERROR", - "message": "Error transforming template: Resource with id [MyTable] is invalid. Property 'PrimaryKey.Type' is required.", + "message": "'invalid-group-mixed-true' is not a valid IPv4 address for record type 'A'", "source": "CFN_LINT", "entity": { - "logicalId": "MyTable", + "logicalId": "GroupMixedInvalidTrue", "entityType": "Resource", - "resourceType": "AWS::Serverless::SimpleTable" + "resourceType": "AWS::Route53::RecordSetGroup" }, - "propertyPath": "Properties/PrimaryKey", - "category": "Structure", - "startLine": 6, - "startColumn": 7, - "endLine": 6, - "endColumn": 17, - "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", + "propertyPath": "Properties.RecordSets.0.ResourceRecords.1", + "category": "Resource", + "startLine": 97, + "startColumn": 17, + "endLine": 97, + "endColumn": 18, + "ruleDescription": "Validate Route53 RecordSets", "phase": "LINT" - } - ] - }, - "bad/sam/statemachine_both_definitions.yaml": { - "filePath": "bad/sam/statemachine_both_definitions.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 0, - "informational": 0, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "E0001", + "ruleId": "E3023", "severity": "ERROR", - "message": "Error transforming template: Resource with id [MySM] is invalid. Specify either 'Definition' or 'DefinitionUri' property and not both.", + "message": "'invalid-group-mixed-false' is not a valid IPv4 address for record type 'A'", "source": "CFN_LINT", "entity": { - "logicalId": "MySM", + "logicalId": "GroupMixedInvalidFalse", "entityType": "Resource", - "resourceType": "AWS::Serverless::StateMachine" + "resourceType": "AWS::Route53::RecordSetGroup" }, - "propertyPath": "Properties", - "category": "Structure", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", + "propertyPath": "Properties.RecordSets.0.ResourceRecords.1", + "category": "Resource", + "startLine": 117, + "startColumn": 17, + "endLine": 117, + "endColumn": 18, + "ruleDescription": "Validate Route53 RecordSets", "phase": "LINT" - } - ] - }, - "bad/sam/statemachine_no_definition.yaml": { - "filePath": "bad/sam/statemachine_no_definition.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 0, - "informational": 0, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "E0001", + "ruleId": "E3023", "severity": "ERROR", - "message": "Error transforming template: Resource with id [MySM] is invalid. Either 'Definition' or 'DefinitionUri' property must be specified.", + "message": "CNAME records must have at most 1 ResourceRecord", "source": "CFN_LINT", "entity": { - "logicalId": "MySM", + "logicalId": "StandaloneUnresolvedCnameCardinality", "entityType": "Resource", - "resourceType": "AWS::Serverless::StateMachine" + "resourceType": "AWS::Route53::RecordSet" }, - "propertyPath": "Properties", - "category": "Structure", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", + "propertyPath": "Properties.ResourceRecords", + "category": "Resource", + "startLine": 125, + "startColumn": 7, + "endLine": 125, + "endColumn": 22, + "ruleDescription": "Validate Route53 RecordSets", "phase": "LINT" - } - ] - }, - "bad/sam/transform_bogus_name.yaml": { - "filePath": "bad/sam/transform_bogus_name.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 0, - "informational": 1, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "E3038", + "ruleId": "E3023", "severity": "ERROR", - "message": "Resource type 'AWS::Serverless::Function' requires the AWS::Serverless-2016-10-31 transform", + "message": "CNAME records must have at most 1 ResourceRecord", "source": "CFN_LINT", "entity": { - "logicalId": "MyFn", + "logicalId": "GroupUnresolvedCnameCardinality", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::Route53::RecordSetGroup" }, - "category": "Structure", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 7, - "ruleDescription": "Check if Serverless Resources have Serverless Transform", + "propertyPath": "Properties.RecordSets.0.ResourceRecords", + "category": "Resource", + "startLine": 136, + "startColumn": 11, + "endLine": 136, + "endColumn": 26, + "ruleDescription": "Validate Route53 RecordSets", "phase": "LINT" }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'MyFn' of type 'AWS::Serverless::Function' supports Tags but none are configured", + "message": "Property 'HostedZoneName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MyFn", + "logicalId": "StandaloneInvalidTrue", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::Route53::RecordSet" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.HostedZoneName", "category": "Best Practice", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "bad/sam/transform_wrong_date.yaml": { - "filePath": "bad/sam/transform_wrong_date.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 0, - "informational": 1, - "debug": 0 + "startLine": 15, + "startColumn": 7, + "endLine": 15, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53-recordset", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "E3038", - "severity": "ERROR", - "message": "Resource type 'AWS::Serverless::Function' requires the AWS::Serverless-2016-10-31 transform", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'HostedZoneName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "MyFn", + "logicalId": "StandaloneInvalidFalse", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::Route53::RecordSet" }, - "category": "Structure", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 7, - "ruleDescription": "Check if Serverless Resources have Serverless Transform", - "phase": "LINT" + "propertyPath": "Properties.HostedZoneName", + "category": "Best Practice", + "startLine": 26, + "startColumn": 7, + "endLine": 26, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53-recordset", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'MyFn' of type 'AWS::Serverless::Function' supports Tags but none are configured", + "message": "Property 'HostedZoneName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MyFn", + "logicalId": "StandaloneMixedInvalidTrue", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::Route53::RecordSet" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.HostedZoneName", "category": "Best Practice", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "bad/schema_additional_props.yaml": { - "filePath": "bad/schema_additional_props.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 2, - "errors": 0, - "warnings": 0, - "informational": 2, - "debug": 0 + "startLine": 37, + "startColumn": 7, + "endLine": 37, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53-recordset", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "F3002", - "severity": "FATAL", - "message": "Additional properties are not allowed ('NotARealProperty' was unexpected)", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'HostedZoneName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Bucket", + "logicalId": "StandaloneMixedInvalidFalse", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::Route53::RecordSet" }, - "propertyPath": "Properties.NotARealProperty", - "category": "Schema", - "startLine": 7, + "propertyPath": "Properties.HostedZoneName", + "category": "Best Practice", + "startLine": 49, "startColumn": 7, - "endLine": 7, - "endColumn": 23, - "ruleDescription": "Additional properties are not allowed", + "endLine": 49, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53-recordset", + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "property": "NotARealProperty", - "extra": { - "allowed_properties": [ - "AbacStatus", - "AccelerateConfiguration", - "AccessControl", - "AnalyticsConfigurations", - "Arn", - "BucketEncryption", - "BucketName", - "BucketNamePrefix", - "BucketNamespace", - "CorsConfiguration", - "DomainName", - "DualStackDomainName", - "IntelligentTieringConfigurations", - "InventoryConfigurations", - "LifecycleConfiguration", - "LoggingConfiguration", - "MetadataConfiguration", - "MetadataTableConfiguration", - "MetricsConfigurations", - "NotificationConfiguration", - "ObjectLockConfiguration", - "ObjectLockEnabled", - "OwnershipControls", - "PublicAccessBlockConfiguration", - "RegionalDomainName", - "ReplicationConfiguration", - "Tags", - "VersioningConfiguration", - "WebsiteConfiguration", - "WebsiteURL" - ] - } + "lifecycle": "create-only" } }, { - "ruleId": "F3002", - "severity": "FATAL", - "message": "Additional properties are not allowed ('BukcetName' was unexpected)", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'HostedZoneName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Bucket", + "logicalId": "GroupInvalidTrue", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::Route53::RecordSetGroup" }, - "propertyPath": "Properties.BukcetName", - "category": "Schema", - "startLine": 8, + "propertyPath": "Properties.HostedZoneName", + "category": "Best Practice", + "startLine": 61, "startColumn": 7, - "endLine": 8, - "endColumn": 17, - "ruleDescription": "Additional properties are not allowed", + "endLine": 61, + "endColumn": 21, + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "property": "BukcetName", - "extra": { - "allowed_properties": [ - "AbacStatus", - "AccelerateConfiguration", - "AccessControl", - "AnalyticsConfigurations", - "Arn", - "BucketEncryption", - "BucketName", - "BucketNamePrefix", - "BucketNamespace", - "CorsConfiguration", - "DomainName", - "DualStackDomainName", - "IntelligentTieringConfigurations", - "InventoryConfigurations", - "LifecycleConfiguration", - "LoggingConfiguration", - "MetadataConfiguration", - "MetadataTableConfiguration", - "MetricsConfigurations", - "NotificationConfiguration", - "ObjectLockConfiguration", - "ObjectLockEnabled", - "OwnershipControls", - "PublicAccessBlockConfiguration", - "RegionalDomainName", - "ReplicationConfiguration", - "Tags", - "VersioningConfiguration", - "WebsiteConfiguration", - "WebsiteURL" - ] - } + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", + "message": "Property 'HostedZoneName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Bucket", + "logicalId": "GroupInvalidFalse", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::Route53::RecordSetGroup" }, - "propertyPath": "Properties.BucketName", + "propertyPath": "Properties.HostedZoneName", "category": "Best Practice", - "startLine": 6, + "startLine": 75, "startColumn": 7, - "endLine": 6, - "endColumn": 17, + "endLine": 75, + "endColumn": 21, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -11095,37 +10789,106 @@ } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Property 'HostedZoneName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Bucket", + "logicalId": "GroupMixedInvalidTrue", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::Route53::RecordSetGroup" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.HostedZoneName", "category": "Best Practice", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 89, + "startColumn": 7, + "endLine": 89, + "endColumn": 21, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'HostedZoneName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "GroupMixedInvalidFalse", + "entityType": "Resource", + "resourceType": "AWS::Route53::RecordSetGroup" + }, + "propertyPath": "Properties.HostedZoneName", + "category": "Best Practice", + "startLine": 105, + "startColumn": 7, + "endLine": 105, + "endColumn": 21, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'HostedZoneName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "StandaloneUnresolvedCnameCardinality", + "entityType": "Resource", + "resourceType": "AWS::Route53::RecordSet" + }, + "propertyPath": "Properties.HostedZoneName", + "category": "Best Practice", + "startLine": 121, + "startColumn": 7, + "endLine": 121, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53-recordset", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'HostedZoneName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "GroupUnresolvedCnameCardinality", + "entityType": "Resource", + "resourceType": "AWS::Route53::RecordSetGroup" + }, + "propertyPath": "Properties.HostedZoneName", + "category": "Best Practice", + "startLine": 131, + "startColumn": 7, + "endLine": 131, + "endColumn": 21, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } } ] }, - "bad/schema_composition.yaml": { - "filePath": "bad/schema_composition.yaml", + "bad/route53_conditional_scenarios.yaml": { + "filePath": "bad/route53_conditional_scenarios.yaml", "status": "OK", "metadata": { - "resourcesScanned": 2, + "resourcesScanned": 7, "counts": { - "fatal": 2, - "errors": 0, + "fatal": 0, + "errors": 8, "warnings": 0, - "informational": 5, + "informational": 3, "debug": 0 }, "suppressed": 0, @@ -11134,371 +10897,236 @@ }, "diagnostics": [ { - "ruleId": "F3017", - "severity": "FATAL", - "message": "Value is not valid under any of the 5 anyOf schemas for AWS::EC2::Volume (0 branches matched; at least one is required). Required property combinations: ['AvailabilityZone', 'Size'] or ['AvailabilityZone', 'SnapshotId'] or ['AvailabilityZoneId', 'Size'] or ['AvailabilityZoneId', 'SnapshotId'] or ['SourceVolumeId']. Branch failures: branch 1: 'AvailabilityZone' is a required property, 'Size' is a required property; branch 2: 'AvailabilityZone' is a required property, 'SnapshotId' is a required property; branch 3: 'AvailabilityZoneId' is a required property, 'Size' is a required property; branch 4: 'AvailabilityZoneId' is a required property, 'SnapshotId' is a required property; branch 5: 'SourceVolumeId' is a required property.", - "source": "SCHEMA", + "ruleId": "E3023", + "severity": "ERROR", + "message": "'not-an-ipv4-address' is not a valid IPv4 address for record type 'A'", + "source": "CFN_LINT", "entity": { - "logicalId": "NoAZ", + "logicalId": "ConditionalRecordSetsInvalidFirst", "entityType": "Resource", - "resourceType": "AWS::EC2::Volume" + "resourceType": "AWS::Route53::RecordSetGroup" }, - "propertyPath": "Properties", - "category": "Schema", - "startLine": 13, - "startColumn": 5, - "endLine": 13, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Value not valid under anyOf", - "phase": "SCHEMA", - "context": { - "expectedConstraint": "at least one anyOf branch", - "extra": { - "branchCount": 5, - "branchFailures": [ - { - "branch": 1, - "reasons": [ - { - "message": "'AvailabilityZone' is a required property", - "propertyPath": "Properties" - }, - { - "message": "'Size' is a required property", - "propertyPath": "Properties" - } - ] - }, - { - "branch": 2, - "reasons": [ - { - "message": "'AvailabilityZone' is a required property", - "propertyPath": "Properties" - }, - { - "message": "'SnapshotId' is a required property", - "propertyPath": "Properties" - } - ] - }, - { - "branch": 3, - "reasons": [ - { - "message": "'AvailabilityZoneId' is a required property", - "propertyPath": "Properties" - }, - { - "message": "'Size' is a required property", - "propertyPath": "Properties" - } - ] - }, - { - "branch": 4, - "reasons": [ - { - "message": "'AvailabilityZoneId' is a required property", - "propertyPath": "Properties" - }, - { - "message": "'SnapshotId' is a required property", - "propertyPath": "Properties" - } - ] - }, - { - "branch": 5, - "reasons": [ - { - "message": "'SourceVolumeId' is a required property", - "propertyPath": "Properties" - } - ] - } - ], - "compositionKind": "anyOf", - "matchCount": 0, - "matchOutcome": "zeroMatches", - "validPropertyCombinations": [ - [ - "AvailabilityZone", - "Size" - ], - [ - "AvailabilityZone", - "SnapshotId" - ], - [ - "AvailabilityZoneId", - "Size" - ], - [ - "AvailabilityZoneId", - "SnapshotId" - ], - [ - "SourceVolumeId" - ] - ] - } - } + "propertyPath": "Properties.RecordSets.0.ResourceRecords.0", + "category": "Resource", + "startLine": 60, + "startColumn": 31, + "endLine": 60, + "endColumn": 32, + "ruleDescription": "Validate Route53 RecordSets", + "phase": "LINT" }, { - "ruleId": "F3018", - "severity": "FATAL", - "message": "Value is not valid under any of the 2 oneOf schemas for AWS::AppStream::ImageBuilder (0 branches matched; exactly one is required). Required property combinations: ['ImageArn'] or ['ImageName']. Branch failures: branch 1: 'ImageName' is a required property; branch 2: 'ImageArn' is a required property.", - "source": "SCHEMA", + "ruleId": "E3023", + "severity": "ERROR", + "message": "'still-not-an-ipv4-address' is not a valid IPv4 address for record type 'A'", + "source": "CFN_LINT", "entity": { - "logicalId": "NoImage", + "logicalId": "ConditionalRecordSetsInvalidSecond", "entityType": "Resource", - "resourceType": "AWS::AppStream::ImageBuilder" + "resourceType": "AWS::Route53::RecordSetGroup" }, - "propertyPath": "Properties", - "category": "Schema", - "startLine": 6, - "startColumn": 5, - "endLine": 6, - "endColumn": 15, - "ruleDescription": "Value not valid under oneOf", - "phase": "SCHEMA", - "context": { - "expectedConstraint": "exactly one oneOf branch", - "extra": { - "branchCount": 2, - "branchFailures": [ - { - "branch": 1, - "reasons": [ - { - "message": "'ImageName' is a required property", - "propertyPath": "Properties" - } - ] - }, - { - "branch": 2, - "reasons": [ - { - "message": "'ImageArn' is a required property", - "propertyPath": "Properties" - } - ] - } - ], - "compositionKind": "oneOf", - "matchCount": 0, - "matchOutcome": "zeroMatches", - "validPropertyCombinations": [ - [ - "ImageArn" - ], - [ - "ImageName" - ] - ] - } - } + "propertyPath": "Properties.RecordSets.0.ResourceRecords.0", + "category": "Resource", + "startLine": 78, + "startColumn": 31, + "endLine": 78, + "endColumn": 32, + "ruleDescription": "Validate Route53 RecordSets", + "phase": "LINT" }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "ruleId": "E3023", + "severity": "ERROR", + "message": "'invalid-first-branch' is not a valid IPv4 address for record type 'A'", "source": "CFN_LINT", "entity": { - "logicalId": "NoAZ", + "logicalId": "WholePropertiesRecordsInvalidFirst", "entityType": "Resource", - "resourceType": "AWS::EC2::Volume" + "resourceType": "AWS::Route53::RecordSetGroup" }, - "category": "Best Practice", - "startLine": 11, - "startColumn": 3, - "endLine": 11, - "endColumn": 7, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "propertyPath": "Properties.RecordSets.0.ResourceRecords.0", + "category": "Resource", + "startLine": 88, + "startColumn": 31, + "endLine": 88, + "endColumn": 32, + "ruleDescription": "Validate Route53 RecordSets", "phase": "LINT" }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "ruleId": "E3023", + "severity": "ERROR", + "message": "'invalid-second-branch' is not a valid IPv4 address for record type 'A'", "source": "CFN_LINT", "entity": { - "logicalId": "NoAZ", + "logicalId": "WholePropertiesRecordsInvalidSecond", "entityType": "Resource", - "resourceType": "AWS::EC2::Volume" + "resourceType": "AWS::Route53::RecordSetGroup" }, - "category": "Best Practice", - "startLine": 11, - "startColumn": 3, - "endLine": 11, - "endColumn": 7, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "propertyPath": "Properties.RecordSets.0.ResourceRecords.0", + "category": "Resource", + "startLine": 110, + "startColumn": 31, + "endLine": 110, + "endColumn": 32, + "ruleDescription": "Validate Route53 RecordSets", "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Name' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E3029", + "severity": "ERROR", + "message": "TTL must not be set when AliasTarget is specified", + "source": "CFN_LINT", "entity": { - "logicalId": "NoImage", + "logicalId": "AliasConflictFirst", "entityType": "Resource", - "resourceType": "AWS::AppStream::ImageBuilder" + "resourceType": "AWS::Route53::RecordSet" }, - "propertyPath": "Properties.Name", - "category": "Best Practice", - "startLine": 8, - "startColumn": 7, - "endLine": 8, - "endColumn": 11, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "propertyPath": "Properties.TTL", + "category": "Resource", + "startLine": 12, + "startColumn": 5, + "endLine": 12, + "endColumn": 15, + "ruleDescription": "Validate Route53 record set aliases", + "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'NoImage' of type 'AWS::AppStream::ImageBuilder' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "E3029", + "severity": "ERROR", + "message": "TTL must not be set when AliasTarget is specified", + "source": "CFN_LINT", "entity": { - "logicalId": "NoImage", + "logicalId": "AliasConflictSecond", "entityType": "Resource", - "resourceType": "AWS::AppStream::ImageBuilder" + "resourceType": "AWS::Route53::RecordSet" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 6, + "propertyPath": "Properties.TTL", + "category": "Resource", + "startLine": 28, "startColumn": 5, - "endLine": 6, + "endLine": 28, "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Validate Route53 record set aliases", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'NoAZ' of type 'AWS::EC2::Volume' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "NoAZ", + "ruleId": "E3029", + "severity": "ERROR", + "message": "AliasTarget cannot be used with record type 'NS'", + "source": "CFN_LINT", + "entity": { + "logicalId": "ConditionalInvalidAliasTypes", "entityType": "Resource", - "resourceType": "AWS::EC2::Volume" + "resourceType": "AWS::Route53::RecordSet" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 13, - "startColumn": 5, - "endLine": 13, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "propertyPath": "Properties.AliasTarget", + "category": "Resource", + "startLine": 48, + "startColumn": 7, + "endLine": 48, + "endColumn": 18, + "ruleDescription": "Validate Route53 record set aliases", "phase": "LINT" - } - ] - }, - "bad/schema_conditional_type.yaml": { - "filePath": "bad/schema_conditional_type.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 1, - "informational": 2, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "W9003", - "severity": "WARN", - "message": "12345 (from Fn::If on condition 'IsProd') is not of type 'string' - automatically coerced (number to string)", + "ruleId": "E3029", + "severity": "ERROR", + "message": "AliasTarget cannot be used with record type 'SOA'", "source": "CFN_LINT", "entity": { - "logicalId": "Bucket", + "logicalId": "ConditionalInvalidAliasTypes", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::Route53::RecordSet" }, - "propertyPath": "Properties.BucketName", - "category": "Best Practice", - "startLine": 12, + "propertyPath": "Properties.AliasTarget", + "category": "Resource", + "startLine": 48, "startColumn": 7, - "endLine": 12, - "endColumn": 17, - "conditionScenario": { - "IsProd": true + "endLine": 48, + "endColumn": 18, + "ruleDescription": "Validate Route53 record set aliases", + "phase": "LINT" + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'HostedZoneName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConditionalInvalidAliasTypes", + "entityType": "Resource", + "resourceType": "AWS::Route53::RecordSet" }, - "ruleDescription": "Property type coercion warning", + "propertyPath": "Properties.HostedZoneName", + "category": "Best Practice", + "startLine": 45, + "startColumn": 7, + "endLine": 45, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53-recordset", + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "resolutionSource": "Fn::If on condition 'IsProd'" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", + "message": "Property 'HostedZoneName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Bucket", + "logicalId": "ConditionalRecordSetsInvalidFirst", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::Route53::RecordSetGroup" }, - "propertyPath": "Properties.BucketName", + "propertyPath": "Properties.HostedZoneName", "category": "Best Practice", - "startLine": 12, + "startLine": 54, "startColumn": 7, - "endLine": 12, - "endColumn": 17, + "endLine": 54, + "endColumn": 21, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Fn::If on condition 'IsProd'" + "lifecycle": "create-only" } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Property 'HostedZoneName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Bucket", + "logicalId": "ConditionalRecordSetsInvalidSecond", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::Route53::RecordSetGroup" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.HostedZoneName", "category": "Best Practice", - "startLine": 11, - "startColumn": 5, - "endLine": 11, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 68, + "startColumn": 7, + "endLine": 68, + "endColumn": 21, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } } ] }, - "bad/schema_enum_violation.yaml": { - "filePath": "bad/schema_enum_violation.yaml", + "bad/s3_tiering_bad_days.yaml": { + "filePath": "bad/s3_tiering_bad_days.yaml", "status": "OK", "metadata": { "resourcesScanned": 1, "counts": { "fatal": 0, - "errors": 1, - "warnings": 2, - "informational": 2, + "errors": 4, + "warnings": 0, + "informational": 1, "debug": 0 }, "suppressed": 0, @@ -11507,103 +11135,84 @@ }, "diagnostics": [ { - "ruleId": "E3045", + "ruleId": "E3061", "severity": "ERROR", - "message": "A bucket with 'AccessControl' set should also have at least one 'OwnershipControl' configured", + "message": "Days 30 for ARCHIVE_ACCESS must be between 90 and 730", "source": "CFN_LINT", "entity": { "logicalId": "Bucket", "entityType": "Resource", "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties", - "suggestedFix": "Add OwnershipControls to the bucket when using AccessControl", + "propertyPath": "Properties.IntelligentTieringConfigurations[0].Tierings[0].Days", + "suggestedFix": "Set Days between 90 and 730", "category": "Resource", "startLine": 5, "startColumn": 5, "endLine": 5, "endColumn": 15, - "ruleDescription": "Validate AccessControl are set with OwnershipControls", + "ruleDescription": "Validate the days for tierings in IntelligentTieringConfigurations", "phase": "LINT" }, { - "ruleId": "W3030", - "severity": "WARN", - "message": "'InvalidAccessControl' is not one of ['AuthenticatedRead', 'AwsExecRead', 'BucketOwnerFullControl', 'BucketOwnerRead', 'LogDeliveryWrite', 'Private', 'PublicRead', 'PublicReadWrite']", + "ruleId": "E3061", + "severity": "ERROR", + "message": "Days 800 for ARCHIVE_ACCESS must be between 90 and 730", "source": "CFN_LINT", "entity": { "logicalId": "Bucket", "entityType": "Resource", "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.AccessControl", - "category": "Schema", - "startLine": 7, - "startColumn": 7, - "endLine": 7, - "endColumn": 20, - "ruleDescription": "Value not in allowed enum", - "phase": "SCHEMA", - "context": { - "actualValue": "InvalidAccessControl", - "extra": { - "allowed_values": [ - "AuthenticatedRead", - "AwsExecRead", - "BucketOwnerFullControl", - "BucketOwnerRead", - "LogDeliveryWrite", - "Private", - "PublicRead", - "PublicReadWrite" - ] - } - } + "propertyPath": "Properties.IntelligentTieringConfigurations[1].Tierings[0].Days", + "suggestedFix": "Set Days between 90 and 730", + "category": "Resource", + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Validate the days for tierings in IntelligentTieringConfigurations", + "phase": "LINT" }, { - "ruleId": "W3045", - "severity": "WARN", - "message": "AccessControl property is deprecated. Use bucket policies instead", + "ruleId": "E3061", + "severity": "ERROR", + "message": "Days 100 for DEEP_ARCHIVE_ACCESS must be between 180 and 730", "source": "CFN_LINT", "entity": { "logicalId": "Bucket", "entityType": "Resource", "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.AccessControl", - "suggestedFix": "Remove AccessControl and use an AWS::S3::BucketPolicy resource", - "category": "Deprecation", - "startLine": 7, - "startColumn": 7, - "endLine": 7, - "endColumn": 20, - "ruleDescription": "Controlling access to an S3 bucket should be done with bucket policies", - "phase": "LINT", - "context": { - "actualValue": "InvalidAccessControl" - } + "propertyPath": "Properties.IntelligentTieringConfigurations[1].Tierings[1].Days", + "suggestedFix": "Set Days between 180 and 730", + "category": "Resource", + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Validate the days for tierings in IntelligentTieringConfigurations", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E3061", + "severity": "ERROR", + "message": "Days 900 for DEEP_ARCHIVE_ACCESS must be between 180 and 730", + "source": "CFN_LINT", "entity": { "logicalId": "Bucket", "entityType": "Resource", "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.BucketName", - "category": "Best Practice", - "startLine": 6, - "startColumn": 7, - "endLine": 6, - "endColumn": 17, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "propertyPath": "Properties.IntelligentTieringConfigurations[1].Tierings[2].Days", + "suggestedFix": "Set Days between 180 and 730", + "category": "Resource", + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Validate the days for tierings in IntelligentTieringConfigurations", + "phase": "LINT" }, { "ruleId": "I9040", @@ -11627,874 +11236,859 @@ } ] }, - "bad/schema_format_violation.yaml": { - "filePath": "bad/schema_format_violation.yaml", + "bad/sagemaker_instance_types.yaml": { + "filePath": "bad/sagemaker_instance_types.yaml", "status": "OK", "metadata": { - "resourcesScanned": 1, + "resourcesScanned": 5, "counts": { - "fatal": 0, - "errors": 1, - "warnings": 1, - "informational": 4, - "debug": 0 - }, - "suppressed": 0, + "fatal": 36, + "errors": 5, + "warnings": 0, + "informational": 8, + "debug": 0 + }, + "suppressed": 0, "strict": false, "severityLevel": "DEBUG" }, "diagnostics": [ { - "ruleId": "E1154", - "severity": "ERROR", - "message": "'subnet-bad' does not match format 'AWS::EC2::Subnet.Id'", - "source": "CFN_LINT", + "ruleId": "F3003", + "severity": "FATAL", + "message": "'MonitoringScheduleName' is a required property", + "source": "SCHEMA", "entity": { - "logicalId": "Instance", + "logicalId": "MonitoringSchedule", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SageMaker::MonitoringSchedule" }, - "propertyPath": "Properties.SubnetId", - "category": "Intrinsic Function", - "startLine": 7, - "startColumn": 7, - "endLine": 7, + "propertyPath": "Properties", + "suggestedFix": "Add the required property 'MonitoringScheduleName'", + "category": "Schema", + "startLine": 6, + "startColumn": 5, + "endLine": 6, "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate VPC subnet id format", - "phase": "SCHEMA", - "context": { - "actualValue": "subnet-bad" - } + "ruleDescription": "Required property missing", + "phase": "SCHEMA" }, { - "ruleId": "W9010", - "severity": "WARN", - "message": "Hardcoded AMI ID - use a parameter or mapping for portability", - "source": "ENGINE", + "ruleId": "F3003", + "severity": "FATAL", + "message": "'MonitoringAppSpecification' is a required property", + "source": "SCHEMA", "entity": { - "logicalId": "Instance", + "logicalId": "MonitoringSchedule", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SageMaker::MonitoringSchedule" }, - "propertyPath": "Properties.ImageId", - "category": "Security", - "startLine": 6, - "startColumn": 7, - "endLine": 6, - "endColumn": 14, - "ruleDescription": "Hardcoded AMI ID", - "phase": "LINT" + "propertyPath": "Properties.MonitoringScheduleConfig.MonitoringJobDefinition", + "suggestedFix": "Add the required property 'MonitoringAppSpecification'", + "category": "Schema", + "startLine": 8, + "startColumn": 9, + "endLine": 8, + "endColumn": 32, + "ruleDescription": "Required property missing", + "phase": "SCHEMA" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "F3003", + "severity": "FATAL", + "message": "'MonitoringInputs' is a required property", + "source": "SCHEMA", "entity": { - "logicalId": "Instance", + "logicalId": "MonitoringSchedule", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SageMaker::MonitoringSchedule" }, - "propertyPath": "Properties.ImageId", - "category": "Best Practice", - "startLine": 6, - "startColumn": 7, - "endLine": 6, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "propertyPath": "Properties.MonitoringScheduleConfig.MonitoringJobDefinition", + "suggestedFix": "Add the required property 'MonitoringInputs'", + "category": "Schema", + "startLine": 8, + "startColumn": 9, + "endLine": 8, + "endColumn": 32, + "ruleDescription": "Required property missing", + "phase": "SCHEMA" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "F3003", + "severity": "FATAL", + "message": "'MonitoringOutputConfig' is a required property", + "source": "SCHEMA", "entity": { - "logicalId": "Instance", + "logicalId": "MonitoringSchedule", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SageMaker::MonitoringSchedule" }, - "propertyPath": "Properties.SubnetId", - "category": "Best Practice", - "startLine": 7, - "startColumn": 7, - "endLine": 7, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "propertyPath": "Properties.MonitoringScheduleConfig.MonitoringJobDefinition", + "suggestedFix": "Add the required property 'MonitoringOutputConfig'", + "category": "Schema", + "startLine": 8, + "startColumn": 9, + "endLine": 8, + "endColumn": 32, + "ruleDescription": "Required property missing", + "phase": "SCHEMA" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'SecurityGroupIds' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "F3003", + "severity": "FATAL", + "message": "'RoleArn' is a required property", + "source": "SCHEMA", "entity": { - "logicalId": "Instance", + "logicalId": "MonitoringSchedule", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SageMaker::MonitoringSchedule" }, - "propertyPath": "Properties.SecurityGroupIds", - "category": "Best Practice", + "propertyPath": "Properties.MonitoringScheduleConfig.MonitoringJobDefinition", + "suggestedFix": "Add the required property 'RoleArn'", + "category": "Schema", "startLine": 8, - "startColumn": 7, + "startColumn": 9, "endLine": 8, - "endColumn": 23, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "endColumn": 32, + "ruleDescription": "Required property missing", + "phase": "SCHEMA" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Instance' of type 'AWS::EC2::Instance' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "F3003", + "severity": "FATAL", + "message": "'InstanceCount' is a required property", + "source": "SCHEMA", "entity": { - "logicalId": "Instance", + "logicalId": "MonitoringSchedule", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SageMaker::MonitoringSchedule" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "bad/schema_lifecycle.yaml": { - "filePath": "bad/schema_lifecycle.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 5, - "counts": { - "fatal": 1, - "errors": 3, - "warnings": 5, - "informational": 8, - "debug": 0 + "propertyPath": "Properties.MonitoringScheduleConfig.MonitoringJobDefinition.MonitoringResources.ClusterConfig", + "suggestedFix": "Add the required property 'InstanceCount'", + "category": "Schema", + "startLine": 10, + "startColumn": 13, + "endLine": 10, + "endColumn": 26, + "ruleDescription": "Required property missing", + "phase": "SCHEMA" }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { "ruleId": "F3003", "severity": "FATAL", - "message": "'RepositoryOwner' is a required property", + "message": "'VolumeSizeInGB' is a required property", "source": "SCHEMA", "entity": { - "logicalId": "ShutdownResource", + "logicalId": "MonitoringSchedule", "entityType": "Resource", - "resourceType": "AWS::CodeStar::GitHubRepository" + "resourceType": "AWS::SageMaker::MonitoringSchedule" + }, + "propertyPath": "Properties.MonitoringScheduleConfig.MonitoringJobDefinition.MonitoringResources.ClusterConfig", + "suggestedFix": "Add the required property 'VolumeSizeInGB'", + "category": "Schema", + "startLine": 10, + "startColumn": 13, + "endLine": 10, + "endColumn": 26, + "ruleDescription": "Required property missing", + "phase": "SCHEMA" + }, + { + "ruleId": "F3003", + "severity": "FATAL", + "message": "'ModelQualityAppSpecification' is a required property", + "source": "SCHEMA", + "entity": { + "logicalId": "ModelQualityJobDefinition", + "entityType": "Resource", + "resourceType": "AWS::SageMaker::ModelQualityJobDefinition" }, "propertyPath": "Properties", - "suggestedFix": "Add the required property 'RepositoryOwner'", + "suggestedFix": "Add the required property 'ModelQualityAppSpecification'", "category": "Schema", - "startLine": 6, + "startLine": 14, "startColumn": 5, - "endLine": 6, + "endLine": 14, "endColumn": 15, "ruleDescription": "Required property missing", "phase": "SCHEMA" }, { - "ruleId": "E2533", - "severity": "ERROR", - "message": "Runtime 'dotnetcore2.1' was deprecated on '2022-01-05'. Creation was disabled on '2022-01-05', and updates were disabled on '2022-04-13'. Please consider updating to 'dotnet10'", - "source": "CFN_LINT", + "ruleId": "F3003", + "severity": "FATAL", + "message": "'ModelQualityJobInput' is a required property", + "source": "SCHEMA", "entity": { - "logicalId": "EolLambda", + "logicalId": "ModelQualityJobDefinition", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::SageMaker::ModelQualityJobDefinition" }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 27, - "startColumn": 7, - "endLine": 27, - "endColumn": 14, - "ruleDescription": "Check if Lambda Function Runtimes are updatable", - "phase": "SCHEMA", - "context": { - "actualValue": "dotnetcore2.1", - "lifecycle": "end-of-life" - } + "propertyPath": "Properties", + "suggestedFix": "Add the required property 'ModelQualityJobInput'", + "category": "Schema", + "startLine": 14, + "startColumn": 5, + "endLine": 14, + "endColumn": 15, + "ruleDescription": "Required property missing", + "phase": "SCHEMA" }, { - "ruleId": "E3677", - "severity": "ERROR", - "message": "Runtime 'dotnetcore2.1' is not supported with Code.ZipFile - use nodejs or python", - "source": "CFN_LINT", + "ruleId": "F3003", + "severity": "FATAL", + "message": "'ModelQualityJobOutputConfig' is a required property", + "source": "SCHEMA", "entity": { - "logicalId": "EolLambda", + "logicalId": "ModelQualityJobDefinition", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::SageMaker::ModelQualityJobDefinition" }, - "category": "Resource", - "startLine": 23, - "startColumn": 3, - "endLine": 23, - "endColumn": 12, - "ruleDescription": "Lambda ZipFile requires nodejs or python runtime", - "phase": "LINT" + "propertyPath": "Properties", + "suggestedFix": "Add the required property 'ModelQualityJobOutputConfig'", + "category": "Schema", + "startLine": 14, + "startColumn": 5, + "endLine": 14, + "endColumn": 15, + "ruleDescription": "Required property missing", + "phase": "SCHEMA" }, { - "ruleId": "E3710", - "severity": "ERROR", - "message": "Resource type 'AWS::CodeStar::GitHubRepository' is from a service that was shut down on 2024-07-25", - "source": "CFN_LINT", + "ruleId": "F3003", + "severity": "FATAL", + "message": "'RoleArn' is a required property", + "source": "SCHEMA", "entity": { - "logicalId": "ShutdownResource", + "logicalId": "ModelQualityJobDefinition", "entityType": "Resource", - "resourceType": "AWS::CodeStar::GitHubRepository" + "resourceType": "AWS::SageMaker::ModelQualityJobDefinition" }, - "category": "Deprecation", - "startLine": 4, - "startColumn": 3, - "endLine": 4, - "endColumn": 19, - "ruleDescription": "Resource type is from a service that has been shut down", + "propertyPath": "Properties", + "suggestedFix": "Add the required property 'RoleArn'", + "category": "Schema", + "startLine": 14, + "startColumn": 5, + "endLine": 14, + "endColumn": 15, + "ruleDescription": "Required property missing", "phase": "SCHEMA" }, { - "ruleId": "W2531", - "severity": "WARN", - "message": "Runtime 'nodejs16.x' was deprecated on '2024-06-12'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'nodejs24.x'", - "source": "CFN_LINT", + "ruleId": "F3003", + "severity": "FATAL", + "message": "'InstanceCount' is a required property", + "source": "SCHEMA", "entity": { - "logicalId": "DeprecatedLambda", + "logicalId": "ModelQualityJobDefinition", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::SageMaker::ModelQualityJobDefinition" }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 38, - "startColumn": 7, - "endLine": 38, - "endColumn": 14, - "ruleDescription": "Check if EOL Lambda Function Runtimes are used", - "phase": "SCHEMA", - "context": { - "actualValue": "nodejs16.x", - "lifecycle": "deprecated" - } + "propertyPath": "Properties.JobResources.ClusterConfig", + "suggestedFix": "Add the required property 'InstanceCount'", + "category": "Schema", + "startLine": 16, + "startColumn": 9, + "endLine": 16, + "endColumn": 22, + "ruleDescription": "Required property missing", + "phase": "SCHEMA" }, { - "ruleId": "W3696", - "severity": "WARN", - "message": "Resource type 'AWS::AppMesh::Mesh' is from a service that will be shut down on 2026-09-30. Plan to migrate to an alternative", - "source": "CFN_LINT", + "ruleId": "F3003", + "severity": "FATAL", + "message": "'VolumeSizeInGB' is a required property", + "source": "SCHEMA", "entity": { - "logicalId": "SunsetResource", + "logicalId": "ModelQualityJobDefinition", "entityType": "Resource", - "resourceType": "AWS::AppMesh::Mesh" + "resourceType": "AWS::SageMaker::ModelQualityJobDefinition" }, - "category": "Deprecation", - "startLine": 10, - "startColumn": 3, - "endLine": 10, - "endColumn": 17, - "ruleDescription": "Resource type is from a service that is sunsetting", + "propertyPath": "Properties.JobResources.ClusterConfig", + "suggestedFix": "Add the required property 'VolumeSizeInGB'", + "category": "Schema", + "startLine": 16, + "startColumn": 9, + "endLine": 16, + "endColumn": 22, + "ruleDescription": "Required property missing", "phase": "SCHEMA" }, { - "ruleId": "W3697", - "severity": "WARN", - "message": "Resource type 'AWS::AutoScaling::LaunchConfiguration' is from a service in maintenance mode since 2024-10-01. Consider migrating to an alternative", - "source": "CFN_LINT", + "ruleId": "F3003", + "severity": "FATAL", + "message": "'EndpointName' is a required property", + "source": "SCHEMA", "entity": { - "logicalId": "MaintenanceResource", + "logicalId": "InferenceExperiment", "entityType": "Resource", - "resourceType": "AWS::AutoScaling::LaunchConfiguration" + "resourceType": "AWS::SageMaker::InferenceExperiment" }, - "category": "Deprecation", - "startLine": 16, - "startColumn": 3, - "endLine": 16, - "endColumn": 22, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", - "ruleDescription": "Resource type is from a service in maintenance mode", + "propertyPath": "Properties", + "suggestedFix": "Add the required property 'EndpointName'", + "category": "Schema", + "startLine": 22, + "startColumn": 5, + "endLine": 22, + "endColumn": 15, + "ruleDescription": "Required property missing", "phase": "SCHEMA" }, { - "ruleId": "W9013", - "severity": "WARN", - "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", - "source": "ENGINE", + "ruleId": "F3003", + "severity": "FATAL", + "message": "'Name' is a required property", + "source": "SCHEMA", "entity": { - "logicalId": "EolLambda", + "logicalId": "InferenceExperiment", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::SageMaker::InferenceExperiment" }, - "category": "Security", - "startLine": 23, - "startColumn": 3, - "endLine": 23, - "endColumn": 12, - "ruleDescription": "Hardcoded account ID in ARN", - "phase": "LINT" + "propertyPath": "Properties", + "suggestedFix": "Add the required property 'Name'", + "category": "Schema", + "startLine": 22, + "startColumn": 5, + "endLine": 22, + "endColumn": 15, + "ruleDescription": "Required property missing", + "phase": "SCHEMA" }, { - "ruleId": "W9013", - "severity": "WARN", - "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", - "source": "ENGINE", + "ruleId": "F3003", + "severity": "FATAL", + "message": "'RoleArn' is a required property", + "source": "SCHEMA", "entity": { - "logicalId": "DeprecatedLambda", + "logicalId": "InferenceExperiment", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::SageMaker::InferenceExperiment" }, - "category": "Security", - "startLine": 34, - "startColumn": 3, - "endLine": 34, - "endColumn": 19, - "ruleDescription": "Hardcoded account ID in ARN", - "phase": "LINT" + "propertyPath": "Properties", + "suggestedFix": "Add the required property 'RoleArn'", + "category": "Schema", + "startLine": 22, + "startColumn": 5, + "endLine": 22, + "endColumn": 15, + "ruleDescription": "Required property missing", + "phase": "SCHEMA" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'MeshName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "F3003", + "severity": "FATAL", + "message": "'Type' is a required property", + "source": "SCHEMA", "entity": { - "logicalId": "SunsetResource", + "logicalId": "InferenceExperiment", "entityType": "Resource", - "resourceType": "AWS::AppMesh::Mesh" + "resourceType": "AWS::SageMaker::InferenceExperiment" }, - "propertyPath": "Properties.MeshName", - "category": "Best Practice", - "startLine": 13, - "startColumn": 7, - "endLine": 13, + "propertyPath": "Properties", + "suggestedFix": "Add the required property 'Type'", + "category": "Schema", + "startLine": 22, + "startColumn": 5, + "endLine": 22, "endColumn": 15, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "ruleDescription": "Required property missing", + "phase": "SCHEMA" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "F3003", + "severity": "FATAL", + "message": "'InfrastructureType' is a required property", + "source": "SCHEMA", "entity": { - "logicalId": "MaintenanceResource", + "logicalId": "InferenceExperiment", "entityType": "Resource", - "resourceType": "AWS::AutoScaling::LaunchConfiguration" + "resourceType": "AWS::SageMaker::InferenceExperiment" }, - "propertyPath": "Properties.ImageId", - "category": "Best Practice", - "startLine": 19, - "startColumn": 7, - "endLine": 19, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "propertyPath": "Properties.ModelVariants.0.InfrastructureConfig", + "suggestedFix": "Add the required property 'InfrastructureType'", + "category": "Schema", + "startLine": 24, + "startColumn": 11, + "endLine": 24, + "endColumn": 31, + "ruleDescription": "Required property missing", + "phase": "SCHEMA" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'InstanceType' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "F3003", + "severity": "FATAL", + "message": "'ModelName' is a required property", + "source": "SCHEMA", "entity": { - "logicalId": "MaintenanceResource", + "logicalId": "InferenceExperiment", "entityType": "Resource", - "resourceType": "AWS::AutoScaling::LaunchConfiguration" + "resourceType": "AWS::SageMaker::InferenceExperiment" }, - "propertyPath": "Properties.InstanceType", - "category": "Best Practice", - "startLine": 20, - "startColumn": 7, - "endLine": 20, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "propertyPath": "Properties.ModelVariants.0", + "suggestedFix": "Add the required property 'ModelName'", + "category": "Schema", + "startLine": 24, + "startColumn": 31, + "endLine": 24, + "endColumn": 32, + "ruleDescription": "Required property missing", + "phase": "SCHEMA" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "F3003", + "severity": "FATAL", + "message": "'VariantName' is a required property", + "source": "SCHEMA", "entity": { - "logicalId": "EolLambda", + "logicalId": "InferenceExperiment", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::SageMaker::InferenceExperiment" }, - "propertyPath": "Properties.FunctionName", - "category": "Best Practice", - "startLine": 26, - "startColumn": 7, - "endLine": 26, - "endColumn": 19, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "propertyPath": "Properties.ModelVariants.0", + "suggestedFix": "Add the required property 'VariantName'", + "category": "Schema", + "startLine": 24, + "startColumn": 31, + "endLine": 24, + "endColumn": 32, + "ruleDescription": "Required property missing", + "phase": "SCHEMA" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "F3003", + "severity": "FATAL", + "message": "'InstanceCount' is a required property", + "source": "SCHEMA", "entity": { - "logicalId": "DeprecatedLambda", + "logicalId": "InferenceExperiment", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::SageMaker::InferenceExperiment" }, - "propertyPath": "Properties.FunctionName", - "category": "Best Practice", - "startLine": 37, - "startColumn": 7, - "endLine": 37, - "endColumn": 19, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "propertyPath": "Properties.ModelVariants.0.InfrastructureConfig.RealTimeInferenceConfig", + "suggestedFix": "Add the required property 'InstanceCount'", + "category": "Schema", + "startLine": 25, + "startColumn": 13, + "endLine": 25, + "endColumn": 36, + "ruleDescription": "Required property missing", + "phase": "SCHEMA" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'SunsetResource' of type 'AWS::AppMesh::Mesh' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "F3003", + "severity": "FATAL", + "message": "'InfrastructureType' is a required property", + "source": "SCHEMA", "entity": { - "logicalId": "SunsetResource", + "logicalId": "InferenceExperiment", "entityType": "Resource", - "resourceType": "AWS::AppMesh::Mesh" + "resourceType": "AWS::SageMaker::InferenceExperiment" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 12, - "startColumn": 5, - "endLine": 12, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "propertyPath": "Properties.ModelVariants.1.InfrastructureConfig", + "suggestedFix": "Add the required property 'InfrastructureType'", + "category": "Schema", + "startLine": 27, + "startColumn": 11, + "endLine": 27, + "endColumn": 31, + "ruleDescription": "Required property missing", + "phase": "SCHEMA" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'EolLambda' of type 'AWS::Lambda::Function' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "F3003", + "severity": "FATAL", + "message": "'ModelName' is a required property", + "source": "SCHEMA", "entity": { - "logicalId": "EolLambda", + "logicalId": "InferenceExperiment", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::SageMaker::InferenceExperiment" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 25, - "startColumn": 5, - "endLine": 25, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "propertyPath": "Properties.ModelVariants.1", + "suggestedFix": "Add the required property 'ModelName'", + "category": "Schema", + "startLine": 27, + "startColumn": 31, + "endLine": 27, + "endColumn": 32, + "ruleDescription": "Required property missing", + "phase": "SCHEMA" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'DeprecatedLambda' of type 'AWS::Lambda::Function' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "F3003", + "severity": "FATAL", + "message": "'VariantName' is a required property", + "source": "SCHEMA", "entity": { - "logicalId": "DeprecatedLambda", + "logicalId": "InferenceExperiment", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::SageMaker::InferenceExperiment" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 36, - "startColumn": 5, - "endLine": 36, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "bad/schema_numeric_bounds.yaml": { - "filePath": "bad/schema_numeric_bounds.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 1, - "errors": 0, - "warnings": 0, - "informational": 5, - "debug": 0 + "propertyPath": "Properties.ModelVariants.1", + "suggestedFix": "Add the required property 'VariantName'", + "category": "Schema", + "startLine": 27, + "startColumn": 31, + "endLine": 27, + "endColumn": 32, + "ruleDescription": "Required property missing", + "phase": "SCHEMA" }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "F3034", + "ruleId": "F3003", "severity": "FATAL", - "message": "-1 is less than the minimum of 0", + "message": "'InstanceCount' is a required property", "source": "SCHEMA", "entity": { - "logicalId": "Queue", + "logicalId": "InferenceExperiment", "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" + "resourceType": "AWS::SageMaker::InferenceExperiment" }, - "propertyPath": "Properties.VisibilityTimeout", + "propertyPath": "Properties.ModelVariants.1.InfrastructureConfig.RealTimeInferenceConfig", + "suggestedFix": "Add the required property 'InstanceCount'", "category": "Schema", - "startLine": 8, - "startColumn": 7, - "endLine": 8, - "endColumn": 24, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sqs.git", - "ruleDescription": "Numeric value out of bounds", - "phase": "SCHEMA", - "context": { - "actualValue": -1, - "extra": { - "maximum": 43200.0, - "minimum": 0.0 - } - } - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "startLine": 28, + "startColumn": 13, + "endLine": 28, + "endColumn": 36, + "ruleDescription": "Required property missing", + "phase": "SCHEMA" + }, + { + "ruleId": "F3003", + "severity": "FATAL", + "message": "'ValidationRole' is a required property", + "source": "SCHEMA", "entity": { - "logicalId": "Queue", + "logicalId": "ModelPackage", "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" + "resourceType": "AWS::SageMaker::ModelPackage" }, - "category": "Best Practice", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 8, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "propertyPath": "Properties.ValidationSpecification", + "suggestedFix": "Add the required property 'ValidationRole'", + "category": "Schema", + "startLine": 35, + "startColumn": 7, + "endLine": 35, + "endColumn": 30, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sagemaker", + "ruleDescription": "Required property missing", + "phase": "SCHEMA" }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "ruleId": "F3003", + "severity": "FATAL", + "message": "'TransformInput' is a required property", + "source": "SCHEMA", "entity": { - "logicalId": "Queue", + "logicalId": "ModelPackage", "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" + "resourceType": "AWS::SageMaker::ModelPackage" }, - "category": "Best Practice", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 8, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "propertyPath": "Properties.ValidationSpecification.ValidationProfiles.0.TransformJobDefinition", + "suggestedFix": "Add the required property 'TransformInput'", + "category": "Schema", + "startLine": 37, + "startColumn": 13, + "endLine": 37, + "endColumn": 35, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sagemaker", + "ruleDescription": "Required property missing", + "phase": "SCHEMA" }, { - "ruleId": "I3013", - "severity": "INFO", - "message": "'MessageRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", + "ruleId": "F3003", + "severity": "FATAL", + "message": "'TransformOutput' is a required property", + "source": "SCHEMA", "entity": { - "logicalId": "Queue", + "logicalId": "ModelPackage", "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" + "resourceType": "AWS::SageMaker::ModelPackage" }, - "propertyPath": "Properties", - "category": "Best Practice", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", - "phase": "LINT" + "propertyPath": "Properties.ValidationSpecification.ValidationProfiles.0.TransformJobDefinition", + "suggestedFix": "Add the required property 'TransformOutput'", + "category": "Schema", + "startLine": 37, + "startColumn": 13, + "endLine": 37, + "endColumn": 35, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sagemaker", + "ruleDescription": "Required property missing", + "phase": "SCHEMA" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'QueueName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "F3003", + "severity": "FATAL", + "message": "'ProfileName' is a required property", + "source": "SCHEMA", "entity": { - "logicalId": "Queue", + "logicalId": "ModelPackage", "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" + "resourceType": "AWS::SageMaker::ModelPackage" }, - "propertyPath": "Properties.QueueName", - "category": "Best Practice", - "startLine": 6, - "startColumn": 7, - "endLine": 6, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sqs.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "propertyPath": "Properties.ValidationSpecification.ValidationProfiles.0", + "suggestedFix": "Add the required property 'ProfileName'", + "category": "Schema", + "startLine": 37, + "startColumn": 35, + "endLine": 37, + "endColumn": 36, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sagemaker", + "ruleDescription": "Required property missing", + "phase": "SCHEMA" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Queue' of type 'AWS::SQS::Queue' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "F3003", + "severity": "FATAL", + "message": "'InstanceCount' is a required property", + "source": "SCHEMA", "entity": { - "logicalId": "Queue", + "logicalId": "ModelPackage", "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" + "resourceType": "AWS::SageMaker::ModelPackage" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "bad/schema_property_constraints.yaml": { - "filePath": "bad/schema_property_constraints.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 3, - "counts": { - "fatal": 1, - "errors": 0, - "warnings": 3, - "informational": 8, - "debug": 0 + "propertyPath": "Properties.ValidationSpecification.ValidationProfiles.0.TransformJobDefinition.TransformResources", + "suggestedFix": "Add the required property 'InstanceCount'", + "category": "Schema", + "startLine": 38, + "startColumn": 15, + "endLine": 38, + "endColumn": 33, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sagemaker", + "ruleDescription": "Required property missing", + "phase": "SCHEMA" }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "F3031", + "ruleId": "F3003", "severity": "FATAL", - "message": "'INVALID_UPPERCASE_BUCKET' does not match pattern '^([a-z0-9][a-z0-9.-]*[a-z0-9])?$'", + "message": "'ExecutionRole' is a required property", "source": "SCHEMA", "entity": { - "logicalId": "PatternBucket", + "logicalId": "Cluster", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::SageMaker::Cluster" }, - "propertyPath": "Properties.BucketName", + "propertyPath": "Properties.InstanceGroups.0", + "suggestedFix": "Add the required property 'ExecutionRole'", "category": "Schema", - "startLine": 6, - "startColumn": 7, - "endLine": 6, - "endColumn": 17, - "ruleDescription": "Value does not match pattern", - "phase": "SCHEMA", - "context": { - "actualValue": "INVALID_UPPERCASE_BUCKET", - "expectedConstraint": "^([a-z0-9][a-z0-9.-]*[a-z0-9])?$" - } + "startLine": 46, + "startColumn": 23, + "endLine": 46, + "endColumn": 24, + "ruleDescription": "Required property missing", + "phase": "SCHEMA" }, { - "ruleId": "W9002", - "severity": "WARN", - "message": "Property 'CertificateAuthorityArn' has a hardcoded ARN - use Ref, GetAtt, or a parameter instead", - "source": "ENGINE", + "ruleId": "F3003", + "severity": "FATAL", + "message": "'InstanceCount' is a required property", + "source": "SCHEMA", "entity": { - "logicalId": "ReadOnlyProp", + "logicalId": "Cluster", "entityType": "Resource", - "resourceType": "AWS::ACMPCA::Certificate" + "resourceType": "AWS::SageMaker::Cluster" }, - "propertyPath": "Properties.CertificateAuthorityArn", - "category": "Best Practice", - "startLine": 11, - "startColumn": 7, - "endLine": 11, - "endColumn": 30, - "ruleDescription": "Hardcoded ARN property", - "phase": "LINT" + "propertyPath": "Properties.InstanceGroups.0", + "suggestedFix": "Add the required property 'InstanceCount'", + "category": "Schema", + "startLine": 46, + "startColumn": 23, + "endLine": 46, + "endColumn": 24, + "ruleDescription": "Required property missing", + "phase": "SCHEMA" }, { - "ruleId": "W9009", - "severity": "WARN", - "message": "Property 'WorkGroupConfigurationUpdates' is deprecated", - "source": "ENGINE", + "ruleId": "F3003", + "severity": "FATAL", + "message": "'InstanceGroupName' is a required property", + "source": "SCHEMA", "entity": { - "logicalId": "DeprecatedProp", + "logicalId": "Cluster", "entityType": "Resource", - "resourceType": "AWS::Athena::WorkGroup" + "resourceType": "AWS::SageMaker::Cluster" }, - "propertyPath": "Properties.WorkGroupConfigurationUpdates", - "category": "Deprecation", - "startLine": 23, - "startColumn": 7, - "endLine": 23, - "endColumn": 36, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-athena.git", - "ruleDescription": "Resource type sunset or shutdown", - "phase": "SCHEMA", - "context": { - "lifecycle": "deprecated" - } + "propertyPath": "Properties.InstanceGroups.0", + "suggestedFix": "Add the required property 'InstanceGroupName'", + "category": "Schema", + "startLine": 46, + "startColumn": 23, + "endLine": 46, + "endColumn": 24, + "ruleDescription": "Required property missing", + "phase": "SCHEMA" }, { - "ruleId": "W9013", - "severity": "WARN", - "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", - "source": "ENGINE", + "ruleId": "F3003", + "severity": "FATAL", + "message": "'ExecutionRole' is a required property", + "source": "SCHEMA", "entity": { - "logicalId": "ReadOnlyProp", + "logicalId": "Cluster", "entityType": "Resource", - "resourceType": "AWS::ACMPCA::Certificate" + "resourceType": "AWS::SageMaker::Cluster" }, - "category": "Security", - "startLine": 8, - "startColumn": 3, - "endLine": 8, - "endColumn": 15, - "ruleDescription": "Hardcoded account ID in ARN", - "phase": "LINT" + "propertyPath": "Properties.RestrictedInstanceGroups.0", + "suggestedFix": "Add the required property 'ExecutionRole'", + "category": "Schema", + "startLine": 48, + "startColumn": 23, + "endLine": 48, + "endColumn": 24, + "ruleDescription": "Required property missing", + "phase": "SCHEMA" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "F3003", + "severity": "FATAL", + "message": "'InstanceCount' is a required property", + "source": "SCHEMA", "entity": { - "logicalId": "PatternBucket", + "logicalId": "Cluster", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::SageMaker::Cluster" }, - "propertyPath": "Properties.BucketName", - "category": "Best Practice", - "startLine": 6, - "startColumn": 7, - "endLine": 6, - "endColumn": 17, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "propertyPath": "Properties.RestrictedInstanceGroups.0", + "suggestedFix": "Add the required property 'InstanceCount'", + "category": "Schema", + "startLine": 48, + "startColumn": 23, + "endLine": 48, + "endColumn": 24, + "ruleDescription": "Required property missing", + "phase": "SCHEMA" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'CertificateAuthorityArn' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "F3003", + "severity": "FATAL", + "message": "'InstanceGroupName' is a required property", + "source": "SCHEMA", "entity": { - "logicalId": "ReadOnlyProp", + "logicalId": "Cluster", "entityType": "Resource", - "resourceType": "AWS::ACMPCA::Certificate" + "resourceType": "AWS::SageMaker::Cluster" }, - "propertyPath": "Properties.CertificateAuthorityArn", - "category": "Best Practice", + "propertyPath": "Properties.RestrictedInstanceGroups.0", + "suggestedFix": "Add the required property 'InstanceGroupName'", + "category": "Schema", + "startLine": 48, + "startColumn": 23, + "endLine": 48, + "endColumn": 24, + "ruleDescription": "Required property missing", + "phase": "SCHEMA" + }, + { + "ruleId": "E3640", + "severity": "ERROR", + "message": "'ml.fake.xlarge' is not valid in any region", + "source": "CFN_LINT", + "entity": { + "logicalId": "MonitoringSchedule", + "entityType": "Resource", + "resourceType": "AWS::SageMaker::MonitoringSchedule" + }, + "propertyPath": "Properties.MonitoringScheduleConfig.MonitoringJobDefinition.MonitoringResources.ClusterConfig.InstanceType", + "category": "Resource", "startLine": 11, - "startColumn": 7, + "startColumn": 15, "endLine": 11, - "endColumn": 30, - "documentationUrl": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/AWS_ACMPCA.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "endColumn": 27, + "ruleDescription": "Validate SageMaker processing instance types based on region", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'CertificateSigningRequest' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E3642", + "severity": "ERROR", + "message": "'ml.fake.xlarge' is not valid in any region", + "source": "CFN_LINT", "entity": { - "logicalId": "ReadOnlyProp", + "logicalId": "InferenceExperiment", "entityType": "Resource", - "resourceType": "AWS::ACMPCA::Certificate" + "resourceType": "AWS::SageMaker::InferenceExperiment" }, - "propertyPath": "Properties.CertificateSigningRequest", - "category": "Best Practice", - "startLine": 12, + "propertyPath": "Properties.ModelVariants.InfrastructureConfig.RealTimeInferenceConfig.InstanceType", + "category": "Resource", + "startLine": 23, "startColumn": 7, - "endLine": 12, - "endColumn": 32, - "documentationUrl": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/AWS_ACMPCA.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "endLine": 23, + "endColumn": 20, + "ruleDescription": "Validate SageMaker hosting instance types based on region", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'SigningAlgorithm' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E3643", + "severity": "ERROR", + "message": "'ml.bogus.large' is not valid in any region", + "source": "CFN_LINT", "entity": { - "logicalId": "ReadOnlyProp", + "logicalId": "ModelPackage", "entityType": "Resource", - "resourceType": "AWS::ACMPCA::Certificate" + "resourceType": "AWS::SageMaker::ModelPackage" }, - "propertyPath": "Properties.SigningAlgorithm", - "category": "Best Practice", - "startLine": 13, + "propertyPath": "Properties.ValidationSpecification.ValidationProfiles.TransformJobDefinition.TransformResources.InstanceType", + "category": "Resource", + "startLine": 36, + "startColumn": 9, + "endLine": 36, + "endColumn": 27, + "ruleDescription": "Validate SageMaker transform instance types based on region", + "phase": "LINT" + }, + { + "ruleId": "E3644", + "severity": "ERROR", + "message": "'ml.fake.xlarge' is not valid in any region", + "source": "CFN_LINT", + "entity": { + "logicalId": "Cluster", + "entityType": "Resource", + "resourceType": "AWS::SageMaker::Cluster" + }, + "propertyPath": "Properties.InstanceGroups.InstanceType", + "category": "Resource", + "startLine": 45, "startColumn": 7, - "endLine": 13, - "endColumn": 23, - "documentationUrl": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/AWS_ACMPCA.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "endLine": 45, + "endColumn": 21, + "ruleDescription": "Validate SageMaker cluster instance types based on region", + "phase": "LINT" + }, + { + "ruleId": "E3644", + "severity": "ERROR", + "message": "'ml.bogus.large' is not valid in any region", + "source": "CFN_LINT", + "entity": { + "logicalId": "Cluster", + "entityType": "Resource", + "resourceType": "AWS::SageMaker::Cluster" + }, + "propertyPath": "Properties.RestrictedInstanceGroups.InstanceType", + "category": "Resource", + "startLine": 47, + "startColumn": 7, + "endLine": 47, + "endColumn": 31, + "ruleDescription": "Validate SageMaker cluster instance types based on region", + "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Validity' is create-only; updating it will cause resource replacement", + "message": "Property 'JobResources' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ReadOnlyProp", + "logicalId": "ModelQualityJobDefinition", "entityType": "Resource", - "resourceType": "AWS::ACMPCA::Certificate" + "resourceType": "AWS::SageMaker::ModelQualityJobDefinition" }, - "propertyPath": "Properties.Validity", + "propertyPath": "Properties.JobResources", "category": "Best Practice", - "startLine": 14, + "startLine": 15, "startColumn": 7, - "endLine": 14, - "endColumn": 15, - "documentationUrl": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/AWS_ACMPCA.html", + "endLine": 15, + "endColumn": 19, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -12504,20 +12098,20 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Name' is create-only; updating it will cause resource replacement", + "message": "Property 'ValidationSpecification' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DeprecatedProp", + "logicalId": "ModelPackage", "entityType": "Resource", - "resourceType": "AWS::Athena::WorkGroup" + "resourceType": "AWS::SageMaker::ModelPackage" }, - "propertyPath": "Properties.Name", + "propertyPath": "Properties.ValidationSpecification", "category": "Best Practice", - "startLine": 22, + "startLine": 35, "startColumn": 7, - "endLine": 22, - "endColumn": 11, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-athena.git", + "endLine": 35, + "endColumn": 30, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sagemaker", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -12525,216 +12119,164 @@ } }, { - "ruleId": "I9040", + "ruleId": "I9003", "severity": "INFO", - "message": "Resource 'PatternBucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", "source": "ENGINE", - "entity": { - "logicalId": "PatternBucket", - "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'DeprecatedProp' of type 'AWS::Athena::WorkGroup' supports Tags but none are configured", + "message": "Resource 'MonitoringSchedule' of type 'AWS::SageMaker::MonitoringSchedule' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "DeprecatedProp", + "logicalId": "MonitoringSchedule", "entityType": "Resource", - "resourceType": "AWS::Athena::WorkGroup" + "resourceType": "AWS::SageMaker::MonitoringSchedule" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 21, + "startLine": 6, "startColumn": 5, - "endLine": 21, + "endLine": 6, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" - } - ] - }, - "bad/schema_required_xor_conditional.yaml": { - "filePath": "bad/schema_required_xor_conditional.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 1, - "errors": 0, - "warnings": 0, - "informational": 5, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "F3014", - "severity": "FATAL", - "message": "Exactly one of ['ScalingTargetId', 'ResourceId'] must be specified", - "source": "SCHEMA", - "entity": { - "logicalId": "Policy", - "entityType": "Resource", - "resourceType": "AWS::ApplicationAutoScaling::ScalingPolicy" - }, - "propertyPath": "Properties", - "category": "Schema", - "startLine": 13, - "startColumn": 5, - "endLine": 13, - "endColumn": 15, - "conditionScenario": { - "DuplicateTarget": true - }, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Exactly one of properties required (requiredXor)", - "phase": "SCHEMA" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'PolicyName' is create-only; updating it will cause resource replacement", + "message": "Resource 'ModelQualityJobDefinition' of type 'AWS::SageMaker::ModelQualityJobDefinition' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Policy", + "logicalId": "ModelQualityJobDefinition", "entityType": "Resource", - "resourceType": "AWS::ApplicationAutoScaling::ScalingPolicy" + "resourceType": "AWS::SageMaker::ModelQualityJobDefinition" }, - "propertyPath": "Properties.PolicyName", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", "startLine": 14, - "startColumn": 7, + "startColumn": 5, "endLine": 14, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'ScalingTargetId' is create-only; updating it will cause resource replacement", + "message": "Resource 'InferenceExperiment' of type 'AWS::SageMaker::InferenceExperiment' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Policy", + "logicalId": "InferenceExperiment", "entityType": "Resource", - "resourceType": "AWS::ApplicationAutoScaling::ScalingPolicy" + "resourceType": "AWS::SageMaker::InferenceExperiment" }, - "propertyPath": "Properties.ScalingTargetId", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 16, - "startColumn": 7, - "endLine": 16, - "endColumn": 22, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter 'TargetId' (type String)" - } + "startLine": 22, + "startColumn": 5, + "endLine": 22, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'ResourceId' is create-only; updating it will cause resource replacement", + "message": "Resource 'ModelPackage' of type 'AWS::SageMaker::ModelPackage' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Policy", + "logicalId": "ModelPackage", "entityType": "Resource", - "resourceType": "AWS::ApplicationAutoScaling::ScalingPolicy" + "resourceType": "AWS::SageMaker::ModelPackage" }, - "propertyPath": "Properties.ResourceId", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 17, - "startColumn": 7, - "endLine": 17, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Fn::If on condition 'DuplicateTarget'" - } + "startLine": 34, + "startColumn": 5, + "endLine": 34, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'ScalableDimension' is create-only; updating it will cause resource replacement", + "message": "Resource 'Cluster' of type 'AWS::SageMaker::Cluster' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Policy", + "logicalId": "Cluster", "entityType": "Resource", - "resourceType": "AWS::ApplicationAutoScaling::ScalingPolicy" + "resourceType": "AWS::SageMaker::Cluster" }, - "propertyPath": "Properties.ScalableDimension", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 18, - "startColumn": 7, - "endLine": 18, - "endColumn": 24, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 44, + "startColumn": 5, + "endLine": 44, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "bad/sam/api_missing_stagename.yaml": { + "filePath": "bad/sam/api_missing_stagename.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 1, + "warnings": 0, + "informational": 0, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ServiceNamespace' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E0001", + "severity": "ERROR", + "message": "Error transforming template: Resource with id [MyApi] is invalid. Missing required property 'StageName'.", + "source": "CFN_LINT", "entity": { - "logicalId": "Policy", + "logicalId": "MyApi", "entityType": "Resource", - "resourceType": "AWS::ApplicationAutoScaling::ScalingPolicy" + "resourceType": "AWS::Serverless::Api" }, - "propertyPath": "Properties.ServiceNamespace", - "category": "Best Practice", - "startLine": 19, - "startColumn": 7, - "endLine": 19, - "endColumn": 23, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "propertyPath": "Properties/StageName", + "category": "Structure", + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 8, + "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", + "phase": "LINT" } ] }, - "bad/schema_string_length.yaml": { - "filePath": "bad/schema_string_length.yaml", + "bad/sam/connector_missing_destination.yaml": { + "filePath": "bad/sam/connector_missing_destination.yaml", "status": "OK", "metadata": { "resourcesScanned": 1, "counts": { "fatal": 0, - "errors": 0, - "warnings": 1, - "informational": 2, + "errors": 1, + "warnings": 0, + "informational": 0, "debug": 0 }, "suppressed": 0, @@ -12743,77 +12285,74 @@ }, "diagnostics": [ { - "ruleId": "W9013", - "severity": "WARN", - "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", - "source": "ENGINE", + "ruleId": "E0001", + "severity": "ERROR", + "message": "Error transforming template: Resource with id [MyConn] is invalid. Missing required property 'Destination'.", + "source": "CFN_LINT", "entity": { - "logicalId": "Lambda", + "logicalId": "MyConn", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::Serverless::Connector" }, - "category": "Security", + "propertyPath": "Properties/Destination", + "category": "Structure", "startLine": 3, "startColumn": 3, "endLine": 3, "endColumn": 9, - "ruleDescription": "Hardcoded account ID in ARN", + "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", "phase": "LINT" + } + ] + }, + "bad/sam/connector_missing_source.yaml": { + "filePath": "bad/sam/connector_missing_source.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 1, + "warnings": 0, + "informational": 0, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Lambda", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "Properties.FunctionName", - "category": "Best Practice", - "startLine": 6, - "startColumn": 7, - "endLine": 6, - "endColumn": 19, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Lambda' of type 'AWS::Lambda::Function' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "E0001", + "severity": "ERROR", + "message": "Error transforming template: Resource with id [MyConn] is invalid. Missing required property 'Source'.", + "source": "CFN_LINT", "entity": { - "logicalId": "Lambda", + "logicalId": "MyConn", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::Serverless::Connector" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "propertyPath": "Properties/Source", + "category": "Structure", + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 9, + "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", "phase": "LINT" } ] }, - "bad/schema_structural.yaml": { - "filePath": "bad/schema_structural.yaml", + "bad/sam/function_autopublishalias_invalid_name.yaml": { + "filePath": "bad/sam/function_autopublishalias_invalid_name.yaml", "status": "OK", "metadata": { - "resourcesScanned": 4, + "resourcesScanned": 1, "counts": { - "fatal": 6, - "errors": 0, + "fatal": 0, + "errors": 1, "warnings": 0, - "informational": 10, + "informational": 0, "debug": 0 }, "suppressed": 0, @@ -12822,367 +12361,340 @@ }, "diagnostics": [ { - "ruleId": "F3014", - "severity": "FATAL", - "message": "Exactly one of ['ScalingTargetId', 'ResourceId'] must be specified", - "source": "SCHEMA", + "ruleId": "E0001", + "severity": "ERROR", + "message": "Error transforming template: Resource with id [Fn] is invalid. AutoPublishAlias name ('123') must contain only alphanumeric characters, hyphens, or underscores matching (?!^[0-9]+$)([a-zA-Z0-9-_]+) pattern.", + "source": "CFN_LINT", "entity": { - "logicalId": "ScalingPolicyBothIds", + "logicalId": "Fn", "entityType": "Resource", - "resourceType": "AWS::ApplicationAutoScaling::ScalingPolicy" + "resourceType": "AWS::Serverless::Function" }, "propertyPath": "Properties", - "category": "Schema", - "startLine": 25, + "category": "Structure", + "startLine": 5, "startColumn": 5, - "endLine": 25, + "endLine": 5, "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Exactly one of properties required (requiredXor)", - "phase": "SCHEMA" - }, - { - "ruleId": "F3020", - "severity": "FATAL", - "message": "'Statistic' should not be included with 'ExtendedStatistic'", - "source": "SCHEMA", - "entity": { - "logicalId": "AlarmBothStats", - "entityType": "Resource", - "resourceType": "AWS::CloudWatch::Alarm" - }, - "propertyPath": "Properties.Statistic", - "category": "Schema", - "startLine": 12, - "startColumn": 7, - "endLine": 12, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-cloudwatch.git", - "ruleDescription": "Mutually exclusive properties", - "phase": "SCHEMA", - "context": { - "property": "Statistic" - } + "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", + "phase": "LINT" + } + ] + }, + "bad/sam/function_capacityprovider_with_vpcconfig.yaml": { + "filePath": "bad/sam/function_capacityprovider_with_vpcconfig.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 1, + "warnings": 0, + "informational": 0, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "F3020", - "severity": "FATAL", - "message": "'ExtendedStatistic' should not be included with 'Statistic'", - "source": "SCHEMA", + "ruleId": "E0001", + "severity": "ERROR", + "message": "Error transforming template: Resource with id [Fn] is invalid. Cannot specify 'CapacityProviderConfig' and 'VpcConfig' together.", + "source": "CFN_LINT", "entity": { - "logicalId": "AlarmBothStats", + "logicalId": "Fn", "entityType": "Resource", - "resourceType": "AWS::CloudWatch::Alarm" + "resourceType": "AWS::Serverless::Function" }, - "propertyPath": "Properties.ExtendedStatistic", - "category": "Schema", - "startLine": 13, - "startColumn": 7, - "endLine": 13, - "endColumn": 24, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-cloudwatch.git", - "ruleDescription": "Mutually exclusive properties", - "phase": "SCHEMA", - "context": { - "property": "ExtendedStatistic" - } + "propertyPath": "Properties", + "category": "Structure", + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", + "phase": "LINT" + } + ] + }, + "bad/sam/function_deploymentpreference_without_alias.yaml": { + "filePath": "bad/sam/function_deploymentpreference_without_alias.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 1, + "warnings": 0, + "informational": 0, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "F3021", - "severity": "FATAL", - "message": "'ScalableDimension' is a dependency of 'ResourceId'", - "source": "SCHEMA", + "ruleId": "E0001", + "severity": "ERROR", + "message": "Error transforming template: Resource with id [Fn] is invalid. 'DeploymentPreference' requires AutoPublishAlias property to be specified.", + "source": "CFN_LINT", "entity": { - "logicalId": "ScalingPolicyMissingDeps", + "logicalId": "Fn", "entityType": "Resource", - "resourceType": "AWS::ApplicationAutoScaling::ScalingPolicy" + "resourceType": "AWS::Serverless::Function" }, "propertyPath": "Properties", - "suggestedFix": "Add 'ScalableDimension' when 'ResourceId' is specified", - "category": "Schema", - "startLine": 36, + "category": "Structure", + "startLine": 5, "startColumn": 5, - "endLine": 36, + "endLine": 5, "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Dependent property required", - "phase": "SCHEMA" + "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", + "phase": "LINT" + } + ] + }, + "bad/sam/function_dlq_invalid_type.yaml": { + "filePath": "bad/sam/function_dlq_invalid_type.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 1, + "warnings": 0, + "informational": 0, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "F3021", - "severity": "FATAL", - "message": "'ServiceNamespace' is a dependency of 'ResourceId'", - "source": "SCHEMA", + "ruleId": "E0001", + "severity": "ERROR", + "message": "Error transforming template: Resource with id [Fn] is invalid. 'DeadLetterQueue' requires Type of ['SQS', 'SNS']", + "source": "CFN_LINT", "entity": { - "logicalId": "ScalingPolicyMissingDeps", + "logicalId": "Fn", "entityType": "Resource", - "resourceType": "AWS::ApplicationAutoScaling::ScalingPolicy" + "resourceType": "AWS::Serverless::Function" }, "propertyPath": "Properties", - "suggestedFix": "Add 'ServiceNamespace' when 'ResourceId' is specified", - "category": "Schema", - "startLine": 36, + "category": "Structure", + "startLine": 5, "startColumn": 5, - "endLine": 36, + "endLine": 5, "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Dependent property required", - "phase": "SCHEMA" - }, - { - "ruleId": "F3058", - "severity": "FATAL", - "message": "One of ['CidrBlock', 'Ipv4IpamPoolId', 'Ipv6IpamPoolId', 'Ipv6CidrBlock'] is a required property", - "source": "SCHEMA", + "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", + "phase": "LINT" + } + ] + }, + "bad/sam/function_dlq_missing_targetarn.yaml": { + "filePath": "bad/sam/function_dlq_missing_targetarn.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 1, + "warnings": 0, + "informational": 0, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "E0001", + "severity": "ERROR", + "message": "Error transforming template: Resource with id [Fn] is invalid. 'DeadLetterQueue' requires Type and TargetArn properties to be specified.", + "source": "CFN_LINT", "entity": { - "logicalId": "SubnetNoCidr", + "logicalId": "Fn", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::Serverless::Function" }, "propertyPath": "Properties", - "category": "Schema", - "startLine": 19, + "category": "Structure", + "startLine": 5, "startColumn": 5, - "endLine": 19, + "endLine": 5, "endColumn": 15, - "ruleDescription": "One of properties required (requiredOr)", - "phase": "SCHEMA" - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "SubnetNoCidr", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.VpcId", - "category": "Best Practice", - "startLine": 20, - "startColumn": 7, - "endLine": 20, - "endColumn": 12, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", + "phase": "LINT" + } + ] + }, + "bad/sam/function_functionscaling_without_capacityprovider.yaml": { + "filePath": "bad/sam/function_functionscaling_without_capacityprovider.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 1, + "warnings": 0, + "informational": 0, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'PolicyName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E0001", + "severity": "ERROR", + "message": "Error transforming template: Resource with id [Fn] is invalid. 'FunctionScalingConfig' requires 'CapacityProviderConfig'.", + "source": "CFN_LINT", "entity": { - "logicalId": "ScalingPolicyBothIds", + "logicalId": "Fn", "entityType": "Resource", - "resourceType": "AWS::ApplicationAutoScaling::ScalingPolicy" + "resourceType": "AWS::Serverless::Function" }, - "propertyPath": "Properties.PolicyName", - "category": "Best Practice", - "startLine": 26, - "startColumn": 7, - "endLine": 26, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "propertyPath": "Properties", + "category": "Structure", + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", + "phase": "LINT" + } + ] + }, + "bad/sam/function_image_with_handler_runtime.yaml": { + "filePath": "bad/sam/function_image_with_handler_runtime.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 1, + "warnings": 0, + "informational": 0, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ScalingTargetId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E0001", + "severity": "ERROR", + "message": "Error transforming template: Resource with id [Fn] is invalid. Runtime, Handler, Layers cannot be present when PackageType is of type `Image`", + "source": "CFN_LINT", "entity": { - "logicalId": "ScalingPolicyBothIds", + "logicalId": "Fn", "entityType": "Resource", - "resourceType": "AWS::ApplicationAutoScaling::ScalingPolicy" + "resourceType": "AWS::Serverless::Function" }, - "propertyPath": "Properties.ScalingTargetId", - "category": "Best Practice", - "startLine": 28, - "startColumn": 7, - "endLine": 28, - "endColumn": 22, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "propertyPath": "Properties", + "category": "Structure", + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", + "phase": "LINT" + } + ] + }, + "bad/sam/function_packagetype_invalid.yaml": { + "filePath": "bad/sam/function_packagetype_invalid.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 1, + "warnings": 0, + "informational": 0, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ResourceId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E0001", + "severity": "ERROR", + "message": "Error transforming template: Resource with id [Fn] is invalid. invalid 'PackageType' : Banana", + "source": "CFN_LINT", "entity": { - "logicalId": "ScalingPolicyBothIds", + "logicalId": "Fn", "entityType": "Resource", - "resourceType": "AWS::ApplicationAutoScaling::ScalingPolicy" + "resourceType": "AWS::Serverless::Function" }, - "propertyPath": "Properties.ResourceId", - "category": "Best Practice", - "startLine": 29, - "startColumn": 7, - "endLine": 29, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "propertyPath": "Properties", + "category": "Structure", + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", + "phase": "LINT" + } + ] + }, + "bad/sam/function_provisioned_concurrency_without_alias.yaml": { + "filePath": "bad/sam/function_provisioned_concurrency_without_alias.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 1, + "warnings": 0, + "informational": 0, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ScalableDimension' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E0001", + "severity": "ERROR", + "message": "Error transforming template: Resource with id [Fn] is invalid. To set ProvisionedConcurrencyConfig AutoPublishALias must be defined on the function", + "source": "CFN_LINT", "entity": { - "logicalId": "ScalingPolicyBothIds", + "logicalId": "Fn", "entityType": "Resource", - "resourceType": "AWS::ApplicationAutoScaling::ScalingPolicy" + "resourceType": "AWS::Serverless::Function" }, - "propertyPath": "Properties.ScalableDimension", - "category": "Best Practice", - "startLine": 30, - "startColumn": 7, - "endLine": 30, - "endColumn": 24, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ServiceNamespace' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "ScalingPolicyBothIds", - "entityType": "Resource", - "resourceType": "AWS::ApplicationAutoScaling::ScalingPolicy" - }, - "propertyPath": "Properties.ServiceNamespace", - "category": "Best Practice", - "startLine": 31, - "startColumn": 7, - "endLine": 31, - "endColumn": 23, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'PolicyName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "ScalingPolicyMissingDeps", - "entityType": "Resource", - "resourceType": "AWS::ApplicationAutoScaling::ScalingPolicy" - }, - "propertyPath": "Properties.PolicyName", - "category": "Best Practice", - "startLine": 37, - "startColumn": 7, - "endLine": 37, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ResourceId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "ScalingPolicyMissingDeps", - "entityType": "Resource", - "resourceType": "AWS::ApplicationAutoScaling::ScalingPolicy" - }, - "propertyPath": "Properties.ResourceId", - "category": "Best Practice", - "startLine": 39, - "startColumn": 7, - "endLine": 39, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'AlarmBothStats' of type 'AWS::CloudWatch::Alarm' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "AlarmBothStats", - "entityType": "Resource", - "resourceType": "AWS::CloudWatch::Alarm" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 6, - "startColumn": 5, - "endLine": 6, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'SubnetNoCidr' of type 'AWS::EC2::Subnet' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "SubnetNoCidr", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 19, + "propertyPath": "Properties", + "category": "Structure", + "startLine": 5, "startColumn": 5, - "endLine": 19, + "endLine": 5, "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", "phase": "LINT" } ] }, - "bad/schema_type_mismatch.yaml": { - "filePath": "bad/schema_type_mismatch.yaml", + "bad/sam/function_url_config_missing_authtype.yaml": { + "filePath": "bad/sam/function_url_config_missing_authtype.yaml", "status": "OK", "metadata": { "resourcesScanned": 1, "counts": { "fatal": 0, - "errors": 0, - "warnings": 3, - "informational": 2, + "errors": 1, + "warnings": 0, + "informational": 0, "debug": 0 }, "suppressed": 0, @@ -13191,123 +12703,34 @@ }, "diagnostics": [ { - "ruleId": "W3030", - "severity": "WARN", - "message": "true is not one of ['Enabled', 'Suspended']", - "source": "CFN_LINT", - "entity": { - "logicalId": "Bucket", - "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" - }, - "propertyPath": "Properties.VersioningConfiguration.Status", - "category": "Schema", - "startLine": 8, - "startColumn": 9, - "endLine": 8, - "endColumn": 15, - "ruleDescription": "Value not in allowed enum", - "phase": "SCHEMA", - "context": { - "actualValue": true, - "extra": { - "allowed_values": [ - "Enabled", - "Suspended" - ] - } - } - }, - { - "ruleId": "W9003", - "severity": "WARN", - "message": "12345 is not of type 'string' - automatically coerced (number to string)", - "source": "CFN_LINT", - "entity": { - "logicalId": "Bucket", - "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" - }, - "propertyPath": "Properties.BucketName", - "category": "Best Practice", - "startLine": 6, - "startColumn": 7, - "endLine": 6, - "endColumn": 17, - "ruleDescription": "Property type coercion warning", - "phase": "SCHEMA" - }, - { - "ruleId": "W9003", - "severity": "WARN", - "message": "true is not of type 'string' - automatically coerced (boolean to string)", + "ruleId": "E0001", + "severity": "ERROR", + "message": "Error transforming template: Resource with id [Fn] is invalid. AuthType is required to configure function property `FunctionUrlConfig`. Please provide either AWS_IAM or NONE.", "source": "CFN_LINT", "entity": { - "logicalId": "Bucket", - "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" - }, - "propertyPath": "Properties.VersioningConfiguration.Status", - "category": "Best Practice", - "startLine": 8, - "startColumn": 9, - "endLine": 8, - "endColumn": 15, - "ruleDescription": "Property type coercion warning", - "phase": "SCHEMA" - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Bucket", - "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" - }, - "propertyPath": "Properties.BucketName", - "category": "Best Practice", - "startLine": 6, - "startColumn": 7, - "endLine": 6, - "endColumn": 17, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "Bucket", + "logicalId": "Fn", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::Serverless::Function" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", + "propertyPath": "Properties", + "category": "Structure", "startLine": 5, "startColumn": 5, "endLine": 5, "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", "phase": "LINT" } ] }, - "bad/schema_unique_items.yaml": { - "filePath": "bad/schema_unique_items.yaml", + "bad/sam/function_versiondeletionpolicy_without_alias.yaml": { + "filePath": "bad/sam/function_versiondeletionpolicy_without_alias.yaml", "status": "OK", "metadata": { "resourcesScanned": 1, "counts": { - "fatal": 2, - "errors": 0, + "fatal": 0, + "errors": 1, "warnings": 0, "informational": 0, "debug": 0 @@ -13318,68 +12741,36 @@ }, "diagnostics": [ { - "ruleId": "F3032", - "severity": "FATAL", - "message": "expected maximum item count: 1, found: 2", - "source": "SCHEMA", + "ruleId": "E0001", + "severity": "ERROR", + "message": "Error transforming template: Resource with id [Fn] is invalid. 'VersionDeletionPolicy' requires 'AutoPublishAlias'.", + "source": "CFN_LINT", "entity": { - "logicalId": "Profile", + "logicalId": "Fn", "entityType": "Resource", - "resourceType": "AWS::IAM::InstanceProfile" + "resourceType": "AWS::Serverless::Function" }, - "propertyPath": "Properties.Roles", - "category": "Schema", - "startLine": 6, - "startColumn": 7, - "endLine": 6, - "endColumn": 12, - "ruleDescription": "Array item count out of bounds", - "phase": "SCHEMA", - "context": { - "extra": { - "actual_count": 2, - "max_items": 1, - "min_items": 0 - } - } - }, - { - "ruleId": "F3037", - "severity": "FATAL", - "message": "Array items are not unique", - "source": "SCHEMA", - "entity": { - "logicalId": "Profile", - "entityType": "Resource", - "resourceType": "AWS::IAM::InstanceProfile" - }, - "propertyPath": "Properties.Roles", - "category": "Schema", - "startLine": 6, - "startColumn": 7, - "endLine": 6, - "endColumn": 12, - "ruleDescription": "Array items not unique", - "phase": "SCHEMA", - "context": { - "actualValue": [ - "arn:aws:iam::012345678901:role/SameRole", - "arn:aws:iam::012345678901:role/SameRole" - ] - } + "propertyPath": "Properties", + "category": "Structure", + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", + "phase": "LINT" } ] }, - "bad/schema_write_only.yaml": { - "filePath": "bad/schema_write_only.yaml", + "bad/sam/function_zip_missing_runtime_handler.yaml": { + "filePath": "bad/sam/function_zip_missing_runtime_handler.yaml", "status": "OK", "metadata": { "resourcesScanned": 1, "counts": { - "fatal": 1, - "errors": 0, - "warnings": 3, - "informational": 1, + "fatal": 0, + "errors": 1, + "warnings": 0, + "informational": 0, "debug": 0 }, "suppressed": 0, @@ -13388,118 +12779,107 @@ }, "diagnostics": [ { - "ruleId": "F6101", - "severity": "FATAL", - "message": "'Certificate' is not one of ['CompleteCertificateChain']", - "source": "SCHEMA", - "entity": { - "logicalId": "WriteOnlyOutput", - "entityType": "Output" - }, - "propertyPath": "Outputs/WriteOnlyOutput/Value.Fn::GetAtt.1", - "category": "Structure", - "startLine": 10, - "startColumn": 3, - "endLine": 10, - "endColumn": 18, - "ruleDescription": "Output value must be a string", - "phase": "SCHEMA" - }, - { - "ruleId": "W9002", - "severity": "WARN", - "message": "Property 'CertificateAuthorityArn' has a hardcoded ARN - use Ref, GetAtt, or a parameter instead", - "source": "ENGINE", + "ruleId": "E0001", + "severity": "ERROR", + "message": "Error transforming template: Resource with id [Fn] is invalid. Runtime and Handler needs to be present when PackageType is of type `Zip`", + "source": "CFN_LINT", "entity": { - "logicalId": "CertAuth", + "logicalId": "Fn", "entityType": "Resource", - "resourceType": "AWS::ACMPCA::CertificateAuthorityActivation" + "resourceType": "AWS::Serverless::Function" }, - "propertyPath": "Properties.CertificateAuthorityArn", - "category": "Best Practice", - "startLine": 7, - "startColumn": 7, - "endLine": 7, - "endColumn": 30, - "ruleDescription": "Hardcoded ARN property", + "propertyPath": "Properties", + "category": "Structure", + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", "phase": "LINT" + } + ] + }, + "bad/sam/function_zip_with_imageuri.yaml": { + "filePath": "bad/sam/function_zip_with_imageuri.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 1, + "warnings": 0, + "informational": 0, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "W9013", - "severity": "WARN", - "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", - "source": "ENGINE", + "ruleId": "E0001", + "severity": "ERROR", + "message": "Error transforming template: Resource with id [Fn] is invalid. ImageUri or ImageConfig cannot be present when PackageType is of type `Zip`", + "source": "CFN_LINT", "entity": { - "logicalId": "CertAuth", + "logicalId": "Fn", "entityType": "Resource", - "resourceType": "AWS::ACMPCA::CertificateAuthorityActivation" + "resourceType": "AWS::Serverless::Function" }, - "category": "Security", - "startLine": 4, - "startColumn": 3, - "endLine": 4, - "endColumn": 11, - "ruleDescription": "Hardcoded account ID in ARN", + "propertyPath": "Properties", + "category": "Structure", + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", "phase": "LINT" + } + ] + }, + "bad/sam/globals_not_dict.yaml": { + "filePath": "bad/sam/globals_not_dict.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 1, + "warnings": 0, + "informational": 0, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "W9054", - "severity": "WARN", - "message": "Write-only property 'Certificate' of 'CertAuth' is referenced in output 'WriteOnlyOutput'", - "source": "ENGINE", - "entity": { - "logicalId": "CertAuth", - "entityType": "Resource", - "resourceType": "AWS::ACMPCA::CertificateAuthorityActivation" - }, - "propertyPath": "Properties.Certificate", - "category": "Best Practice", - "startLine": 8, - "startColumn": 7, - "endLine": 8, - "endColumn": 18, - "documentationUrl": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/AWS_ACMPCA.html", - "ruleDescription": "Write-only property referenced in output", - "phase": "SCHEMA", - "context": { - "lifecycle": "write-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'CertificateAuthorityArn' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "CertAuth", - "entityType": "Resource", - "resourceType": "AWS::ACMPCA::CertificateAuthorityActivation" - }, - "propertyPath": "Properties.CertificateAuthorityArn", - "category": "Best Practice", - "startLine": 7, - "startColumn": 7, - "endLine": 7, - "endColumn": 30, - "documentationUrl": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/AWS_ACMPCA.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "ruleId": "E0001", + "severity": "ERROR", + "message": "Error transforming template: 'Globals' section is invalid. It must be a non-empty dictionary", + "source": "CFN_LINT", + "propertyPath": "Globals", + "category": "Structure", + "startLine": 2, + "startColumn": 1, + "endLine": 2, + "endColumn": 8, + "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", + "phase": "LINT" } ] }, - "bad/security_issues.yaml": { - "filePath": "bad/security_issues.yaml", + "bad/sam/globals_section_not_dict.yaml": { + "filePath": "bad/sam/globals_section_not_dict.yaml", "status": "OK", "metadata": { - "resourcesScanned": 2, + "resourcesScanned": 1, "counts": { - "fatal": 1, - "errors": 0, - "warnings": 1, - "informational": 2, + "fatal": 0, + "errors": 1, + "warnings": 0, + "informational": 0, "debug": 0 }, "suppressed": 0, @@ -13508,140 +12888,56 @@ }, "diagnostics": [ { - "ruleId": "F3017", - "severity": "FATAL", - "message": "Value is not valid under any of the 3 anyOf schemas for AWS::IAM::Policy (0 branches matched; at least one is required). Required property combinations: ['Groups'] or ['Roles'] or ['Users']. Branch failures: branch 1: 'Users' is a required property; branch 2: 'Groups' is a required property; branch 3: 'Roles' is a required property.", - "source": "SCHEMA", - "entity": { - "logicalId": "WildcardPolicy", - "entityType": "Resource", - "resourceType": "AWS::IAM::Policy" - }, - "propertyPath": "Properties", - "category": "Schema", - "startLine": 14, - "startColumn": 5, - "endLine": 14, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", - "ruleDescription": "Value not valid under anyOf", - "phase": "SCHEMA", - "context": { - "expectedConstraint": "at least one anyOf branch", - "extra": { - "branchCount": 3, - "branchFailures": [ - { - "branch": 1, - "reasons": [ - { - "message": "'Users' is a required property", - "propertyPath": "Properties" - } - ] - }, - { - "branch": 2, - "reasons": [ - { - "message": "'Groups' is a required property", - "propertyPath": "Properties" - } - ] - }, - { - "branch": 3, - "reasons": [ - { - "message": "'Roles' is a required property", - "propertyPath": "Properties" - } - ] - } - ], - "compositionKind": "anyOf", - "matchCount": 0, - "matchOutcome": "zeroMatches", - "validPropertyCombinations": [ - [ - "Groups" - ], - [ - "Roles" - ], - [ - "Users" - ] - ] - } - } - }, - { - "ruleId": "W2508", - "severity": "WARN", - "message": "Security group allows 0.0.0.0/0 access to sensitive port 22 (range 22-22)", - "source": "ENGINE", - "entity": { - "logicalId": "OpenSSH", - "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" - }, - "propertyPath": "Properties.SecurityGroupIngress", - "suggestedFix": "Restrict the CIDR range to specific IP addresses", - "category": "Security", - "startLine": 7, - "startColumn": 7, - "endLine": 7, - "endColumn": 27, - "ruleDescription": "Security group allows open access to sensitive port", + "ruleId": "E0001", + "severity": "ERROR", + "message": "Error transforming template: 'Globals' section is invalid. Value of ${section} must be a dictionary", + "source": "CFN_LINT", + "propertyPath": "Globals", + "category": "Structure", + "startLine": 2, + "startColumn": 1, + "endLine": 2, + "endColumn": 8, + "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", "phase": "LINT" + } + ] + }, + "bad/sam/globals_unknown_property.yaml": { + "filePath": "bad/sam/globals_unknown_property.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 1, + "warnings": 0, + "informational": 0, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "OpenSSH", - "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" - }, - "propertyPath": "Properties.GroupDescription", - "category": "Best Practice", - "startLine": 6, - "startColumn": 7, - "endLine": 6, - "endColumn": 23, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'OpenSSH' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "OpenSSH", - "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "ruleId": "E0001", + "severity": "ERROR", + "message": "Error transforming template: 'Globals' section is invalid. 'NotARealProperty' is not a supported property of 'Function'. Must be one of the following values - ['Handler', 'Runtime', 'CodeUri', 'DeadLetterQueue', 'Description', 'MemorySize', 'Timeout', 'VpcConfig', 'Environment', 'Tags', 'PropagateTags', 'Tracing', 'KmsKeyArn', 'AutoPublishAlias', 'AutoPublishAliasAllProperties', 'Layers', 'DeploymentPreference', 'RolePath', 'PermissionsBoundary', 'ReservedConcurrentExecutions', 'ProvisionedConcurrencyConfig', 'AssumeRolePolicyDocument', 'EventInvokeConfig', 'FileSystemConfigs', 'CodeSigningConfigArn', 'Architectures', 'SnapStart', 'EphemeralStorage', 'FunctionUrlConfig', 'RuntimeManagementConfig', 'LoggingConfig', 'RecursiveLoop', 'SourceKMSKeyArn', 'TenancyConfig', 'DurableConfig', 'CapacityProviderConfig', 'FunctionScalingConfig', 'PublishToLatestPublished', 'VersionDeletionPolicy']", + "source": "CFN_LINT", + "propertyPath": "Globals", + "category": "Structure", + "startLine": 2, + "startColumn": 1, + "endLine": 2, + "endColumn": 8, + "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", "phase": "LINT" } ] }, - "bad/sg_bad_port_range.yaml": { - "filePath": "bad/sg_bad_port_range.yaml", + "bad/sam/globals_unknown_section.yaml": { + "filePath": "bad/sam/globals_unknown_section.yaml", "status": "OK", "metadata": { "resourcesScanned": 1, @@ -13649,7 +12945,7 @@ "fatal": 0, "errors": 1, "warnings": 0, - "informational": 2, + "informational": 0, "debug": 0 }, "suppressed": 0, @@ -13658,89 +12954,31 @@ }, "diagnostics": [ { - "ruleId": "E9002", + "ruleId": "E0001", "severity": "ERROR", - "message": "FromPort 443 is greater than ToPort 80", - "source": "ENGINE", - "entity": { - "logicalId": "SG", - "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" - }, - "propertyPath": "Properties.SecurityGroupIngress.0", - "suggestedFix": "Set FromPort to a value less than or equal to ToPort", - "category": "Resource", - "startLine": 8, - "startColumn": 21, - "endLine": 8, - "endColumn": 22, - "ruleDescription": "SecurityGroup FromPort must be <= ToPort for the TCP and UDP protocols", - "phase": "LINT", - "context": { - "actualValue": [ - { - "IpProtocol": "tcp", - "FromPort": 443, - "ToPort": 80, - "CidrIp": "10.0.0.0/8" - } - ] - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "SG", - "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" - }, - "propertyPath": "Properties.GroupDescription", - "category": "Best Practice", - "startLine": 6, - "startColumn": 7, - "endLine": 6, - "endColumn": 23, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'SG' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "SG", - "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "message": "Error transforming template: 'Globals' section is invalid. 'Foo' is not supported. Must be one of the following values - ['Api', 'CapacityProvider', 'Function', 'HttpApi', 'LayerVersion', 'MicrovmImage', 'NetworkConnector', 'SimpleTable', 'StateMachine', 'WebSocketApi']", + "source": "CFN_LINT", + "propertyPath": "Globals", + "category": "Structure", + "startLine": 2, + "startColumn": 1, + "endLine": 2, + "endColumn": 8, + "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", "phase": "LINT" } ] }, - "bad/sg_open_egress.yaml": { - "filePath": "bad/sg_open_egress.yaml", + "bad/sam/graphqlapi_missing_auth.yaml": { + "filePath": "bad/sam/graphqlapi_missing_auth.yaml", "status": "OK", "metadata": { "resourcesScanned": 1, "counts": { - "fatal": 1, - "errors": 0, + "fatal": 0, + "errors": 1, "warnings": 0, - "informational": 2, + "informational": 0, "debug": 0 }, "suppressed": 0, @@ -13749,79 +12987,112 @@ }, "diagnostics": [ { - "ruleId": "F3021", - "severity": "FATAL", - "message": "'VpcId' is a dependency of 'SecurityGroupEgress'", - "source": "SCHEMA", + "ruleId": "E0001", + "severity": "ERROR", + "message": "Error transforming template: Resource with id [MyApi] is invalid. Missing required property 'Auth'.", + "source": "CFN_LINT", "entity": { - "logicalId": "OpenSG", + "logicalId": "MyApi", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::Serverless::GraphQLApi" }, - "propertyPath": "Properties", - "suggestedFix": "Add 'VpcId' when 'SecurityGroupEgress' is specified", - "category": "Schema", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "Dependent property required", - "phase": "SCHEMA" + "propertyPath": "Properties/Auth", + "category": "Structure", + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 8, + "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", + "phase": "LINT" + } + ] + }, + "bad/sam/layerversion_invalid_compatible_architectures.yaml": { + "filePath": "bad/sam/layerversion_invalid_compatible_architectures.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 1, + "warnings": 0, + "informational": 0, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E0001", + "severity": "ERROR", + "message": "Error transforming template: Resource with id [Layer] is invalid. CompatibleArchitectures needs to be a list of 'x86_64' or 'arm64'", + "source": "CFN_LINT", "entity": { - "logicalId": "OpenSG", + "logicalId": "Layer", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::Serverless::LayerVersion" }, - "propertyPath": "Properties.GroupDescription", - "category": "Best Practice", - "startLine": 6, - "startColumn": 7, - "endLine": 6, - "endColumn": 23, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "propertyPath": "Properties", + "category": "Structure", + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", + "phase": "LINT" + } + ] + }, + "bad/sam/layerversion_invalid_retention_policy.yaml": { + "filePath": "bad/sam/layerversion_invalid_retention_policy.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 1, + "warnings": 0, + "informational": 0, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'OpenSG' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "E0001", + "severity": "ERROR", + "message": "Error transforming template: Resource with id [Layer] is invalid. 'RetentionPolicy' must be one of the following options: ['Retain', 'Delete'].", + "source": "CFN_LINT", "entity": { - "logicalId": "OpenSG", + "logicalId": "Layer", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::Serverless::LayerVersion" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", + "propertyPath": "Properties", + "category": "Structure", "startLine": 5, "startColumn": 5, "endLine": 5, "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", "phase": "LINT" } ] }, - "bad/simple_sub_param.yaml": { - "filePath": "bad/simple_sub_param.yaml", + "bad/sam/simpletable_primarykey_invalid_type.yaml": { + "filePath": "bad/sam/simpletable_primarykey_invalid_type.yaml", "status": "OK", "metadata": { "resourcesScanned": 1, "counts": { "fatal": 0, - "errors": 0, + "errors": 1, "warnings": 0, - "informational": 2, + "informational": 0, "debug": 0 }, "suppressed": 0, @@ -13830,60 +13101,36 @@ }, "diagnostics": [ { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E0001", + "severity": "ERROR", + "message": "Error transforming template: Resource with id [MyTable] is invalid. Invalid 'Type' \"Banana\".", + "source": "CFN_LINT", "entity": { - "logicalId": "Bucket", + "logicalId": "MyTable", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::Serverless::SimpleTable" }, - "propertyPath": "Properties.BucketName", - "category": "Best Practice", - "startLine": 9, + "propertyPath": "Properties/PrimaryKey", + "category": "Structure", + "startLine": 6, "startColumn": 7, - "endLine": 9, + "endLine": 6, "endColumn": 17, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "dynamic (Sub:${Env})" - } - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "Bucket", - "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 8, - "startColumn": 5, - "endLine": 8, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", "phase": "LINT" } ] }, - "bad/sns_cross_account.yaml": { - "filePath": "bad/sns_cross_account.yaml", + "bad/sam/simpletable_primarykey_missing_type.yaml": { + "filePath": "bad/sam/simpletable_primarykey_missing_type.yaml", "status": "OK", "metadata": { - "resourcesScanned": 2, + "resourcesScanned": 1, "counts": { "fatal": 0, - "errors": 0, + "errors": 1, "warnings": 0, - "informational": 2, + "informational": 0, "debug": 0 }, "suppressed": 0, @@ -13892,60 +13139,74 @@ }, "diagnostics": [ { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'TopicName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E0001", + "severity": "ERROR", + "message": "Error transforming template: Resource with id [MyTable] is invalid. Property 'PrimaryKey.Type' is required.", + "source": "CFN_LINT", "entity": { - "logicalId": "Topic", + "logicalId": "MyTable", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::Serverless::SimpleTable" }, - "propertyPath": "Properties.TopicName", - "category": "Best Practice", + "propertyPath": "Properties/PrimaryKey", + "category": "Structure", "startLine": 6, "startColumn": 7, "endLine": 6, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sns", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "endColumn": 17, + "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", + "phase": "LINT" + } + ] + }, + "bad/sam/statemachine_both_definitions.yaml": { + "filePath": "bad/sam/statemachine_both_definitions.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 1, + "warnings": 0, + "informational": 0, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Topic' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "E0001", + "severity": "ERROR", + "message": "Error transforming template: Resource with id [MySM] is invalid. Specify either 'Definition' or 'DefinitionUri' property and not both.", + "source": "CFN_LINT", "entity": { - "logicalId": "Topic", + "logicalId": "MySM", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::Serverless::StateMachine" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", + "propertyPath": "Properties", + "category": "Structure", "startLine": 5, "startColumn": 5, "endLine": 5, "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", "phase": "LINT" } ] }, - "bad/some_logs_stream_lambda.yaml": { - "filePath": "bad/some_logs_stream_lambda.yaml", + "bad/sam/statemachine_no_definition.yaml": { + "filePath": "bad/sam/statemachine_no_definition.yaml", "status": "OK", "metadata": { - "resourcesScanned": 8, + "resourcesScanned": 1, "counts": { "fatal": 0, - "errors": 4, + "errors": 1, "warnings": 0, - "informational": 20, + "informational": 0, "debug": 0 }, "suppressed": 0, @@ -13954,473 +13215,573 @@ }, "diagnostics": [ { - "ruleId": "E2533", + "ruleId": "E0001", "severity": "ERROR", - "message": "Runtime 'python3.6' was deprecated on '2022-07-18'. Creation was disabled on '2022-07-18', and updates were disabled on '2022-08-29'. Please consider updating to 'python3.14'", + "message": "Error transforming template: Resource with id [MySM] is invalid. Either 'Definition' or 'DefinitionUri' property must be specified.", "source": "CFN_LINT", "entity": { - "logicalId": "FunctionA", + "logicalId": "MySM", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::Serverless::StateMachine" }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 21, - "startColumn": 7, - "endLine": 21, - "endColumn": 14, - "ruleDescription": "Check if Lambda Function Runtimes are updatable", - "phase": "SCHEMA", - "context": { - "actualValue": "python3.6", - "lifecycle": "end-of-life" - } - }, - { - "ruleId": "E2533", - "severity": "ERROR", - "message": "Runtime 'python3.6' was deprecated on '2022-07-18'. Creation was disabled on '2022-07-18', and updates were disabled on '2022-08-29'. Please consider updating to 'python3.14'", - "source": "CFN_LINT", - "entity": { - "logicalId": "FunctionB", - "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" - }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 33, - "startColumn": 7, - "endLine": 33, - "endColumn": 14, - "ruleDescription": "Check if Lambda Function Runtimes are updatable", - "phase": "SCHEMA", - "context": { - "actualValue": "python3.6", - "lifecycle": "end-of-life" - } - }, - { - "ruleId": "E2533", - "severity": "ERROR", - "message": "Runtime 'python3.6' was deprecated on '2022-07-18'. Creation was disabled on '2022-07-18', and updates were disabled on '2022-08-29'. Please consider updating to 'python3.14'", - "source": "CFN_LINT", - "entity": { - "logicalId": "FunctionC", - "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" - }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 44, - "startColumn": 7, - "endLine": 44, - "endColumn": 14, - "ruleDescription": "Check if Lambda Function Runtimes are updatable", - "phase": "SCHEMA", - "context": { - "actualValue": "python3.6", - "lifecycle": "end-of-life" - } + "propertyPath": "Properties", + "category": "Structure", + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", + "phase": "LINT" + } + ] + }, + "bad/sam/transform_bogus_name.yaml": { + "filePath": "bad/sam/transform_bogus_name.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 1, + "warnings": 0, + "informational": 1, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "E2533", + "ruleId": "E3038", "severity": "ERROR", - "message": "Runtime 'python3.6' was deprecated on '2022-07-18'. Creation was disabled on '2022-07-18', and updates were disabled on '2022-08-29'. Please consider updating to 'python3.14'", + "message": "Resource type 'AWS::Serverless::Function' requires the AWS::Serverless-2016-10-31 transform", "source": "CFN_LINT", "entity": { - "logicalId": "LogSubscriptionFunction", + "logicalId": "MyFn", "entityType": "Resource", "resourceType": "AWS::Serverless::Function" }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 56, - "startColumn": 7, - "endLine": 56, - "endColumn": 14, - "ruleDescription": "Check if Lambda Function Runtimes are updatable", - "phase": "SCHEMA", - "context": { - "actualValue": "python3.6", - "lifecycle": "end-of-life" - } - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "FunctionALogGroup", - "entityType": "Resource", - "resourceType": "AWS::Logs::LogGroup" - }, - "category": "Best Practice", - "startLine": 22, - "startColumn": 3, - "endLine": 22, - "endColumn": 20, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "FunctionALogGroup", - "entityType": "Resource", - "resourceType": "AWS::Logs::LogGroup" - }, - "category": "Best Practice", - "startLine": 22, + "category": "Structure", + "startLine": 3, "startColumn": 3, - "endLine": 22, - "endColumn": 20, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "endLine": 3, + "endColumn": 7, + "ruleDescription": "Check if Serverless Resources have Serverless Transform", "phase": "LINT" }, { - "ruleId": "I3011", + "ruleId": "I9040", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Resource 'MyFn' of type 'AWS::Serverless::Function' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "FunctionBLogGroup", + "logicalId": "MyFn", "entityType": "Resource", - "resourceType": "AWS::Logs::LogGroup" + "resourceType": "AWS::Serverless::Function" }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 34, - "startColumn": 3, - "endLine": 34, - "endColumn": 20, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "bad/sam/transform_wrong_date.yaml": { + "filePath": "bad/sam/transform_wrong_date.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 1, + "warnings": 0, + "informational": 1, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "ruleId": "E3038", + "severity": "ERROR", + "message": "Resource type 'AWS::Serverless::Function' requires the AWS::Serverless-2016-10-31 transform", "source": "CFN_LINT", "entity": { - "logicalId": "FunctionBLogGroup", + "logicalId": "MyFn", "entityType": "Resource", - "resourceType": "AWS::Logs::LogGroup" + "resourceType": "AWS::Serverless::Function" }, - "category": "Best Practice", - "startLine": 34, + "category": "Structure", + "startLine": 3, "startColumn": 3, - "endLine": 34, - "endColumn": 20, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "endLine": 3, + "endColumn": 7, + "ruleDescription": "Check if Serverless Resources have Serverless Transform", "phase": "LINT" }, { - "ruleId": "I3011", + "ruleId": "I9040", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Resource 'MyFn' of type 'AWS::Serverless::Function' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "FunctionCLogGroup", + "logicalId": "MyFn", "entityType": "Resource", - "resourceType": "AWS::Logs::LogGroup" + "resourceType": "AWS::Serverless::Function" }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 45, - "startColumn": 3, - "endLine": 45, - "endColumn": 20, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "bad/schema_additional_props.yaml": { + "filePath": "bad/schema_additional_props.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 2, + "errors": 0, + "warnings": 0, + "informational": 2, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "ruleId": "F3002", + "severity": "FATAL", + "message": "Additional properties are not allowed ('NotARealProperty' was unexpected)", + "source": "SCHEMA", "entity": { - "logicalId": "FunctionCLogGroup", + "logicalId": "Bucket", "entityType": "Resource", - "resourceType": "AWS::Logs::LogGroup" + "resourceType": "AWS::S3::Bucket" }, - "category": "Best Practice", - "startLine": 45, - "startColumn": 3, - "endLine": 45, - "endColumn": 20, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "LogSubscriptionFunctionLogGroup", - "entityType": "Resource", - "resourceType": "AWS::Logs::LogGroup" - }, - "category": "Best Practice", - "startLine": 78, - "startColumn": 3, - "endLine": 78, - "endColumn": 34, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "LogSubscriptionFunctionLogGroup", - "entityType": "Resource", - "resourceType": "AWS::Logs::LogGroup" - }, - "category": "Best Practice", - "startLine": 78, - "startColumn": 3, - "endLine": 78, - "endColumn": 34, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'LogGroupName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "FunctionALogGroup", - "entityType": "Resource", - "resourceType": "AWS::Logs::LogGroup" - }, - "propertyPath": "Properties.LogGroupName", - "category": "Best Practice", - "startLine": 25, - "startColumn": 7, - "endLine": 25, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-logs.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "dynamic (Sub:/aws/lambda/${FunctionA})" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'LogGroupName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "FunctionBLogGroup", - "entityType": "Resource", - "resourceType": "AWS::Logs::LogGroup" - }, - "propertyPath": "Properties.LogGroupName", - "category": "Best Practice", - "startLine": 37, + "propertyPath": "Properties.NotARealProperty", + "category": "Schema", + "startLine": 7, "startColumn": 7, - "endLine": 37, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-logs.git", - "ruleDescription": "Create-only property updated triggers resource replacement", + "endLine": 7, + "endColumn": 23, + "ruleDescription": "Additional properties are not allowed", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "dynamic (Sub:/aws/lambda/${FunctionB})" + "property": "NotARealProperty", + "extra": { + "allowed_properties": [ + "AbacStatus", + "AccelerateConfiguration", + "AccessControl", + "AnalyticsConfigurations", + "Arn", + "BucketEncryption", + "BucketName", + "BucketNamePrefix", + "BucketNamespace", + "CorsConfiguration", + "DomainName", + "DualStackDomainName", + "IntelligentTieringConfigurations", + "InventoryConfigurations", + "LifecycleConfiguration", + "LoggingConfiguration", + "MetadataConfiguration", + "MetadataTableConfiguration", + "MetricsConfigurations", + "NotificationConfiguration", + "ObjectLockConfiguration", + "ObjectLockEnabled", + "OwnershipControls", + "PublicAccessBlockConfiguration", + "RegionalDomainName", + "ReplicationConfiguration", + "Tags", + "VersioningConfiguration", + "WebsiteConfiguration", + "WebsiteURL" + ] + } } }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'LogGroupName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "F3002", + "severity": "FATAL", + "message": "Additional properties are not allowed ('BukcetName' was unexpected)", + "source": "SCHEMA", "entity": { - "logicalId": "FunctionCLogGroup", + "logicalId": "Bucket", "entityType": "Resource", - "resourceType": "AWS::Logs::LogGroup" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.LogGroupName", - "category": "Best Practice", - "startLine": 48, + "propertyPath": "Properties.BukcetName", + "category": "Schema", + "startLine": 8, "startColumn": 7, - "endLine": 48, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-logs.git", - "ruleDescription": "Create-only property updated triggers resource replacement", + "endLine": 8, + "endColumn": 17, + "ruleDescription": "Additional properties are not allowed", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "dynamic (Sub:/aws/lambda/${FunctionC})" + "property": "BukcetName", + "extra": { + "allowed_properties": [ + "AbacStatus", + "AccelerateConfiguration", + "AccessControl", + "AnalyticsConfigurations", + "Arn", + "BucketEncryption", + "BucketName", + "BucketNamePrefix", + "BucketNamespace", + "CorsConfiguration", + "DomainName", + "DualStackDomainName", + "IntelligentTieringConfigurations", + "InventoryConfigurations", + "LifecycleConfiguration", + "LoggingConfiguration", + "MetadataConfiguration", + "MetadataTableConfiguration", + "MetricsConfigurations", + "NotificationConfiguration", + "ObjectLockConfiguration", + "ObjectLockEnabled", + "OwnershipControls", + "PublicAccessBlockConfiguration", + "RegionalDomainName", + "ReplicationConfiguration", + "Tags", + "VersioningConfiguration", + "WebsiteConfiguration", + "WebsiteURL" + ] + } } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'LogGroupName' is create-only; updating it will cause resource replacement", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "LogSubscriptionFunctionLogGroup", + "logicalId": "Bucket", "entityType": "Resource", - "resourceType": "AWS::Logs::LogGroup" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.LogGroupName", + "propertyPath": "Properties.BucketName", "category": "Best Practice", - "startLine": 81, + "startLine": 6, "startColumn": 7, - "endLine": 81, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-logs.git", + "endLine": 6, + "endColumn": 17, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "dynamic (Sub:/aws/lambda/${LogSubscriptionFunction})" + "lifecycle": "create-only" } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'FunctionA' of type 'AWS::Serverless::Function' supports Tags but none are configured", + "message": "Resource 'Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "FunctionA", + "logicalId": "Bucket", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::S3::Bucket" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 18, + "startLine": 5, "startColumn": 5, - "endLine": 18, + "endLine": 5, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "bad/schema_composition.yaml": { + "filePath": "bad/schema_composition.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 2, + "counts": { + "fatal": 2, + "errors": 0, + "warnings": 0, + "informational": 5, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'FunctionALogGroup' of type 'AWS::Logs::LogGroup' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "F3017", + "severity": "FATAL", + "message": "Value is not valid under any of the 5 anyOf schemas for AWS::EC2::Volume (0 branches matched; at least one is required). Required property combinations: ['AvailabilityZone', 'Size'] or ['AvailabilityZone', 'SnapshotId'] or ['AvailabilityZoneId', 'Size'] or ['AvailabilityZoneId', 'SnapshotId'] or ['SourceVolumeId']. Branch failures: branch 1: 'AvailabilityZone' is a required property, 'Size' is a required property; branch 2: 'AvailabilityZone' is a required property, 'SnapshotId' is a required property; branch 3: 'AvailabilityZoneId' is a required property, 'Size' is a required property; branch 4: 'AvailabilityZoneId' is a required property, 'SnapshotId' is a required property; branch 5: 'SourceVolumeId' is a required property.", + "source": "SCHEMA", "entity": { - "logicalId": "FunctionALogGroup", + "logicalId": "NoAZ", "entityType": "Resource", - "resourceType": "AWS::Logs::LogGroup" + "resourceType": "AWS::EC2::Volume" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 24, + "propertyPath": "Properties", + "category": "Schema", + "startLine": 13, "startColumn": 5, - "endLine": 24, + "endLine": 13, "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'FunctionB' of type 'AWS::Serverless::Function' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "FunctionB", - "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Value not valid under anyOf", + "phase": "SCHEMA", + "context": { + "expectedConstraint": "at least one anyOf branch", + "extra": { + "branchCount": 5, + "branchFailures": [ + { + "branch": 1, + "reasons": [ + { + "message": "'AvailabilityZone' is a required property", + "propertyPath": "Properties" + }, + { + "message": "'Size' is a required property", + "propertyPath": "Properties" + } + ] + }, + { + "branch": 2, + "reasons": [ + { + "message": "'AvailabilityZone' is a required property", + "propertyPath": "Properties" + }, + { + "message": "'SnapshotId' is a required property", + "propertyPath": "Properties" + } + ] + }, + { + "branch": 3, + "reasons": [ + { + "message": "'AvailabilityZoneId' is a required property", + "propertyPath": "Properties" + }, + { + "message": "'Size' is a required property", + "propertyPath": "Properties" + } + ] + }, + { + "branch": 4, + "reasons": [ + { + "message": "'AvailabilityZoneId' is a required property", + "propertyPath": "Properties" + }, + { + "message": "'SnapshotId' is a required property", + "propertyPath": "Properties" + } + ] + }, + { + "branch": 5, + "reasons": [ + { + "message": "'SourceVolumeId' is a required property", + "propertyPath": "Properties" + } + ] + } + ], + "compositionKind": "anyOf", + "matchCount": 0, + "matchOutcome": "zeroMatches", + "validPropertyCombinations": [ + [ + "AvailabilityZone", + "Size" + ], + [ + "AvailabilityZone", + "SnapshotId" + ], + [ + "AvailabilityZoneId", + "Size" + ], + [ + "AvailabilityZoneId", + "SnapshotId" + ], + [ + "SourceVolumeId" + ] + ] + } + } + }, + { + "ruleId": "F3018", + "severity": "FATAL", + "message": "Value is not valid under any of the 2 oneOf schemas for AWS::AppStream::ImageBuilder (0 branches matched; exactly one is required). Required property combinations: ['ImageArn'] or ['ImageName']. Branch failures: branch 1: 'ImageName' is a required property; branch 2: 'ImageArn' is a required property.", + "source": "SCHEMA", + "entity": { + "logicalId": "NoImage", + "entityType": "Resource", + "resourceType": "AWS::AppStream::ImageBuilder" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 30, + "propertyPath": "Properties", + "category": "Schema", + "startLine": 6, "startColumn": 5, - "endLine": 30, + "endLine": 6, "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "ruleDescription": "Value not valid under oneOf", + "phase": "SCHEMA", + "context": { + "expectedConstraint": "exactly one oneOf branch", + "extra": { + "branchCount": 2, + "branchFailures": [ + { + "branch": 1, + "reasons": [ + { + "message": "'ImageName' is a required property", + "propertyPath": "Properties" + } + ] + }, + { + "branch": 2, + "reasons": [ + { + "message": "'ImageArn' is a required property", + "propertyPath": "Properties" + } + ] + } + ], + "compositionKind": "oneOf", + "matchCount": 0, + "matchOutcome": "zeroMatches", + "validPropertyCombinations": [ + [ + "ImageArn" + ], + [ + "ImageName" + ] + ] + } + } }, { - "ruleId": "I9040", + "ruleId": "I3011", "severity": "INFO", - "message": "Resource 'FunctionBLogGroup' of type 'AWS::Logs::LogGroup' supports Tags but none are configured", - "source": "ENGINE", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "FunctionBLogGroup", + "logicalId": "NoAZ", "entityType": "Resource", - "resourceType": "AWS::Logs::LogGroup" + "resourceType": "AWS::EC2::Volume" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 36, - "startColumn": 5, - "endLine": 36, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "startLine": 11, + "startColumn": 3, + "endLine": 11, + "endColumn": 7, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "I9040", + "ruleId": "I3011", "severity": "INFO", - "message": "Resource 'FunctionC' of type 'AWS::Serverless::Function' supports Tags but none are configured", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "FunctionC", + "logicalId": "NoAZ", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::EC2::Volume" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 41, - "startColumn": 5, - "endLine": 41, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "startLine": 11, + "startColumn": 3, + "endLine": 11, + "endColumn": 7, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'FunctionCLogGroup' of type 'AWS::Logs::LogGroup' supports Tags but none are configured", + "message": "Property 'Name' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FunctionCLogGroup", + "logicalId": "NoImage", "entityType": "Resource", - "resourceType": "AWS::Logs::LogGroup" + "resourceType": "AWS::AppStream::ImageBuilder" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.Name", "category": "Best Practice", - "startLine": 47, - "startColumn": 5, - "endLine": 47, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 8, + "startColumn": 7, + "endLine": 8, + "endColumn": 11, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'LogSubscriptionFunction' of type 'AWS::Serverless::Function' supports Tags but none are configured", + "message": "Resource 'NoImage' of type 'AWS::AppStream::ImageBuilder' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "LogSubscriptionFunction", + "logicalId": "NoImage", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::AppStream::ImageBuilder" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 53, + "startLine": 6, "startColumn": 5, - "endLine": 53, + "endLine": 6, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -14428,181 +13789,222 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'LogSubscriptionFunctionLogGroup' of type 'AWS::Logs::LogGroup' supports Tags but none are configured", + "message": "Resource 'NoAZ' of type 'AWS::EC2::Volume' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "LogSubscriptionFunctionLogGroup", + "logicalId": "NoAZ", "entityType": "Resource", - "resourceType": "AWS::Logs::LogGroup" + "resourceType": "AWS::EC2::Volume" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 80, + "startLine": 13, "startColumn": 5, - "endLine": 80, + "endLine": 13, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "bad/sqs_fifo_no_suffix.yaml": { - "filePath": "bad/sqs_fifo_no_suffix.yaml", + "bad/schema_conditional_type.yaml": { + "filePath": "bad/schema_conditional_type.yaml", "status": "OK", "metadata": { "resourcesScanned": 1, "counts": { "fatal": 0, - "errors": 2, - "warnings": 0, - "informational": 6, - "debug": 0 - }, + "errors": 0, + "warnings": 1, + "informational": 2, + "debug": 0 + }, "suppressed": 0, "strict": false, "severityLevel": "DEBUG" }, "diagnostics": [ { - "ruleId": "E2504", - "severity": "ERROR", - "message": "FIFO queue name 'my-queue' must end with '.fifo'", - "source": "ENGINE", - "entity": { - "logicalId": "FifoQueue", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "propertyPath": "Properties.QueueName", - "category": "Resource", - "startLine": 6, - "startColumn": 7, - "endLine": 6, - "endColumn": 16, - "ruleDescription": "FIFO queue name must end with .fifo", - "phase": "LINT" - }, - { - "ruleId": "E3501", - "severity": "ERROR", - "message": "FIFO queue name 'my-queue' must end with '.fifo'", + "ruleId": "W9003", + "severity": "WARN", + "message": "12345 (from Fn::If on condition 'IsProd') is not of type 'string' - automatically coerced (number to string)", "source": "CFN_LINT", "entity": { - "logicalId": "FifoQueue", + "logicalId": "Bucket", "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.QueueName", - "suggestedFix": "Append .fifo to the queue name", - "category": "Resource", - "startLine": 6, + "propertyPath": "Properties.BucketName", + "category": "Best Practice", + "startLine": 12, "startColumn": 7, - "endLine": 6, - "endColumn": 16, - "ruleDescription": "Validate SQS queue properties are valid", - "phase": "LINT", + "endLine": 12, + "endColumn": 17, + "conditionScenario": { + "IsProd": true + }, + "ruleDescription": "Property type coercion warning", + "phase": "SCHEMA", "context": { - "extra": { - "queue_name": "my-queue" - } + "resolutionSource": "Fn::If on condition 'IsProd'" } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "FifoQueue", + "logicalId": "Bucket", "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" + "resourceType": "AWS::S3::Bucket" }, + "propertyPath": "Properties.BucketName", "category": "Best Practice", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 12, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 12, + "startColumn": 7, + "endLine": 12, + "endColumn": 17, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Fn::If on condition 'IsProd'" + } }, { - "ruleId": "I3011", + "ruleId": "I9040", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Resource 'Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "FifoQueue", + "logicalId": "Bucket", "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" + "resourceType": "AWS::S3::Bucket" }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 12, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "startLine": 11, + "startColumn": 5, + "endLine": 11, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "bad/schema_enum_violation.yaml": { + "filePath": "bad/schema_enum_violation.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 1, + "warnings": 2, + "informational": 2, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I3013", - "severity": "INFO", - "message": "'MessageRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "ruleId": "E3045", + "severity": "ERROR", + "message": "A bucket with 'AccessControl' set should also have at least one 'OwnershipControl' configured", "source": "CFN_LINT", "entity": { - "logicalId": "FifoQueue", + "logicalId": "Bucket", "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" + "resourceType": "AWS::S3::Bucket" }, "propertyPath": "Properties", - "category": "Best Practice", + "suggestedFix": "Add OwnershipControls to the bucket when using AccessControl", + "category": "Resource", "startLine": 5, "startColumn": 5, "endLine": 5, "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "ruleDescription": "Validate AccessControl are set with OwnershipControls", "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'QueueName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W3030", + "severity": "WARN", + "message": "'InvalidAccessControl' is not one of ['AuthenticatedRead', 'AwsExecRead', 'BucketOwnerFullControl', 'BucketOwnerRead', 'LogDeliveryWrite', 'Private', 'PublicRead', 'PublicReadWrite']", + "source": "CFN_LINT", "entity": { - "logicalId": "FifoQueue", + "logicalId": "Bucket", "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.QueueName", - "category": "Best Practice", - "startLine": 6, + "propertyPath": "Properties.AccessControl", + "category": "Schema", + "startLine": 7, "startColumn": 7, - "endLine": 6, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sqs.git", - "ruleDescription": "Create-only property updated triggers resource replacement", + "endLine": 7, + "endColumn": 20, + "ruleDescription": "Value not in allowed enum", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "actualValue": "InvalidAccessControl", + "extra": { + "allowed_values": [ + "AuthenticatedRead", + "AwsExecRead", + "BucketOwnerFullControl", + "BucketOwnerRead", + "LogDeliveryWrite", + "Private", + "PublicRead", + "PublicReadWrite" + ] + } + } + }, + { + "ruleId": "W3045", + "severity": "WARN", + "message": "AccessControl property is deprecated. Use bucket policies instead", + "source": "CFN_LINT", + "entity": { + "logicalId": "Bucket", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" + }, + "propertyPath": "Properties.AccessControl", + "suggestedFix": "Remove AccessControl and use an AWS::S3::BucketPolicy resource", + "category": "Deprecation", + "startLine": 7, + "startColumn": 7, + "endLine": 7, + "endColumn": 20, + "ruleDescription": "Controlling access to an S3 bucket should be done with bucket policies", + "phase": "LINT", + "context": { + "actualValue": "InvalidAccessControl" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'FifoQueue' is create-only; updating it will cause resource replacement", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FifoQueue", + "logicalId": "Bucket", "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.FifoQueue", + "propertyPath": "Properties.BucketName", "category": "Best Practice", - "startLine": 7, + "startLine": 6, "startColumn": 7, - "endLine": 7, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sqs.git", + "endLine": 6, + "endColumn": 17, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -14612,12 +14014,12 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'FifoQueue' of type 'AWS::SQS::Queue' supports Tags but none are configured", + "message": "Resource 'Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "FifoQueue", + "logicalId": "Bucket", "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" + "resourceType": "AWS::S3::Bucket" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", @@ -14631,16 +14033,16 @@ } ] }, - "bad/sqs_fifo_standard_dlq.yaml": { - "filePath": "bad/sqs_fifo_standard_dlq.yaml", + "bad/schema_format_violation.yaml": { + "filePath": "bad/schema_format_violation.yaml", "status": "OK", "metadata": { - "resourcesScanned": 2, + "resourcesScanned": 1, "counts": { "fatal": 0, "errors": 1, - "warnings": 0, - "informational": 11, + "warnings": 1, + "informational": 4, "debug": 0 }, "suppressed": 0, @@ -14649,151 +14051,64 @@ }, "diagnostics": [ { - "ruleId": "E3502", + "ruleId": "E1154", "severity": "ERROR", - "message": "Source queue type 'FIFO' does not match destination queue type 'standard'", + "message": "'subnet-bad' does not match format 'AWS::EC2::Subnet.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "MainQueue", + "logicalId": "Instance", "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.RedrivePolicy", - "category": "Resource", - "startLine": 12, + "propertyPath": "Properties.SubnetId", + "category": "Intrinsic Function", + "startLine": 7, "startColumn": 7, - "endLine": 12, - "endColumn": 20, - "ruleDescription": "Validate SQS DLQ queues are the same type", - "phase": "LINT" - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "DLQ", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "category": "Best Practice", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 6, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "DLQ", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "category": "Best Practice", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 6, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "MainQueue", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "category": "Best Practice", - "startLine": 7, - "startColumn": 3, - "endLine": 7, - "endColumn": 12, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "MainQueue", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "category": "Best Practice", - "startLine": 7, - "startColumn": 3, "endLine": 7, - "endColumn": 12, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I3013", - "severity": "INFO", - "message": "'MessageRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "DLQ", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "propertyPath": "Properties", - "category": "Best Practice", - "startLine": 5, - "startColumn": 5, - "endLine": 5, "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", - "phase": "LINT" + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate VPC subnet id format", + "phase": "SCHEMA", + "context": { + "actualValue": "subnet-bad" + } }, { - "ruleId": "I3013", - "severity": "INFO", - "message": "'MessageRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", + "ruleId": "W9010", + "severity": "WARN", + "message": "Hardcoded AMI ID - use a parameter or mapping for portability", + "source": "ENGINE", "entity": { - "logicalId": "MainQueue", + "logicalId": "Instance", "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties", - "category": "Best Practice", - "startLine": 9, - "startColumn": 5, - "endLine": 9, - "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "propertyPath": "Properties.ImageId", + "category": "Security", + "startLine": 6, + "startColumn": 7, + "endLine": 6, + "endColumn": 14, + "ruleDescription": "Hardcoded AMI ID", "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'QueueName' is create-only; updating it will cause resource replacement", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DLQ", + "logicalId": "Instance", "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.QueueName", + "propertyPath": "Properties.ImageId", "category": "Best Practice", "startLine": 6, "startColumn": 7, "endLine": 6, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sqs.git", + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -14803,20 +14118,20 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'QueueName' is create-only; updating it will cause resource replacement", + "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MainQueue", + "logicalId": "Instance", "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.QueueName", + "propertyPath": "Properties.SubnetId", "category": "Best Practice", - "startLine": 10, + "startLine": 7, "startColumn": 7, - "endLine": 10, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sqs.git", + "endLine": 7, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -14826,35 +14141,35 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'FifoQueue' is create-only; updating it will cause resource replacement", + "message": "Property 'SecurityGroupIds' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MainQueue", + "logicalId": "Instance", "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.FifoQueue", + "propertyPath": "Properties.SecurityGroupIds", "category": "Best Practice", - "startLine": 11, + "startLine": 8, "startColumn": 7, - "endLine": 11, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sqs.git", + "endLine": 8, + "endColumn": 23, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'DLQ' of type 'AWS::SQS::Queue' supports Tags but none are configured", + "message": "Resource 'Instance' of type 'AWS::EC2::Instance' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "DLQ", + "logicalId": "Instance", "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" + "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", @@ -14865,39 +14180,19 @@ "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'MainQueue' of type 'AWS::SQS::Queue' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "MainQueue", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 9, - "startColumn": 5, - "endLine": 9, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" } ] }, - "bad/ssm_document_invalid.yaml": { - "filePath": "bad/ssm_document_invalid.yaml", + "bad/schema_lifecycle.yaml": { + "filePath": "bad/schema_lifecycle.yaml", "status": "OK", "metadata": { - "resourcesScanned": 1, + "resourcesScanned": 5, "counts": { - "fatal": 0, - "errors": 1, - "warnings": 0, - "informational": 3, + "fatal": 1, + "errors": 3, + "warnings": 5, + "informational": 8, "debug": 0 }, "suppressed": 0, @@ -14906,391 +14201,286 @@ }, "diagnostics": [ { - "ruleId": "E3051", - "severity": "ERROR", - "message": "SSM Document Content must include 'schemaVersion'", - "source": "CFN_LINT", + "ruleId": "F3003", + "severity": "FATAL", + "message": "'RepositoryOwner' is a required property", + "source": "SCHEMA", "entity": { - "logicalId": "Doc", + "logicalId": "ShutdownResource", "entityType": "Resource", - "resourceType": "AWS::SSM::Document" + "resourceType": "AWS::CodeStar::GitHubRepository" }, - "propertyPath": "Properties.Content", - "category": "Resource", - "startLine": 7, - "startColumn": 7, - "endLine": 7, - "endColumn": 14, - "ruleDescription": "Validate the structure of a SSM document", - "phase": "LINT" + "propertyPath": "Properties", + "suggestedFix": "Add the required property 'RepositoryOwner'", + "category": "Schema", + "startLine": 6, + "startColumn": 5, + "endLine": 6, + "endColumn": 15, + "ruleDescription": "Required property missing", + "phase": "SCHEMA" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'DocumentType' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E2533", + "severity": "ERROR", + "message": "Runtime 'dotnetcore2.1' was deprecated on '2022-01-05'. Creation was disabled on '2022-01-05', and updates were disabled on '2022-04-13'. Please consider updating to 'dotnet10'", + "source": "CFN_LINT", "entity": { - "logicalId": "Doc", + "logicalId": "EolLambda", "entityType": "Resource", - "resourceType": "AWS::SSM::Document" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.DocumentType", - "category": "Best Practice", - "startLine": 6, + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 27, "startColumn": 7, - "endLine": 6, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ssm", - "ruleDescription": "Create-only property updated triggers resource replacement", + "endLine": 27, + "endColumn": 14, + "ruleDescription": "Check if Lambda Function Runtimes are updatable", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Content' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Doc", - "entityType": "Resource", - "resourceType": "AWS::SSM::Document" - }, - "propertyPath": "Properties.Content", - "category": "Best Practice", - "startLine": 7, - "startColumn": 7, - "endLine": 7, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ssm", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" + "actualValue": "dotnetcore2.1", + "lifecycle": "end-of-life" } }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Doc' of type 'AWS::SSM::Document' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "E3677", + "severity": "ERROR", + "message": "Runtime 'dotnetcore2.1' is not supported with Code.ZipFile - use nodejs or python", + "source": "CFN_LINT", "entity": { - "logicalId": "Doc", + "logicalId": "EolLambda", "entityType": "Resource", - "resourceType": "AWS::SSM::Document" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "category": "Resource", + "startLine": 23, + "startColumn": 3, + "endLine": 23, + "endColumn": 12, + "ruleDescription": "Lambda ZipFile requires nodejs or python runtime", "phase": "LINT" - } - ] - }, - "bad/stepfunctions_bad_start_at.yaml": { - "filePath": "bad/stepfunctions_bad_start_at.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 1, - "informational": 1, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "E3601", + "ruleId": "E3710", "severity": "ERROR", - "message": "StartAt 'NonExistentState' does not reference a valid state at StartAt", + "message": "Resource type 'AWS::CodeStar::GitHubRepository' is from a service that was shut down on 2024-07-25", "source": "CFN_LINT", "entity": { - "logicalId": "SM", + "logicalId": "ShutdownResource", "entityType": "Resource", - "resourceType": "AWS::StepFunctions::StateMachine" + "resourceType": "AWS::CodeStar::GitHubRepository" }, - "propertyPath": "Properties.DefinitionString", - "category": "Resource", - "startLine": 6, - "startColumn": 7, - "endLine": 6, - "endColumn": 23, - "ruleDescription": "Validate the structure of a StateMachine definition", - "phase": "LINT" + "category": "Deprecation", + "startLine": 4, + "startColumn": 3, + "endLine": 4, + "endColumn": 19, + "ruleDescription": "Resource type is from a service that has been shut down", + "phase": "SCHEMA" }, { - "ruleId": "W9002", + "ruleId": "W2531", "severity": "WARN", - "message": "Property 'RoleArn' has a hardcoded ARN - use Ref, GetAtt, or a parameter instead", - "source": "ENGINE", + "message": "Runtime 'nodejs16.x' was deprecated on '2024-06-12'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'nodejs24.x'", + "source": "CFN_LINT", "entity": { - "logicalId": "SM", + "logicalId": "DeprecatedLambda", "entityType": "Resource", - "resourceType": "AWS::StepFunctions::StateMachine" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.RoleArn", - "category": "Best Practice", - "startLine": 16, + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 38, "startColumn": 7, - "endLine": 16, + "endLine": 38, "endColumn": 14, - "ruleDescription": "Hardcoded ARN property", - "phase": "LINT" + "ruleDescription": "Check if EOL Lambda Function Runtimes are used", + "phase": "SCHEMA", + "context": { + "actualValue": "nodejs16.x", + "lifecycle": "deprecated" + } }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'SM' of type 'AWS::StepFunctions::StateMachine' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W3696", + "severity": "WARN", + "message": "Resource type 'AWS::AppMesh::Mesh' is from a service that will be shut down on 2026-09-30. Plan to migrate to an alternative", + "source": "CFN_LINT", "entity": { - "logicalId": "SM", + "logicalId": "SunsetResource", "entityType": "Resource", - "resourceType": "AWS::StepFunctions::StateMachine" + "resourceType": "AWS::AppMesh::Mesh" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "bad/stepfunctions_invalid_state.yaml": { - "filePath": "bad/stepfunctions_invalid_state.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 2, - "warnings": 1, - "informational": 1, - "debug": 0 + "category": "Deprecation", + "startLine": 10, + "startColumn": 3, + "endLine": 10, + "endColumn": 17, + "ruleDescription": "Resource type is from a service that is sunsetting", + "phase": "SCHEMA" }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "E3601", - "severity": "ERROR", - "message": "StartAt 'NonExistentState' does not reference a valid state at StartAt", + "ruleId": "W3697", + "severity": "WARN", + "message": "Resource type 'AWS::AutoScaling::LaunchConfiguration' is from a service in maintenance mode since 2024-10-01. Consider migrating to an alternative", "source": "CFN_LINT", "entity": { - "logicalId": "StateMachine", + "logicalId": "MaintenanceResource", "entityType": "Resource", - "resourceType": "AWS::StepFunctions::StateMachine" + "resourceType": "AWS::AutoScaling::LaunchConfiguration" }, - "propertyPath": "Properties.DefinitionString", - "category": "Resource", - "startLine": 7, - "startColumn": 7, - "endLine": 7, - "endColumn": 23, - "ruleDescription": "Validate the structure of a StateMachine definition", - "phase": "LINT" + "category": "Deprecation", + "startLine": 16, + "startColumn": 3, + "endLine": 16, + "endColumn": 22, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", + "ruleDescription": "Resource type is from a service in maintenance mode", + "phase": "SCHEMA" }, { - "ruleId": "E3601", - "severity": "ERROR", - "message": "State 'DoWork' has invalid Type 'InvalidType'. Must be one of ['Task', 'Pass', 'Choice', 'Wait', 'Succeed', 'Fail', 'Parallel', 'Map']", - "source": "CFN_LINT", + "ruleId": "W9013", + "severity": "WARN", + "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", + "source": "ENGINE", "entity": { - "logicalId": "StateMachine", + "logicalId": "EolLambda", "entityType": "Resource", - "resourceType": "AWS::StepFunctions::StateMachine" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.DefinitionString", - "category": "Resource", - "startLine": 7, - "startColumn": 7, - "endLine": 7, - "endColumn": 23, - "ruleDescription": "Validate the structure of a StateMachine definition", + "category": "Security", + "startLine": 23, + "startColumn": 3, + "endLine": 23, + "endColumn": 12, + "ruleDescription": "Hardcoded account ID in ARN", "phase": "LINT" }, { - "ruleId": "W9002", + "ruleId": "W9013", "severity": "WARN", - "message": "Property 'RoleArn' has a hardcoded ARN - use Ref, GetAtt, or a parameter instead", + "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", "source": "ENGINE", "entity": { - "logicalId": "StateMachine", + "logicalId": "DeprecatedLambda", "entityType": "Resource", - "resourceType": "AWS::StepFunctions::StateMachine" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.RoleArn", - "category": "Best Practice", - "startLine": 6, - "startColumn": 7, - "endLine": 6, - "endColumn": 14, - "ruleDescription": "Hardcoded ARN property", + "category": "Security", + "startLine": 34, + "startColumn": 3, + "endLine": 34, + "endColumn": 19, + "ruleDescription": "Hardcoded account ID in ARN", "phase": "LINT" }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'StateMachine' of type 'AWS::StepFunctions::StateMachine' supports Tags but none are configured", + "message": "Property 'MeshName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "StateMachine", + "logicalId": "SunsetResource", "entityType": "Resource", - "resourceType": "AWS::StepFunctions::StateMachine" + "resourceType": "AWS::AppMesh::Mesh" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.MeshName", "category": "Best Practice", - "startLine": 5, - "startColumn": 5, - "endLine": 5, + "startLine": 13, + "startColumn": 7, + "endLine": 13, "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "bad/string.yaml": { - "filePath": "bad/string.yaml", - "status": "ERROR", - "metadata": { - "resourcesScanned": 0, - "counts": { - "fatal": 1, - "errors": 0, - "warnings": 0, - "informational": 0, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "F1101", - "severity": "FATAL", - "message": "Template root must be a YAML mapping", - "source": "SCHEMA", - "category": "Structure", - "startLine": 1, - "startColumn": 1, - "endLine": 1, - "endColumn": 1, - "ruleDescription": "Invalid YAML/JSON syntax", - "phase": "PARSE" - } - ] - }, - "bad/sub_needed.yaml": { - "filePath": "bad/sub_needed.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 1, - "errors": 1, - "warnings": 1, - "informational": 2, - "debug": 0 + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "F3031", - "severity": "FATAL", - "message": "'${MyParam}-bucket' does not match pattern '^([a-z0-9][a-z0-9.-]*[a-z0-9])?$'", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Bucket", + "logicalId": "MaintenanceResource", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::AutoScaling::LaunchConfiguration" }, - "propertyPath": "Properties.BucketName", - "category": "Schema", - "startLine": 9, + "propertyPath": "Properties.ImageId", + "category": "Best Practice", + "startLine": 19, "startColumn": 7, - "endLine": 9, - "endColumn": 17, - "ruleDescription": "Value does not match pattern", + "endLine": 19, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "actualValue": "${MyParam}-bucket", - "expectedConstraint": "^([a-z0-9][a-z0-9.-]*[a-z0-9])?$" + "lifecycle": "create-only" } }, { - "ruleId": "E1029", - "severity": "ERROR", - "message": "Found an embedded parameter '${MyParam}' outside of an 'Fn::Sub' at Properties.BucketName", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'InstanceType' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Bucket", + "logicalId": "MaintenanceResource", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::AutoScaling::LaunchConfiguration" }, - "propertyPath": "Properties.BucketName", - "suggestedFix": "Wrap the string with Fn::Sub", - "category": "Intrinsic Function", - "startLine": 9, + "propertyPath": "Properties.InstanceType", + "category": "Best Practice", + "startLine": 20, "startColumn": 7, - "endLine": 9, - "endColumn": 17, - "ruleDescription": "Substitution variable ${X} requires Fn::Sub", - "phase": "LINT" + "endLine": 20, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'MyParam' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "MyParam", - "entityType": "Parameter" + "logicalId": "EolLambda", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Parameters/MyParam", + "propertyPath": "Properties.FunctionName", "category": "Best Practice", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 10, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "startLine": 26, + "startColumn": 7, + "endLine": 26, + "endColumn": 19, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Bucket", + "logicalId": "DeprecatedLambda", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.BucketName", + "propertyPath": "Properties.FunctionName", "category": "Best Practice", - "startLine": 9, + "startLine": 37, "startColumn": 7, - "endLine": 9, - "endColumn": 17, + "endLine": 37, + "endColumn": 19, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -15300,80 +14490,39 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Resource 'SunsetResource' of type 'AWS::AppMesh::Mesh' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Bucket", + "logicalId": "SunsetResource", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::AppMesh::Mesh" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 8, + "startLine": 12, "startColumn": 5, - "endLine": 8, + "endLine": 12, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" - } - ] - }, - "bad/sub_nested_intrinsic.yaml": { - "filePath": "bad/sub_nested_intrinsic.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 2, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 3, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Bucket", - "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" - }, - "propertyPath": "Properties.BucketName", - "category": "Best Practice", - "startLine": 6, - "startColumn": 7, - "endLine": 6, - "endColumn": 17, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Resource 'EolLambda' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Bucket", + "logicalId": "EolLambda", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::Lambda::Function" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 5, + "startLine": 25, "startColumn": 5, - "endLine": 5, + "endLine": 25, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -15381,33 +14530,33 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'OtherBucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Resource 'DeprecatedLambda' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "OtherBucket", + "logicalId": "DeprecatedLambda", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::Lambda::Function" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 7, - "startColumn": 3, - "endLine": 7, - "endColumn": 14, + "startLine": 36, + "startColumn": 5, + "endLine": 36, + "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "bad/subnet_outside_vpc.yaml": { - "filePath": "bad/subnet_outside_vpc.yaml", + "bad/schema_numeric_bounds.yaml": { + "filePath": "bad/schema_numeric_bounds.yaml", "status": "OK", "metadata": { - "resourcesScanned": 2, + "resourcesScanned": 1, "counts": { - "fatal": 0, - "errors": 1, + "fatal": 1, + "errors": 0, "warnings": 0, "informational": 5, "debug": 0 @@ -15418,85 +14567,104 @@ }, "diagnostics": [ { - "ruleId": "E3059", - "severity": "ERROR", - "message": "Subnet CIDR '192.168.1.0/24' is not within VPC CIDR '10.0.0.0/16'", - "source": "CFN_LINT", + "ruleId": "F3034", + "severity": "FATAL", + "message": "-1 is less than the minimum of 0", + "source": "SCHEMA", "entity": { - "logicalId": "SubnetOutside", + "logicalId": "Queue", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Properties.CidrBlock", - "category": "Resource", - "startLine": 11, + "propertyPath": "Properties.VisibilityTimeout", + "category": "Schema", + "startLine": 8, "startColumn": 7, - "endLine": 11, - "endColumn": 16, - "ruleDescription": "Validate subnet CIDRs are within the CIDRs of the VPC", + "endLine": 8, + "endColumn": 24, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sqs.git", + "ruleDescription": "Numeric value out of bounds", + "phase": "SCHEMA", + "context": { + "actualValue": -1, + "extra": { + "maximum": 43200.0, + "minimum": 0.0 + } + } + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "Queue", + "entityType": "Resource", + "resourceType": "AWS::SQS::Queue" + }, + "category": "Best Practice", + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 8, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "VPC", + "logicalId": "Queue", "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 6, - "startColumn": 7, - "endLine": 6, - "endColumn": 16, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 8, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3013", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'MessageRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "SubnetOutside", + "logicalId": "Queue", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties", "category": "Best Practice", - "startLine": 10, - "startColumn": 7, - "endLine": 10, - "endColumn": 12, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'VPC'" - } + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Property 'QueueName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SubnetOutside", + "logicalId": "Queue", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Properties.QueueName", "category": "Best Practice", - "startLine": 11, + "startLine": 6, "startColumn": 7, - "endLine": 11, + "endLine": 6, "endColumn": 16, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sqs.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -15506,12 +14674,12 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'VPC' of type 'AWS::EC2::VPC' supports Tags but none are configured", + "message": "Resource 'Queue' of type 'AWS::SQS::Queue' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "VPC", + "logicalId": "Queue", "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" + "resourceType": "AWS::SQS::Queue" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", @@ -15522,39 +14690,19 @@ "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'SubnetOutside' of type 'AWS::EC2::Subnet' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "SubnetOutside", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 9, - "startColumn": 5, - "endLine": 9, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" } ] }, - "bad/subnet_overlap.yaml": { - "filePath": "bad/subnet_overlap.yaml", + "bad/schema_property_constraints.yaml": { + "filePath": "bad/schema_property_constraints.yaml", "status": "OK", "metadata": { "resourcesScanned": 3, "counts": { - "fatal": 0, - "errors": 1, - "warnings": 2, - "informational": 10, + "fatal": 1, + "errors": 0, + "warnings": 3, + "informational": 8, "debug": 0 }, "suppressed": 0, @@ -15563,98 +14711,104 @@ }, "diagnostics": [ { - "ruleId": "E3060", - "severity": "ERROR", - "message": "'10.0.0.0/24' overlaps with '10.0.0.0/24'", - "source": "CFN_LINT", + "ruleId": "F3031", + "severity": "FATAL", + "message": "'INVALID_UPPERCASE_BUCKET' does not match pattern '^([a-z0-9][a-z0-9.-]*[a-z0-9])?$'", + "source": "SCHEMA", "entity": { - "logicalId": "SubnetB", + "logicalId": "PatternBucket", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.CidrBlock", - "category": "Resource", - "startLine": 17, + "propertyPath": "Properties.BucketName", + "category": "Schema", + "startLine": 6, "startColumn": 7, - "endLine": 17, - "endColumn": 16, - "relatedResources": [ - { - "resource": { - "id": "SubnetA", - "resourceType": "AWS::EC2::Subnet" - }, - "location": { - "startLine": 7, - "startColumn": 3, - "endLine": 7, - "endColumn": 10 - }, - "message": "Overlapping subnet CIDR 10.0.0.0/24" - } - ], - "ruleDescription": "Validate subnet CIDRs do not overlap with other subnets", - "phase": "LINT", + "endLine": 6, + "endColumn": 17, + "ruleDescription": "Value does not match pattern", + "phase": "SCHEMA", "context": { - "extra": { - "cidr": "10.0.0.0/24" - } + "actualValue": "INVALID_UPPERCASE_BUCKET", + "expectedConstraint": "^([a-z0-9][a-z0-9.-]*[a-z0-9])?$" } }, { - "ruleId": "W3010", + "ruleId": "W9002", "severity": "WARN", - "message": "Avoid hardcoding availability zones 'us-east-1a'", - "source": "CFN_LINT", + "message": "Property 'CertificateAuthorityArn' has a hardcoded ARN - use Ref, GetAtt, or a parameter instead", + "source": "ENGINE", "entity": { - "logicalId": "SubnetA", + "logicalId": "ReadOnlyProp", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::ACMPCA::Certificate" }, - "propertyPath": "Properties.AvailabilityZone", + "propertyPath": "Properties.CertificateAuthorityArn", "category": "Best Practice", - "startLine": 12, + "startLine": 11, "startColumn": 7, - "endLine": 12, - "endColumn": 23, - "ruleDescription": "Availability zone properties should not be hardcoded", + "endLine": 11, + "endColumn": 30, + "ruleDescription": "Hardcoded ARN property", "phase": "LINT" }, { - "ruleId": "W3010", + "ruleId": "W9009", "severity": "WARN", - "message": "Avoid hardcoding availability zones 'us-east-1b'", - "source": "CFN_LINT", + "message": "Property 'WorkGroupConfigurationUpdates' is deprecated", + "source": "ENGINE", "entity": { - "logicalId": "SubnetB", + "logicalId": "DeprecatedProp", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::Athena::WorkGroup" }, - "propertyPath": "Properties.AvailabilityZone", - "category": "Best Practice", - "startLine": 18, + "propertyPath": "Properties.WorkGroupConfigurationUpdates", + "category": "Deprecation", + "startLine": 23, "startColumn": 7, - "endLine": 18, - "endColumn": 23, - "ruleDescription": "Availability zone properties should not be hardcoded", + "endLine": 23, + "endColumn": 36, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-athena.git", + "ruleDescription": "Resource type sunset or shutdown", + "phase": "SCHEMA", + "context": { + "lifecycle": "deprecated" + } + }, + { + "ruleId": "W9013", + "severity": "WARN", + "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", + "source": "ENGINE", + "entity": { + "logicalId": "ReadOnlyProp", + "entityType": "Resource", + "resourceType": "AWS::ACMPCA::Certificate" + }, + "category": "Security", + "startLine": 8, + "startColumn": 3, + "endLine": 8, + "endColumn": 15, + "ruleDescription": "Hardcoded account ID in ARN", "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "VPC", + "logicalId": "PatternBucket", "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Properties.BucketName", "category": "Best Practice", "startLine": 6, "startColumn": 7, "endLine": 6, - "endColumn": 16, + "endColumn": 17, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -15664,42 +14818,20 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "SubnetA", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.VpcId", - "category": "Best Practice", - "startLine": 10, - "startColumn": 7, - "endLine": 10, - "endColumn": 12, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'VPC'" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Property 'CertificateAuthorityArn' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SubnetA", + "logicalId": "ReadOnlyProp", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::ACMPCA::Certificate" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Properties.CertificateAuthorityArn", "category": "Best Practice", "startLine": 11, "startColumn": 7, "endLine": 11, - "endColumn": 16, + "endColumn": 30, + "documentationUrl": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/AWS_ACMPCA.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -15709,19 +14841,20 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", + "message": "Property 'CertificateSigningRequest' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SubnetA", + "logicalId": "ReadOnlyProp", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::ACMPCA::Certificate" }, - "propertyPath": "Properties.AvailabilityZone", + "propertyPath": "Properties.CertificateSigningRequest", "category": "Best Practice", "startLine": 12, "startColumn": 7, "endLine": 12, - "endColumn": 23, + "endColumn": 32, + "documentationUrl": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/AWS_ACMPCA.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -15731,42 +14864,43 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "message": "Property 'SigningAlgorithm' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SubnetB", + "logicalId": "ReadOnlyProp", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::ACMPCA::Certificate" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.SigningAlgorithm", "category": "Best Practice", - "startLine": 16, + "startLine": 13, "startColumn": 7, - "endLine": 16, - "endColumn": 12, + "endLine": 13, + "endColumn": 23, + "documentationUrl": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/AWS_ACMPCA.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'VPC'" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Property 'Validity' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SubnetB", + "logicalId": "ReadOnlyProp", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::ACMPCA::Certificate" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Properties.Validity", "category": "Best Practice", - "startLine": 17, + "startLine": 14, "startColumn": 7, - "endLine": 17, - "endColumn": 16, + "endLine": 14, + "endColumn": 15, + "documentationUrl": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/AWS_ACMPCA.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -15776,19 +14910,20 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", + "message": "Property 'Name' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SubnetB", + "logicalId": "DeprecatedProp", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::Athena::WorkGroup" }, - "propertyPath": "Properties.AvailabilityZone", + "propertyPath": "Properties.Name", "category": "Best Practice", - "startLine": 18, + "startLine": 22, "startColumn": 7, - "endLine": 18, - "endColumn": 23, + "endLine": 22, + "endColumn": 11, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-athena.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -15798,12 +14933,12 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'VPC' of type 'AWS::EC2::VPC' supports Tags but none are configured", + "message": "Resource 'PatternBucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "VPC", + "logicalId": "PatternBucket", "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" + "resourceType": "AWS::S3::Bucket" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", @@ -15818,55 +14953,35 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'SubnetA' of type 'AWS::EC2::Subnet' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "SubnetA", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 9, - "startColumn": 5, - "endLine": 9, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'SubnetB' of type 'AWS::EC2::Subnet' supports Tags but none are configured", + "message": "Resource 'DeprecatedProp' of type 'AWS::Athena::WorkGroup' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "SubnetB", + "logicalId": "DeprecatedProp", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::Athena::WorkGroup" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 15, + "startLine": 21, "startColumn": 5, - "endLine": 15, + "endLine": 21, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "bad/subnet_overlap_multi.yaml": { - "filePath": "bad/subnet_overlap_multi.yaml", + "bad/schema_required_xor_conditional.yaml": { + "filePath": "bad/schema_required_xor_conditional.yaml", "status": "OK", "metadata": { - "resourcesScanned": 5, + "resourcesScanned": 1, "counts": { - "fatal": 0, - "errors": 4, - "warnings": 4, - "informational": 18, + "fatal": 1, + "errors": 0, + "warnings": 0, + "informational": 5, "debug": 0 }, "suppressed": 0, @@ -15875,412 +14990,409 @@ }, "diagnostics": [ { - "ruleId": "E3059", - "severity": "ERROR", - "message": "Subnet CIDR '172.16.0.0/16' is not within VPC CIDR '10.0.0.0/8'", - "source": "CFN_LINT", + "ruleId": "F3014", + "severity": "FATAL", + "message": "Exactly one of ['ScalingTargetId', 'ResourceId'] must be specified", + "source": "SCHEMA", "entity": { - "logicalId": "SubnetC", + "logicalId": "Policy", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::ApplicationAutoScaling::ScalingPolicy" }, - "propertyPath": "Properties.CidrBlock", - "category": "Resource", - "startLine": 28, - "startColumn": 7, - "endLine": 28, - "endColumn": 16, - "ruleDescription": "Validate subnet CIDRs are within the CIDRs of the VPC", - "phase": "LINT" + "propertyPath": "Properties", + "category": "Schema", + "startLine": 13, + "startColumn": 5, + "endLine": 13, + "endColumn": 15, + "conditionScenario": { + "DuplicateTarget": true + }, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Exactly one of properties required (requiredXor)", + "phase": "SCHEMA" }, { - "ruleId": "E3060", - "severity": "ERROR", - "message": "'10.0.0.0/16' overlaps with '10.0.0.0/8'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'PolicyName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "SubnetB", + "logicalId": "Policy", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::ApplicationAutoScaling::ScalingPolicy" }, - "propertyPath": "Properties.CidrBlock", - "category": "Resource", - "startLine": 22, + "propertyPath": "Properties.PolicyName", + "category": "Best Practice", + "startLine": 14, "startColumn": 7, - "endLine": 22, - "endColumn": 16, - "relatedResources": [ - { - "resource": { - "id": "SubnetA", - "resourceType": "AWS::EC2::Subnet" - }, - "location": { - "startLine": 12, - "startColumn": 3, - "endLine": 12, - "endColumn": 10 - }, - "message": "Overlapping subnet CIDR 10.0.0.0/8" - } - ], - "ruleDescription": "Validate subnet CIDRs do not overlap with other subnets", - "phase": "LINT", + "endLine": 14, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", "context": { - "extra": { - "cidr": "10.0.0.0/16" - } + "lifecycle": "create-only" } }, { - "ruleId": "E3060", - "severity": "ERROR", - "message": "'10.0.1.0/24' overlaps with '10.0.0.0/16'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ScalingTargetId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "SubnetD", + "logicalId": "Policy", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::ApplicationAutoScaling::ScalingPolicy" }, - "propertyPath": "Properties.CidrBlock", - "category": "Resource", - "startLine": 34, + "propertyPath": "Properties.ScalingTargetId", + "category": "Best Practice", + "startLine": 16, "startColumn": 7, - "endLine": 34, - "endColumn": 16, - "relatedResources": [ - { - "resource": { - "id": "SubnetB", - "resourceType": "AWS::EC2::Subnet" - }, - "location": { - "startLine": 18, - "startColumn": 3, - "endLine": 18, - "endColumn": 10 - }, - "message": "Overlapping subnet CIDR 10.0.0.0/16" - } - ], - "ruleDescription": "Validate subnet CIDRs do not overlap with other subnets", - "phase": "LINT", - "context": { - "extra": { - "cidr": "10.0.1.0/24" - } - } - }, - { - "ruleId": "E3060", - "severity": "ERROR", - "message": "'10.0.1.0/24' overlaps with '10.0.0.0/8'", - "source": "CFN_LINT", - "entity": { - "logicalId": "SubnetD", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.CidrBlock", - "category": "Resource", - "startLine": 34, - "startColumn": 7, - "endLine": 34, - "endColumn": 16, - "relatedResources": [ - { - "resource": { - "id": "SubnetA", - "resourceType": "AWS::EC2::Subnet" - }, - "location": { - "startLine": 12, - "startColumn": 3, - "endLine": 12, - "endColumn": 10 - }, - "message": "Overlapping subnet CIDR 10.0.0.0/8" - } - ], - "ruleDescription": "Validate subnet CIDRs do not overlap with other subnets", - "phase": "LINT", + "endLine": 16, + "endColumn": 22, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", "context": { - "extra": { - "cidr": "10.0.1.0/24" - } + "lifecycle": "create-only", + "resolutionSource": "parameter 'TargetId' (type String)" } }, - { - "ruleId": "W3010", - "severity": "WARN", - "message": "Avoid hardcoding availability zones 'us-east-1a'", - "source": "CFN_LINT", - "entity": { - "logicalId": "SubnetA", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.AvailabilityZone", - "category": "Best Practice", - "startLine": 17, - "startColumn": 7, - "endLine": 17, - "endColumn": 23, - "ruleDescription": "Availability zone properties should not be hardcoded", - "phase": "LINT" - }, - { - "ruleId": "W3010", - "severity": "WARN", - "message": "Avoid hardcoding availability zones 'us-east-1b'", - "source": "CFN_LINT", - "entity": { - "logicalId": "SubnetB", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.AvailabilityZone", - "category": "Best Practice", - "startLine": 23, - "startColumn": 7, - "endLine": 23, - "endColumn": 23, - "ruleDescription": "Availability zone properties should not be hardcoded", - "phase": "LINT" - }, - { - "ruleId": "W3010", - "severity": "WARN", - "message": "Avoid hardcoding availability zones 'us-east-1c'", - "source": "CFN_LINT", - "entity": { - "logicalId": "SubnetC", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.AvailabilityZone", - "category": "Best Practice", - "startLine": 29, - "startColumn": 7, - "endLine": 29, - "endColumn": 23, - "ruleDescription": "Availability zone properties should not be hardcoded", - "phase": "LINT" - }, - { - "ruleId": "W3010", - "severity": "WARN", - "message": "Avoid hardcoding availability zones 'us-east-1d'", - "source": "CFN_LINT", - "entity": { - "logicalId": "SubnetD", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.AvailabilityZone", - "category": "Best Practice", - "startLine": 35, - "startColumn": 7, - "endLine": 35, - "endColumn": 23, - "ruleDescription": "Availability zone properties should not be hardcoded", - "phase": "LINT" - }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Property 'ResourceId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "VPC", + "logicalId": "Policy", "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" + "resourceType": "AWS::ApplicationAutoScaling::ScalingPolicy" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Properties.ResourceId", "category": "Best Practice", - "startLine": 11, + "startLine": 17, "startColumn": 7, - "endLine": 11, - "endColumn": 16, + "endLine": 17, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "Fn::If on condition 'DuplicateTarget'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "message": "Property 'ScalableDimension' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SubnetA", + "logicalId": "Policy", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::ApplicationAutoScaling::ScalingPolicy" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.ScalableDimension", "category": "Best Practice", - "startLine": 15, + "startLine": 18, "startColumn": 7, - "endLine": 15, - "endColumn": 12, + "endLine": 18, + "endColumn": 24, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'VPC'" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Property 'ServiceNamespace' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SubnetA", + "logicalId": "Policy", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::ApplicationAutoScaling::ScalingPolicy" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Properties.ServiceNamespace", "category": "Best Practice", - "startLine": 16, + "startLine": 19, "startColumn": 7, - "endLine": 16, - "endColumn": 16, + "endLine": 19, + "endColumn": 23, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only" } + } + ] + }, + "bad/schema_string_length.yaml": { + "filePath": "bad/schema_string_length.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 1, + "informational": 2, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", + "ruleId": "W9013", + "severity": "WARN", + "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", "source": "ENGINE", "entity": { - "logicalId": "SubnetA", + "logicalId": "Lambda", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.AvailabilityZone", - "category": "Best Practice", - "startLine": 17, - "startColumn": 7, - "endLine": 17, - "endColumn": 23, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "category": "Security", + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 9, + "ruleDescription": "Hardcoded account ID in ARN", + "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SubnetB", + "logicalId": "Lambda", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.FunctionName", "category": "Best Practice", - "startLine": 21, + "startLine": 6, "startColumn": 7, - "endLine": 21, - "endColumn": 12, + "endLine": 6, + "endColumn": 19, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'VPC'" + "lifecycle": "create-only" } }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Resource 'Lambda' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "SubnetB", + "logicalId": "Lambda", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 22, + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "bad/schema_structural.yaml": { + "filePath": "bad/schema_structural.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 4, + "counts": { + "fatal": 6, + "errors": 0, + "warnings": 0, + "informational": 10, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "F3014", + "severity": "FATAL", + "message": "Exactly one of ['ScalingTargetId', 'ResourceId'] must be specified", + "source": "SCHEMA", + "entity": { + "logicalId": "ScalingPolicyBothIds", + "entityType": "Resource", + "resourceType": "AWS::ApplicationAutoScaling::ScalingPolicy" + }, + "propertyPath": "Properties", + "category": "Schema", + "startLine": 25, + "startColumn": 5, + "endLine": 25, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Exactly one of properties required (requiredXor)", + "phase": "SCHEMA" + }, + { + "ruleId": "F3020", + "severity": "FATAL", + "message": "'Statistic' should not be included with 'ExtendedStatistic'", + "source": "SCHEMA", + "entity": { + "logicalId": "AlarmBothStats", + "entityType": "Resource", + "resourceType": "AWS::CloudWatch::Alarm" + }, + "propertyPath": "Properties.Statistic", + "category": "Schema", + "startLine": 12, "startColumn": 7, - "endLine": 22, + "endLine": 12, "endColumn": 16, - "ruleDescription": "Create-only property updated triggers resource replacement", + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-cloudwatch.git", + "ruleDescription": "Mutually exclusive properties", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "property": "Statistic" } }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "F3020", + "severity": "FATAL", + "message": "'ExtendedStatistic' should not be included with 'Statistic'", + "source": "SCHEMA", "entity": { - "logicalId": "SubnetB", + "logicalId": "AlarmBothStats", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::CloudWatch::Alarm" }, - "propertyPath": "Properties.AvailabilityZone", - "category": "Best Practice", - "startLine": 23, + "propertyPath": "Properties.ExtendedStatistic", + "category": "Schema", + "startLine": 13, "startColumn": 7, - "endLine": 23, - "endColumn": 23, - "ruleDescription": "Create-only property updated triggers resource replacement", + "endLine": 13, + "endColumn": 24, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-cloudwatch.git", + "ruleDescription": "Mutually exclusive properties", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "property": "ExtendedStatistic" } }, + { + "ruleId": "F3021", + "severity": "FATAL", + "message": "'ScalableDimension' is a dependency of 'ResourceId'", + "source": "SCHEMA", + "entity": { + "logicalId": "ScalingPolicyMissingDeps", + "entityType": "Resource", + "resourceType": "AWS::ApplicationAutoScaling::ScalingPolicy" + }, + "propertyPath": "Properties", + "suggestedFix": "Add 'ScalableDimension' when 'ResourceId' is specified", + "category": "Schema", + "startLine": 36, + "startColumn": 5, + "endLine": 36, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Dependent property required", + "phase": "SCHEMA" + }, + { + "ruleId": "F3021", + "severity": "FATAL", + "message": "'ServiceNamespace' is a dependency of 'ResourceId'", + "source": "SCHEMA", + "entity": { + "logicalId": "ScalingPolicyMissingDeps", + "entityType": "Resource", + "resourceType": "AWS::ApplicationAutoScaling::ScalingPolicy" + }, + "propertyPath": "Properties", + "suggestedFix": "Add 'ServiceNamespace' when 'ResourceId' is specified", + "category": "Schema", + "startLine": 36, + "startColumn": 5, + "endLine": 36, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Dependent property required", + "phase": "SCHEMA" + }, + { + "ruleId": "F3058", + "severity": "FATAL", + "message": "One of ['CidrBlock', 'Ipv4IpamPoolId', 'Ipv6IpamPoolId', 'Ipv6CidrBlock'] is a required property", + "source": "SCHEMA", + "entity": { + "logicalId": "SubnetNoCidr", + "entityType": "Resource", + "resourceType": "AWS::EC2::Subnet" + }, + "propertyPath": "Properties", + "category": "Schema", + "startLine": 19, + "startColumn": 5, + "endLine": 19, + "endColumn": 15, + "ruleDescription": "One of properties required (requiredOr)", + "phase": "SCHEMA" + }, { "ruleId": "I9001", "severity": "INFO", "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SubnetC", + "logicalId": "SubnetNoCidr", "entityType": "Resource", "resourceType": "AWS::EC2::Subnet" }, "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 27, + "startLine": 20, "startColumn": 7, - "endLine": 27, + "endLine": 20, "endColumn": 12, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'VPC'" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Property 'PolicyName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SubnetC", + "logicalId": "ScalingPolicyBothIds", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::ApplicationAutoScaling::ScalingPolicy" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Properties.PolicyName", "category": "Best Practice", - "startLine": 28, + "startLine": 26, "startColumn": 7, - "endLine": 28, - "endColumn": 16, + "endLine": 26, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -16290,19 +15402,20 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", + "message": "Property 'ScalingTargetId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SubnetC", + "logicalId": "ScalingPolicyBothIds", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::ApplicationAutoScaling::ScalingPolicy" }, - "propertyPath": "Properties.AvailabilityZone", + "propertyPath": "Properties.ScalingTargetId", "category": "Best Practice", - "startLine": 29, + "startLine": 28, "startColumn": 7, - "endLine": 29, - "endColumn": 23, + "endLine": 28, + "endColumn": 22, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -16312,42 +15425,43 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "message": "Property 'ResourceId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SubnetD", + "logicalId": "ScalingPolicyBothIds", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::ApplicationAutoScaling::ScalingPolicy" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.ResourceId", "category": "Best Practice", - "startLine": 33, + "startLine": 29, "startColumn": 7, - "endLine": 33, - "endColumn": 12, + "endLine": 29, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'VPC'" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Property 'ScalableDimension' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SubnetD", + "logicalId": "ScalingPolicyBothIds", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::ApplicationAutoScaling::ScalingPolicy" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Properties.ScalableDimension", "category": "Best Practice", - "startLine": 34, + "startLine": 30, "startColumn": 7, - "endLine": 34, - "endColumn": 16, + "endLine": 30, + "endColumn": 24, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -16357,19 +15471,20 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", + "message": "Property 'ServiceNamespace' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SubnetD", + "logicalId": "ScalingPolicyBothIds", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::ApplicationAutoScaling::ScalingPolicy" }, - "propertyPath": "Properties.AvailabilityZone", + "propertyPath": "Properties.ServiceNamespace", "category": "Best Practice", - "startLine": 35, + "startLine": 31, "startColumn": 7, - "endLine": 35, + "endLine": 31, "endColumn": 23, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -16377,61 +15492,67 @@ } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'VPC' of type 'AWS::EC2::VPC' supports Tags but none are configured", + "message": "Property 'PolicyName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "VPC", + "logicalId": "ScalingPolicyMissingDeps", "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" + "resourceType": "AWS::ApplicationAutoScaling::ScalingPolicy" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.PolicyName", "category": "Best Practice", - "startLine": 10, - "startColumn": 5, - "endLine": 10, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 37, + "startColumn": 7, + "endLine": 37, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'SubnetA' of type 'AWS::EC2::Subnet' supports Tags but none are configured", + "message": "Property 'ResourceId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SubnetA", + "logicalId": "ScalingPolicyMissingDeps", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::ApplicationAutoScaling::ScalingPolicy" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.ResourceId", "category": "Best Practice", - "startLine": 14, - "startColumn": 5, - "endLine": 14, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 39, + "startColumn": 7, + "endLine": 39, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'SubnetB' of type 'AWS::EC2::Subnet' supports Tags but none are configured", + "message": "Resource 'AlarmBothStats' of type 'AWS::CloudWatch::Alarm' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "SubnetB", + "logicalId": "AlarmBothStats", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::CloudWatch::Alarm" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 20, + "startLine": 6, "startColumn": 5, - "endLine": 20, + "endLine": 6, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -16439,52 +15560,159 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'SubnetC' of type 'AWS::EC2::Subnet' supports Tags but none are configured", + "message": "Resource 'SubnetNoCidr' of type 'AWS::EC2::Subnet' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "SubnetC", + "logicalId": "SubnetNoCidr", "entityType": "Resource", "resourceType": "AWS::EC2::Subnet" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 26, + "startLine": 19, "startColumn": 5, - "endLine": 26, + "endLine": 19, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "bad/schema_type_mismatch.yaml": { + "filePath": "bad/schema_type_mismatch.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 3, + "informational": 2, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "W3030", + "severity": "WARN", + "message": "true is not one of ['Enabled', 'Suspended']", + "source": "CFN_LINT", + "entity": { + "logicalId": "Bucket", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" + }, + "propertyPath": "Properties.VersioningConfiguration.Status", + "category": "Schema", + "startLine": 8, + "startColumn": 9, + "endLine": 8, + "endColumn": 15, + "ruleDescription": "Value not in allowed enum", + "phase": "SCHEMA", + "context": { + "actualValue": true, + "extra": { + "allowed_values": [ + "Enabled", + "Suspended" + ] + } + } + }, + { + "ruleId": "W9003", + "severity": "WARN", + "message": "12345 is not of type 'string' - automatically coerced (number to string)", + "source": "CFN_LINT", + "entity": { + "logicalId": "Bucket", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" + }, + "propertyPath": "Properties.BucketName", + "category": "Best Practice", + "startLine": 6, + "startColumn": 7, + "endLine": 6, + "endColumn": 17, + "ruleDescription": "Property type coercion warning", + "phase": "SCHEMA" + }, + { + "ruleId": "W9003", + "severity": "WARN", + "message": "true is not of type 'string' - automatically coerced (boolean to string)", + "source": "CFN_LINT", + "entity": { + "logicalId": "Bucket", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" + }, + "propertyPath": "Properties.VersioningConfiguration.Status", + "category": "Best Practice", + "startLine": 8, + "startColumn": 9, + "endLine": 8, + "endColumn": 15, + "ruleDescription": "Property type coercion warning", + "phase": "SCHEMA" + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "Bucket", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" + }, + "propertyPath": "Properties.BucketName", + "category": "Best Practice", + "startLine": 6, + "startColumn": 7, + "endLine": 6, + "endColumn": 17, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'SubnetD' of type 'AWS::EC2::Subnet' supports Tags but none are configured", + "message": "Resource 'Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "SubnetD", + "logicalId": "Bucket", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::S3::Bucket" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 32, + "startLine": 5, "startColumn": 5, - "endLine": 32, + "endLine": 5, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "bad/template.yaml": { - "filePath": "bad/template.yaml", - "status": "ERROR", + "bad/schema_unique_items.yaml": { + "filePath": "bad/schema_unique_items.yaml", + "status": "OK", "metadata": { - "resourcesScanned": 0, + "resourcesScanned": 1, "counts": { - "fatal": 1, + "fatal": 2, "errors": 0, "warnings": 0, "informational": 0, @@ -16496,30 +15724,68 @@ }, "diagnostics": [ { - "ruleId": "F1101", + "ruleId": "F3032", "severity": "FATAL", - "message": "YAML parse error: while parsing a block mapping, did not find expected key at byte 234 line 12 column 11", + "message": "expected maximum item count: 1, found: 2", "source": "SCHEMA", - "category": "Structure", - "startLine": 12, - "startColumn": 11, - "endLine": 12, - "endColumn": 11, - "ruleDescription": "Invalid YAML/JSON syntax", - "phase": "PARSE" + "entity": { + "logicalId": "Profile", + "entityType": "Resource", + "resourceType": "AWS::IAM::InstanceProfile" + }, + "propertyPath": "Properties.Roles", + "category": "Schema", + "startLine": 6, + "startColumn": 7, + "endLine": 6, + "endColumn": 12, + "ruleDescription": "Array item count out of bounds", + "phase": "SCHEMA", + "context": { + "extra": { + "actual_count": 2, + "max_items": 1, + "min_items": 0 + } + } + }, + { + "ruleId": "F3037", + "severity": "FATAL", + "message": "Array items are not unique", + "source": "SCHEMA", + "entity": { + "logicalId": "Profile", + "entityType": "Resource", + "resourceType": "AWS::IAM::InstanceProfile" + }, + "propertyPath": "Properties.Roles", + "category": "Schema", + "startLine": 6, + "startColumn": 7, + "endLine": 6, + "endColumn": 12, + "ruleDescription": "Array items not unique", + "phase": "SCHEMA", + "context": { + "actualValue": [ + "arn:aws:iam::012345678901:role/SameRole", + "arn:aws:iam::012345678901:role/SameRole" + ] + } } ] }, - "bad/templates/base.yaml": { - "filePath": "bad/templates/base.yaml", + "bad/schema_write_only.yaml": { + "filePath": "bad/schema_write_only.yaml", "status": "OK", "metadata": { - "resourcesScanned": 0, + "resourcesScanned": 1, "counts": { - "fatal": 2, - "errors": 2, - "warnings": 0, - "informational": 0, + "fatal": 1, + "errors": 0, + "warnings": 3, + "informational": 1, "debug": 0 }, "suppressed": 0, @@ -16528,178 +15794,118 @@ }, "diagnostics": [ { - "ruleId": "F0001", - "severity": "FATAL", - "message": "Resources section must exist and be non-empty", - "source": "SCHEMA", - "category": "Structure", - "startLine": 4, - "startColumn": 1, - "endLine": 4, - "endColumn": 10, - "ruleDescription": "Resources section must exist and be non-empty", - "phase": "SCHEMA" - }, - { - "ruleId": "F0002", + "ruleId": "F6101", "severity": "FATAL", - "message": "AWSTemplateFormatVersion must be '2010-09-09', got '2010-09-10'", + "message": "'Certificate' is not one of ['CompleteCertificateChain']", "source": "SCHEMA", - "propertyPath": "AWSTemplateFormatVersion", - "category": "Structure", - "startLine": 1, - "startColumn": 1, - "endLine": 1, - "endColumn": 25, - "ruleDescription": "AWSTemplateFormatVersion must be 2010-09-09", - "phase": "SCHEMA" - }, - { - "ruleId": "E1005", - "severity": "ERROR", - "message": "Transform object is missing required 'Name' property", - "source": "CFN_LINT", - "propertyPath": "Transform", - "category": "Structure", - "startLine": 2, - "startColumn": 1, - "endLine": 2, - "endColumn": 10, - "ruleDescription": "Validate Transform configuration", - "phase": "PARSE" - }, - { - "ruleId": "E1005", - "severity": "ERROR", - "message": "Transform object has unknown property 'key' - expected one of 'Name', 'Parameters'", - "source": "CFN_LINT", - "propertyPath": "Transform", + "entity": { + "logicalId": "WriteOnlyOutput", + "entityType": "Output" + }, + "propertyPath": "Outputs/WriteOnlyOutput/Value.Fn::GetAtt.1", "category": "Structure", - "startLine": 3, + "startLine": 10, "startColumn": 3, - "endLine": 3, - "endColumn": 6, - "ruleDescription": "Validate Transform configuration", - "phase": "PARSE" - } - ] - }, - "bad/templates/base_date.yaml": { - "filePath": "bad/templates/base_date.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 0, - "counts": { - "fatal": 2, - "errors": 0, - "warnings": 0, - "informational": 0, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "F0001", - "severity": "FATAL", - "message": "Resources section must exist and be non-empty", - "source": "SCHEMA", - "category": "Structure", - "startLine": 2, - "startColumn": 1, - "endLine": 2, - "endColumn": 10, - "ruleDescription": "Resources section must exist and be non-empty", + "endLine": 10, + "endColumn": 18, + "ruleDescription": "Output value must be a string", "phase": "SCHEMA" }, { - "ruleId": "F0002", - "severity": "FATAL", - "message": "AWSTemplateFormatVersion must be '2010-09-09', got '2010-09-10'", - "source": "SCHEMA", - "propertyPath": "AWSTemplateFormatVersion", - "category": "Structure", - "startLine": 1, - "startColumn": 1, - "endLine": 1, - "endColumn": 25, - "ruleDescription": "AWSTemplateFormatVersion must be 2010-09-09", - "phase": "SCHEMA" - } - ] - }, - "bad/templates/base_null.yaml": { - "filePath": "bad/templates/base_null.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 0, - "counts": { - "fatal": 2, - "errors": 1, - "warnings": 0, - "informational": 0, - "debug": 0 + "ruleId": "W9002", + "severity": "WARN", + "message": "Property 'CertificateAuthorityArn' has a hardcoded ARN - use Ref, GetAtt, or a parameter instead", + "source": "ENGINE", + "entity": { + "logicalId": "CertAuth", + "entityType": "Resource", + "resourceType": "AWS::ACMPCA::CertificateAuthorityActivation" + }, + "propertyPath": "Properties.CertificateAuthorityArn", + "category": "Best Practice", + "startLine": 7, + "startColumn": 7, + "endLine": 7, + "endColumn": 30, + "ruleDescription": "Hardcoded ARN property", + "phase": "LINT" }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "F0001", - "severity": "FATAL", - "message": "Resources section must exist and be non-empty", - "source": "SCHEMA", - "category": "Structure", - "startLine": 3, - "startColumn": 1, - "endLine": 3, - "endColumn": 10, - "ruleDescription": "Resources section must exist and be non-empty", - "phase": "SCHEMA" + "ruleId": "W9013", + "severity": "WARN", + "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", + "source": "ENGINE", + "entity": { + "logicalId": "CertAuth", + "entityType": "Resource", + "resourceType": "AWS::ACMPCA::CertificateAuthorityActivation" + }, + "category": "Security", + "startLine": 4, + "startColumn": 3, + "endLine": 4, + "endColumn": 11, + "ruleDescription": "Hardcoded account ID in ARN", + "phase": "LINT" }, { - "ruleId": "F0002", - "severity": "FATAL", - "message": "AWSTemplateFormatVersion must be '2010-09-09', got null", - "source": "SCHEMA", - "propertyPath": "AWSTemplateFormatVersion", - "category": "Structure", - "startLine": 1, - "startColumn": 1, - "endLine": 1, - "endColumn": 25, - "ruleDescription": "AWSTemplateFormatVersion must be 2010-09-09", - "phase": "PARSE" + "ruleId": "W9054", + "severity": "WARN", + "message": "Write-only property 'Certificate' of 'CertAuth' is referenced in output 'WriteOnlyOutput'", + "source": "ENGINE", + "entity": { + "logicalId": "CertAuth", + "entityType": "Resource", + "resourceType": "AWS::ACMPCA::CertificateAuthorityActivation" + }, + "propertyPath": "Properties.Certificate", + "category": "Best Practice", + "startLine": 8, + "startColumn": 7, + "endLine": 8, + "endColumn": 18, + "documentationUrl": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/AWS_ACMPCA.html", + "ruleDescription": "Write-only property referenced in output", + "phase": "SCHEMA", + "context": { + "lifecycle": "write-only" + } }, { - "ruleId": "E1005", - "severity": "ERROR", - "message": "Transform must be a transform name, a list of transforms, or a {Name, Parameters} object, got null", - "source": "CFN_LINT", - "propertyPath": "Transform", - "category": "Structure", - "startLine": 2, - "startColumn": 1, - "endLine": 2, - "endColumn": 10, - "ruleDescription": "Validate Transform configuration", - "phase": "PARSE" + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'CertificateAuthorityArn' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "CertAuth", + "entityType": "Resource", + "resourceType": "AWS::ACMPCA::CertificateAuthorityActivation" + }, + "propertyPath": "Properties.CertificateAuthorityArn", + "category": "Best Practice", + "startLine": 7, + "startColumn": 7, + "endLine": 7, + "endColumn": 30, + "documentationUrl": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/AWS_ACMPCA.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } } ] }, - "bad/templates/description_object.yaml": { - "filePath": "bad/templates/description_object.yaml", + "bad/security_issues.yaml": { + "filePath": "bad/security_issues.yaml", "status": "OK", "metadata": { - "resourcesScanned": 1, + "resourcesScanned": 2, "counts": { "fatal": 1, "errors": 0, - "warnings": 0, - "informational": 0, + "warnings": 1, + "informational": 2, "debug": 0 }, "suppressed": 0, @@ -16708,223 +15914,2984 @@ }, "diagnostics": [ { - "ruleId": "F1004", + "ruleId": "F3017", "severity": "FATAL", - "message": "Description must be a string, got a list", + "message": "Value is not valid under any of the 3 anyOf schemas for AWS::IAM::Policy (0 branches matched; at least one is required). Required property combinations: ['Groups'] or ['Roles'] or ['Users']. Branch failures: branch 1: 'Users' is a required property; branch 2: 'Groups' is a required property; branch 3: 'Roles' is a required property.", "source": "SCHEMA", - "propertyPath": "Description", - "category": "Structure", - "startLine": 2, - "startColumn": 1, - "endLine": 2, - "endColumn": 12, - "ruleDescription": "Description must be a string", - "phase": "PARSE" - } - ] - }, - "bad/templates/transform_invalid_entries.yaml": { - "filePath": "bad/templates/transform_invalid_entries.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 3, - "warnings": 0, - "informational": 0, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "E1005", - "severity": "ERROR", - "message": "Transform entry must be a transform name or a {Name, Parameters} object, got a number", - "source": "CFN_LINT", - "propertyPath": "Transform", - "category": "Structure", - "startLine": 4, + "entity": { + "logicalId": "WildcardPolicy", + "entityType": "Resource", + "resourceType": "AWS::IAM::Policy" + }, + "propertyPath": "Properties", + "category": "Schema", + "startLine": 14, "startColumn": 5, - "endLine": 4, - "endColumn": 6, - "ruleDescription": "Validate Transform configuration", - "phase": "PARSE" + "endLine": 14, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "ruleDescription": "Value not valid under anyOf", + "phase": "SCHEMA", + "context": { + "expectedConstraint": "at least one anyOf branch", + "extra": { + "branchCount": 3, + "branchFailures": [ + { + "branch": 1, + "reasons": [ + { + "message": "'Users' is a required property", + "propertyPath": "Properties" + } + ] + }, + { + "branch": 2, + "reasons": [ + { + "message": "'Groups' is a required property", + "propertyPath": "Properties" + } + ] + }, + { + "branch": 3, + "reasons": [ + { + "message": "'Roles' is a required property", + "propertyPath": "Properties" + } + ] + } + ], + "compositionKind": "anyOf", + "matchCount": 0, + "matchOutcome": "zeroMatches", + "validPropertyCombinations": [ + [ + "Groups" + ], + [ + "Roles" + ], + [ + "Users" + ] + ] + } + } + }, + { + "ruleId": "W2508", + "severity": "WARN", + "message": "Security group allows 0.0.0.0/0 access to sensitive port 22 (range 22-22)", + "source": "ENGINE", + "entity": { + "logicalId": "OpenSSH", + "entityType": "Resource", + "resourceType": "AWS::EC2::SecurityGroup" + }, + "propertyPath": "Properties.SecurityGroupIngress", + "suggestedFix": "Restrict the CIDR range to specific IP addresses", + "category": "Security", + "startLine": 7, + "startColumn": 7, + "endLine": 7, + "endColumn": 27, + "ruleDescription": "Security group allows open access to sensitive port", + "phase": "LINT" + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "OpenSSH", + "entityType": "Resource", + "resourceType": "AWS::EC2::SecurityGroup" + }, + "propertyPath": "Properties.GroupDescription", + "category": "Best Practice", + "startLine": 6, + "startColumn": 7, + "endLine": 6, + "endColumn": 23, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'OpenSSH' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "OpenSSH", + "entityType": "Resource", + "resourceType": "AWS::EC2::SecurityGroup" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "bad/sg_bad_port_range.yaml": { + "filePath": "bad/sg_bad_port_range.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 1, + "warnings": 0, + "informational": 2, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "E9002", + "severity": "ERROR", + "message": "FromPort 443 is greater than ToPort 80", + "source": "ENGINE", + "entity": { + "logicalId": "SG", + "entityType": "Resource", + "resourceType": "AWS::EC2::SecurityGroup" + }, + "propertyPath": "Properties.SecurityGroupIngress.0", + "suggestedFix": "Set FromPort to a value less than or equal to ToPort", + "category": "Resource", + "startLine": 8, + "startColumn": 21, + "endLine": 8, + "endColumn": 22, + "ruleDescription": "SecurityGroup FromPort must be <= ToPort for the TCP and UDP protocols", + "phase": "LINT", + "context": { + "actualValue": [ + { + "IpProtocol": "tcp", + "FromPort": 443, + "ToPort": 80, + "CidrIp": "10.0.0.0/8" + } + ] + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "SG", + "entityType": "Resource", + "resourceType": "AWS::EC2::SecurityGroup" + }, + "propertyPath": "Properties.GroupDescription", + "category": "Best Practice", + "startLine": 6, + "startColumn": 7, + "endLine": 6, + "endColumn": 23, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'SG' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "SG", + "entityType": "Resource", + "resourceType": "AWS::EC2::SecurityGroup" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "bad/sg_open_egress.yaml": { + "filePath": "bad/sg_open_egress.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 1, + "errors": 0, + "warnings": 0, + "informational": 2, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "F3021", + "severity": "FATAL", + "message": "'VpcId' is a dependency of 'SecurityGroupEgress'", + "source": "SCHEMA", + "entity": { + "logicalId": "OpenSG", + "entityType": "Resource", + "resourceType": "AWS::EC2::SecurityGroup" + }, + "propertyPath": "Properties", + "suggestedFix": "Add 'VpcId' when 'SecurityGroupEgress' is specified", + "category": "Schema", + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Dependent property required", + "phase": "SCHEMA" + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "OpenSG", + "entityType": "Resource", + "resourceType": "AWS::EC2::SecurityGroup" + }, + "propertyPath": "Properties.GroupDescription", + "category": "Best Practice", + "startLine": 6, + "startColumn": 7, + "endLine": 6, + "endColumn": 23, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'OpenSG' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "OpenSG", + "entityType": "Resource", + "resourceType": "AWS::EC2::SecurityGroup" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "bad/simple_sub_param.yaml": { + "filePath": "bad/simple_sub_param.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 2, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "Bucket", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" + }, + "propertyPath": "Properties.BucketName", + "category": "Best Practice", + "startLine": 9, + "startColumn": 7, + "endLine": 9, + "endColumn": 17, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "dynamic (Sub:${Env})" + } + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "Bucket", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 8, + "startColumn": 5, + "endLine": 8, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "bad/sns_cross_account.yaml": { + "filePath": "bad/sns_cross_account.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 2, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 2, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'TopicName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "Topic", + "entityType": "Resource", + "resourceType": "AWS::SNS::Topic" + }, + "propertyPath": "Properties.TopicName", + "category": "Best Practice", + "startLine": 6, + "startColumn": 7, + "endLine": 6, + "endColumn": 16, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sns", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Topic' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "Topic", + "entityType": "Resource", + "resourceType": "AWS::SNS::Topic" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "bad/some_logs_stream_lambda.yaml": { + "filePath": "bad/some_logs_stream_lambda.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 8, + "counts": { + "fatal": 0, + "errors": 4, + "warnings": 0, + "informational": 20, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "E2533", + "severity": "ERROR", + "message": "Runtime 'python3.6' was deprecated on '2022-07-18'. Creation was disabled on '2022-07-18', and updates were disabled on '2022-08-29'. Please consider updating to 'python3.14'", + "source": "CFN_LINT", + "entity": { + "logicalId": "FunctionA", + "entityType": "Resource", + "resourceType": "AWS::Serverless::Function" + }, + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 21, + "startColumn": 7, + "endLine": 21, + "endColumn": 14, + "ruleDescription": "Check if Lambda Function Runtimes are updatable", + "phase": "SCHEMA", + "context": { + "actualValue": "python3.6", + "lifecycle": "end-of-life" + } + }, + { + "ruleId": "E2533", + "severity": "ERROR", + "message": "Runtime 'python3.6' was deprecated on '2022-07-18'. Creation was disabled on '2022-07-18', and updates were disabled on '2022-08-29'. Please consider updating to 'python3.14'", + "source": "CFN_LINT", + "entity": { + "logicalId": "FunctionB", + "entityType": "Resource", + "resourceType": "AWS::Serverless::Function" + }, + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 33, + "startColumn": 7, + "endLine": 33, + "endColumn": 14, + "ruleDescription": "Check if Lambda Function Runtimes are updatable", + "phase": "SCHEMA", + "context": { + "actualValue": "python3.6", + "lifecycle": "end-of-life" + } + }, + { + "ruleId": "E2533", + "severity": "ERROR", + "message": "Runtime 'python3.6' was deprecated on '2022-07-18'. Creation was disabled on '2022-07-18', and updates were disabled on '2022-08-29'. Please consider updating to 'python3.14'", + "source": "CFN_LINT", + "entity": { + "logicalId": "FunctionC", + "entityType": "Resource", + "resourceType": "AWS::Serverless::Function" + }, + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 44, + "startColumn": 7, + "endLine": 44, + "endColumn": 14, + "ruleDescription": "Check if Lambda Function Runtimes are updatable", + "phase": "SCHEMA", + "context": { + "actualValue": "python3.6", + "lifecycle": "end-of-life" + } + }, + { + "ruleId": "E2533", + "severity": "ERROR", + "message": "Runtime 'python3.6' was deprecated on '2022-07-18'. Creation was disabled on '2022-07-18', and updates were disabled on '2022-08-29'. Please consider updating to 'python3.14'", + "source": "CFN_LINT", + "entity": { + "logicalId": "LogSubscriptionFunction", + "entityType": "Resource", + "resourceType": "AWS::Serverless::Function" + }, + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 56, + "startColumn": 7, + "endLine": 56, + "endColumn": 14, + "ruleDescription": "Check if Lambda Function Runtimes are updatable", + "phase": "SCHEMA", + "context": { + "actualValue": "python3.6", + "lifecycle": "end-of-life" + } + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "FunctionALogGroup", + "entityType": "Resource", + "resourceType": "AWS::Logs::LogGroup" + }, + "category": "Best Practice", + "startLine": 22, + "startColumn": 3, + "endLine": 22, + "endColumn": 20, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "FunctionALogGroup", + "entityType": "Resource", + "resourceType": "AWS::Logs::LogGroup" + }, + "category": "Best Practice", + "startLine": 22, + "startColumn": 3, + "endLine": 22, + "endColumn": 20, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "FunctionBLogGroup", + "entityType": "Resource", + "resourceType": "AWS::Logs::LogGroup" + }, + "category": "Best Practice", + "startLine": 34, + "startColumn": 3, + "endLine": 34, + "endColumn": 20, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "FunctionBLogGroup", + "entityType": "Resource", + "resourceType": "AWS::Logs::LogGroup" + }, + "category": "Best Practice", + "startLine": 34, + "startColumn": 3, + "endLine": 34, + "endColumn": 20, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "FunctionCLogGroup", + "entityType": "Resource", + "resourceType": "AWS::Logs::LogGroup" + }, + "category": "Best Practice", + "startLine": 45, + "startColumn": 3, + "endLine": 45, + "endColumn": 20, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "FunctionCLogGroup", + "entityType": "Resource", + "resourceType": "AWS::Logs::LogGroup" + }, + "category": "Best Practice", + "startLine": 45, + "startColumn": 3, + "endLine": 45, + "endColumn": 20, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "LogSubscriptionFunctionLogGroup", + "entityType": "Resource", + "resourceType": "AWS::Logs::LogGroup" + }, + "category": "Best Practice", + "startLine": 78, + "startColumn": 3, + "endLine": 78, + "endColumn": 34, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "LogSubscriptionFunctionLogGroup", + "entityType": "Resource", + "resourceType": "AWS::Logs::LogGroup" + }, + "category": "Best Practice", + "startLine": 78, + "startColumn": 3, + "endLine": 78, + "endColumn": 34, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'LogGroupName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "FunctionALogGroup", + "entityType": "Resource", + "resourceType": "AWS::Logs::LogGroup" + }, + "propertyPath": "Properties.LogGroupName", + "category": "Best Practice", + "startLine": 25, + "startColumn": 7, + "endLine": 25, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-logs.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "dynamic (Sub:/aws/lambda/${FunctionA})" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'LogGroupName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "FunctionBLogGroup", + "entityType": "Resource", + "resourceType": "AWS::Logs::LogGroup" + }, + "propertyPath": "Properties.LogGroupName", + "category": "Best Practice", + "startLine": 37, + "startColumn": 7, + "endLine": 37, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-logs.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "dynamic (Sub:/aws/lambda/${FunctionB})" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'LogGroupName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "FunctionCLogGroup", + "entityType": "Resource", + "resourceType": "AWS::Logs::LogGroup" + }, + "propertyPath": "Properties.LogGroupName", + "category": "Best Practice", + "startLine": 48, + "startColumn": 7, + "endLine": 48, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-logs.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "dynamic (Sub:/aws/lambda/${FunctionC})" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'LogGroupName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "LogSubscriptionFunctionLogGroup", + "entityType": "Resource", + "resourceType": "AWS::Logs::LogGroup" + }, + "propertyPath": "Properties.LogGroupName", + "category": "Best Practice", + "startLine": 81, + "startColumn": 7, + "endLine": 81, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-logs.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "dynamic (Sub:/aws/lambda/${LogSubscriptionFunction})" + } + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'FunctionA' of type 'AWS::Serverless::Function' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "FunctionA", + "entityType": "Resource", + "resourceType": "AWS::Serverless::Function" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 18, + "startColumn": 5, + "endLine": 18, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'FunctionALogGroup' of type 'AWS::Logs::LogGroup' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "FunctionALogGroup", + "entityType": "Resource", + "resourceType": "AWS::Logs::LogGroup" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 24, + "startColumn": 5, + "endLine": 24, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'FunctionB' of type 'AWS::Serverless::Function' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "FunctionB", + "entityType": "Resource", + "resourceType": "AWS::Serverless::Function" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 30, + "startColumn": 5, + "endLine": 30, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'FunctionBLogGroup' of type 'AWS::Logs::LogGroup' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "FunctionBLogGroup", + "entityType": "Resource", + "resourceType": "AWS::Logs::LogGroup" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 36, + "startColumn": 5, + "endLine": 36, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'FunctionC' of type 'AWS::Serverless::Function' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "FunctionC", + "entityType": "Resource", + "resourceType": "AWS::Serverless::Function" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 41, + "startColumn": 5, + "endLine": 41, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'FunctionCLogGroup' of type 'AWS::Logs::LogGroup' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "FunctionCLogGroup", + "entityType": "Resource", + "resourceType": "AWS::Logs::LogGroup" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 47, + "startColumn": 5, + "endLine": 47, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'LogSubscriptionFunction' of type 'AWS::Serverless::Function' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "LogSubscriptionFunction", + "entityType": "Resource", + "resourceType": "AWS::Serverless::Function" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 53, + "startColumn": 5, + "endLine": 53, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'LogSubscriptionFunctionLogGroup' of type 'AWS::Logs::LogGroup' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "LogSubscriptionFunctionLogGroup", + "entityType": "Resource", + "resourceType": "AWS::Logs::LogGroup" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 80, + "startColumn": 5, + "endLine": 80, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "bad/sqs_fifo_no_suffix.yaml": { + "filePath": "bad/sqs_fifo_no_suffix.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 2, + "warnings": 0, + "informational": 6, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "E2504", + "severity": "ERROR", + "message": "FIFO queue name 'my-queue' must end with '.fifo'", + "source": "ENGINE", + "entity": { + "logicalId": "FifoQueue", + "entityType": "Resource", + "resourceType": "AWS::SQS::Queue" + }, + "propertyPath": "Properties.QueueName", + "category": "Resource", + "startLine": 6, + "startColumn": 7, + "endLine": 6, + "endColumn": 16, + "ruleDescription": "FIFO queue name must end with .fifo", + "phase": "LINT" + }, + { + "ruleId": "E3501", + "severity": "ERROR", + "message": "FIFO queue name 'my-queue' must end with '.fifo'", + "source": "CFN_LINT", + "entity": { + "logicalId": "FifoQueue", + "entityType": "Resource", + "resourceType": "AWS::SQS::Queue" + }, + "propertyPath": "Properties.QueueName", + "suggestedFix": "Append .fifo to the queue name", + "category": "Resource", + "startLine": 6, + "startColumn": 7, + "endLine": 6, + "endColumn": 16, + "ruleDescription": "Validate SQS queue properties are valid", + "phase": "LINT", + "context": { + "extra": { + "queue_name": "my-queue" + } + } + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "FifoQueue", + "entityType": "Resource", + "resourceType": "AWS::SQS::Queue" + }, + "category": "Best Practice", + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 12, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "FifoQueue", + "entityType": "Resource", + "resourceType": "AWS::SQS::Queue" + }, + "category": "Best Practice", + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 12, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3013", + "severity": "INFO", + "message": "'MessageRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "FifoQueue", + "entityType": "Resource", + "resourceType": "AWS::SQS::Queue" + }, + "propertyPath": "Properties", + "category": "Best Practice", + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "phase": "LINT" + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'QueueName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "FifoQueue", + "entityType": "Resource", + "resourceType": "AWS::SQS::Queue" + }, + "propertyPath": "Properties.QueueName", + "category": "Best Practice", + "startLine": 6, + "startColumn": 7, + "endLine": 6, + "endColumn": 16, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sqs.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'FifoQueue' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "FifoQueue", + "entityType": "Resource", + "resourceType": "AWS::SQS::Queue" + }, + "propertyPath": "Properties.FifoQueue", + "category": "Best Practice", + "startLine": 7, + "startColumn": 7, + "endLine": 7, + "endColumn": 16, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sqs.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'FifoQueue' of type 'AWS::SQS::Queue' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "FifoQueue", + "entityType": "Resource", + "resourceType": "AWS::SQS::Queue" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "bad/sqs_fifo_standard_dlq.yaml": { + "filePath": "bad/sqs_fifo_standard_dlq.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 2, + "counts": { + "fatal": 0, + "errors": 1, + "warnings": 0, + "informational": 11, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "E3502", + "severity": "ERROR", + "message": "Source queue type 'FIFO' does not match destination queue type 'standard'", + "source": "CFN_LINT", + "entity": { + "logicalId": "MainQueue", + "entityType": "Resource", + "resourceType": "AWS::SQS::Queue" + }, + "propertyPath": "Properties.RedrivePolicy", + "category": "Resource", + "startLine": 12, + "startColumn": 7, + "endLine": 12, + "endColumn": 20, + "ruleDescription": "Validate SQS DLQ queues are the same type", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "DLQ", + "entityType": "Resource", + "resourceType": "AWS::SQS::Queue" + }, + "category": "Best Practice", + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 6, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "DLQ", + "entityType": "Resource", + "resourceType": "AWS::SQS::Queue" + }, + "category": "Best Practice", + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 6, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "MainQueue", + "entityType": "Resource", + "resourceType": "AWS::SQS::Queue" + }, + "category": "Best Practice", + "startLine": 7, + "startColumn": 3, + "endLine": 7, + "endColumn": 12, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "MainQueue", + "entityType": "Resource", + "resourceType": "AWS::SQS::Queue" + }, + "category": "Best Practice", + "startLine": 7, + "startColumn": 3, + "endLine": 7, + "endColumn": 12, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3013", + "severity": "INFO", + "message": "'MessageRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "DLQ", + "entityType": "Resource", + "resourceType": "AWS::SQS::Queue" + }, + "propertyPath": "Properties", + "category": "Best Practice", + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "phase": "LINT" + }, + { + "ruleId": "I3013", + "severity": "INFO", + "message": "'MessageRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "MainQueue", + "entityType": "Resource", + "resourceType": "AWS::SQS::Queue" + }, + "propertyPath": "Properties", + "category": "Best Practice", + "startLine": 9, + "startColumn": 5, + "endLine": 9, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "phase": "LINT" + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'QueueName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "DLQ", + "entityType": "Resource", + "resourceType": "AWS::SQS::Queue" + }, + "propertyPath": "Properties.QueueName", + "category": "Best Practice", + "startLine": 6, + "startColumn": 7, + "endLine": 6, + "endColumn": 16, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sqs.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'QueueName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "MainQueue", + "entityType": "Resource", + "resourceType": "AWS::SQS::Queue" + }, + "propertyPath": "Properties.QueueName", + "category": "Best Practice", + "startLine": 10, + "startColumn": 7, + "endLine": 10, + "endColumn": 16, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sqs.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'FifoQueue' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "MainQueue", + "entityType": "Resource", + "resourceType": "AWS::SQS::Queue" + }, + "propertyPath": "Properties.FifoQueue", + "category": "Best Practice", + "startLine": 11, + "startColumn": 7, + "endLine": 11, + "endColumn": 16, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sqs.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'DLQ' of type 'AWS::SQS::Queue' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "DLQ", + "entityType": "Resource", + "resourceType": "AWS::SQS::Queue" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'MainQueue' of type 'AWS::SQS::Queue' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "MainQueue", + "entityType": "Resource", + "resourceType": "AWS::SQS::Queue" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 9, + "startColumn": 5, + "endLine": 9, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "bad/ssm_document_invalid.yaml": { + "filePath": "bad/ssm_document_invalid.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 1, + "warnings": 0, + "informational": 3, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "E3051", + "severity": "ERROR", + "message": "SSM Document Content must include 'schemaVersion'", + "source": "CFN_LINT", + "entity": { + "logicalId": "Doc", + "entityType": "Resource", + "resourceType": "AWS::SSM::Document" + }, + "propertyPath": "Properties.Content", + "category": "Resource", + "startLine": 7, + "startColumn": 7, + "endLine": 7, + "endColumn": 14, + "ruleDescription": "Validate the structure of a SSM document", + "phase": "LINT" + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'DocumentType' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "Doc", + "entityType": "Resource", + "resourceType": "AWS::SSM::Document" + }, + "propertyPath": "Properties.DocumentType", + "category": "Best Practice", + "startLine": 6, + "startColumn": 7, + "endLine": 6, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ssm", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Content' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "Doc", + "entityType": "Resource", + "resourceType": "AWS::SSM::Document" + }, + "propertyPath": "Properties.Content", + "category": "Best Practice", + "startLine": 7, + "startColumn": 7, + "endLine": 7, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ssm", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Doc' of type 'AWS::SSM::Document' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "Doc", + "entityType": "Resource", + "resourceType": "AWS::SSM::Document" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "bad/stepfunctions_bad_start_at.yaml": { + "filePath": "bad/stepfunctions_bad_start_at.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 1, + "warnings": 1, + "informational": 1, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "E3601", + "severity": "ERROR", + "message": "StartAt 'NonExistentState' does not reference a valid state at StartAt", + "source": "CFN_LINT", + "entity": { + "logicalId": "SM", + "entityType": "Resource", + "resourceType": "AWS::StepFunctions::StateMachine" + }, + "propertyPath": "Properties.DefinitionString", + "category": "Resource", + "startLine": 6, + "startColumn": 7, + "endLine": 6, + "endColumn": 23, + "ruleDescription": "Validate the structure of a StateMachine definition", + "phase": "LINT" + }, + { + "ruleId": "W9002", + "severity": "WARN", + "message": "Property 'RoleArn' has a hardcoded ARN - use Ref, GetAtt, or a parameter instead", + "source": "ENGINE", + "entity": { + "logicalId": "SM", + "entityType": "Resource", + "resourceType": "AWS::StepFunctions::StateMachine" + }, + "propertyPath": "Properties.RoleArn", + "category": "Best Practice", + "startLine": 16, + "startColumn": 7, + "endLine": 16, + "endColumn": 14, + "ruleDescription": "Hardcoded ARN property", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'SM' of type 'AWS::StepFunctions::StateMachine' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "SM", + "entityType": "Resource", + "resourceType": "AWS::StepFunctions::StateMachine" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "bad/stepfunctions_invalid_state.yaml": { + "filePath": "bad/stepfunctions_invalid_state.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 2, + "warnings": 1, + "informational": 1, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "E3601", + "severity": "ERROR", + "message": "StartAt 'NonExistentState' does not reference a valid state at StartAt", + "source": "CFN_LINT", + "entity": { + "logicalId": "StateMachine", + "entityType": "Resource", + "resourceType": "AWS::StepFunctions::StateMachine" + }, + "propertyPath": "Properties.DefinitionString", + "category": "Resource", + "startLine": 7, + "startColumn": 7, + "endLine": 7, + "endColumn": 23, + "ruleDescription": "Validate the structure of a StateMachine definition", + "phase": "LINT" + }, + { + "ruleId": "E3601", + "severity": "ERROR", + "message": "State 'DoWork' has invalid Type 'InvalidType'. Must be one of ['Task', 'Pass', 'Choice', 'Wait', 'Succeed', 'Fail', 'Parallel', 'Map']", + "source": "CFN_LINT", + "entity": { + "logicalId": "StateMachine", + "entityType": "Resource", + "resourceType": "AWS::StepFunctions::StateMachine" + }, + "propertyPath": "Properties.DefinitionString", + "category": "Resource", + "startLine": 7, + "startColumn": 7, + "endLine": 7, + "endColumn": 23, + "ruleDescription": "Validate the structure of a StateMachine definition", + "phase": "LINT" + }, + { + "ruleId": "W9002", + "severity": "WARN", + "message": "Property 'RoleArn' has a hardcoded ARN - use Ref, GetAtt, or a parameter instead", + "source": "ENGINE", + "entity": { + "logicalId": "StateMachine", + "entityType": "Resource", + "resourceType": "AWS::StepFunctions::StateMachine" + }, + "propertyPath": "Properties.RoleArn", + "category": "Best Practice", + "startLine": 6, + "startColumn": 7, + "endLine": 6, + "endColumn": 14, + "ruleDescription": "Hardcoded ARN property", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'StateMachine' of type 'AWS::StepFunctions::StateMachine' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "StateMachine", + "entityType": "Resource", + "resourceType": "AWS::StepFunctions::StateMachine" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "bad/string.yaml": { + "filePath": "bad/string.yaml", + "status": "ERROR", + "metadata": { + "resourcesScanned": 0, + "counts": { + "fatal": 1, + "errors": 0, + "warnings": 0, + "informational": 0, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "F1101", + "severity": "FATAL", + "message": "Template root must be a YAML mapping", + "source": "SCHEMA", + "category": "Structure", + "startLine": 1, + "startColumn": 1, + "endLine": 1, + "endColumn": 1, + "ruleDescription": "Invalid YAML/JSON syntax", + "phase": "PARSE" + } + ] + }, + "bad/sub_needed.yaml": { + "filePath": "bad/sub_needed.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 1, + "errors": 1, + "warnings": 1, + "informational": 2, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "F3031", + "severity": "FATAL", + "message": "'${MyParam}-bucket' does not match pattern '^([a-z0-9][a-z0-9.-]*[a-z0-9])?$'", + "source": "SCHEMA", + "entity": { + "logicalId": "Bucket", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" + }, + "propertyPath": "Properties.BucketName", + "category": "Schema", + "startLine": 9, + "startColumn": 7, + "endLine": 9, + "endColumn": 17, + "ruleDescription": "Value does not match pattern", + "phase": "SCHEMA", + "context": { + "actualValue": "${MyParam}-bucket", + "expectedConstraint": "^([a-z0-9][a-z0-9.-]*[a-z0-9])?$" + } + }, + { + "ruleId": "E1029", + "severity": "ERROR", + "message": "Found an embedded parameter '${MyParam}' outside of an 'Fn::Sub' at Properties.BucketName", + "source": "CFN_LINT", + "entity": { + "logicalId": "Bucket", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" + }, + "propertyPath": "Properties.BucketName", + "suggestedFix": "Wrap the string with Fn::Sub", + "category": "Intrinsic Function", + "startLine": 9, + "startColumn": 7, + "endLine": 9, + "endColumn": 17, + "ruleDescription": "Substitution variable ${X} requires Fn::Sub", + "phase": "LINT" + }, + { + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'MyParam' is not referenced anywhere in the template", + "source": "CFN_LINT", + "entity": { + "logicalId": "MyParam", + "entityType": "Parameter" + }, + "propertyPath": "Parameters/MyParam", + "category": "Best Practice", + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 10, + "ruleDescription": "Check if Parameters are Used", + "phase": "LINT" + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "Bucket", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" + }, + "propertyPath": "Properties.BucketName", + "category": "Best Practice", + "startLine": 9, + "startColumn": 7, + "endLine": 9, + "endColumn": 17, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "Bucket", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 8, + "startColumn": 5, + "endLine": 8, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "bad/sub_nested_intrinsic.yaml": { + "filePath": "bad/sub_nested_intrinsic.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 2, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 3, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "Bucket", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" + }, + "propertyPath": "Properties.BucketName", + "category": "Best Practice", + "startLine": 6, + "startColumn": 7, + "endLine": 6, + "endColumn": 17, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "Bucket", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'OtherBucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "OtherBucket", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 7, + "startColumn": 3, + "endLine": 7, + "endColumn": 14, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "bad/subnet_outside_vpc.yaml": { + "filePath": "bad/subnet_outside_vpc.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 2, + "counts": { + "fatal": 0, + "errors": 1, + "warnings": 0, + "informational": 5, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "E3059", + "severity": "ERROR", + "message": "Subnet CIDR '192.168.1.0/24' is not within VPC CIDR '10.0.0.0/16'", + "source": "CFN_LINT", + "entity": { + "logicalId": "SubnetOutside", + "entityType": "Resource", + "resourceType": "AWS::EC2::Subnet" + }, + "propertyPath": "Properties.CidrBlock", + "category": "Resource", + "startLine": 11, + "startColumn": 7, + "endLine": 11, + "endColumn": 16, + "ruleDescription": "Validate subnet CIDRs are within the CIDRs of the VPC", + "phase": "LINT" + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "VPC", + "entityType": "Resource", + "resourceType": "AWS::EC2::VPC" + }, + "propertyPath": "Properties.CidrBlock", + "category": "Best Practice", + "startLine": 6, + "startColumn": 7, + "endLine": 6, + "endColumn": 16, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "SubnetOutside", + "entityType": "Resource", + "resourceType": "AWS::EC2::Subnet" + }, + "propertyPath": "Properties.VpcId", + "category": "Best Practice", + "startLine": 10, + "startColumn": 7, + "endLine": 10, + "endColumn": 12, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'VPC'" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "SubnetOutside", + "entityType": "Resource", + "resourceType": "AWS::EC2::Subnet" + }, + "propertyPath": "Properties.CidrBlock", + "category": "Best Practice", + "startLine": 11, + "startColumn": 7, + "endLine": 11, + "endColumn": 16, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'VPC' of type 'AWS::EC2::VPC' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "VPC", + "entityType": "Resource", + "resourceType": "AWS::EC2::VPC" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'SubnetOutside' of type 'AWS::EC2::Subnet' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "SubnetOutside", + "entityType": "Resource", + "resourceType": "AWS::EC2::Subnet" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 9, + "startColumn": 5, + "endLine": 9, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "bad/subnet_overlap.yaml": { + "filePath": "bad/subnet_overlap.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 3, + "counts": { + "fatal": 0, + "errors": 1, + "warnings": 2, + "informational": 10, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "E3060", + "severity": "ERROR", + "message": "'10.0.0.0/24' overlaps with '10.0.0.0/24'", + "source": "CFN_LINT", + "entity": { + "logicalId": "SubnetB", + "entityType": "Resource", + "resourceType": "AWS::EC2::Subnet" + }, + "propertyPath": "Properties.CidrBlock", + "category": "Resource", + "startLine": 17, + "startColumn": 7, + "endLine": 17, + "endColumn": 16, + "relatedResources": [ + { + "resource": { + "id": "SubnetA", + "resourceType": "AWS::EC2::Subnet" + }, + "location": { + "startLine": 7, + "startColumn": 3, + "endLine": 7, + "endColumn": 10 + }, + "message": "Overlapping subnet CIDR 10.0.0.0/24" + } + ], + "ruleDescription": "Validate subnet CIDRs do not overlap with other subnets", + "phase": "LINT", + "context": { + "extra": { + "cidr": "10.0.0.0/24" + } + } + }, + { + "ruleId": "W3010", + "severity": "WARN", + "message": "Avoid hardcoding availability zones 'us-east-1a'", + "source": "CFN_LINT", + "entity": { + "logicalId": "SubnetA", + "entityType": "Resource", + "resourceType": "AWS::EC2::Subnet" + }, + "propertyPath": "Properties.AvailabilityZone", + "category": "Best Practice", + "startLine": 12, + "startColumn": 7, + "endLine": 12, + "endColumn": 23, + "ruleDescription": "Availability zone properties should not be hardcoded", + "phase": "LINT" + }, + { + "ruleId": "W3010", + "severity": "WARN", + "message": "Avoid hardcoding availability zones 'us-east-1b'", + "source": "CFN_LINT", + "entity": { + "logicalId": "SubnetB", + "entityType": "Resource", + "resourceType": "AWS::EC2::Subnet" + }, + "propertyPath": "Properties.AvailabilityZone", + "category": "Best Practice", + "startLine": 18, + "startColumn": 7, + "endLine": 18, + "endColumn": 23, + "ruleDescription": "Availability zone properties should not be hardcoded", + "phase": "LINT" + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "VPC", + "entityType": "Resource", + "resourceType": "AWS::EC2::VPC" + }, + "propertyPath": "Properties.CidrBlock", + "category": "Best Practice", + "startLine": 6, + "startColumn": 7, + "endLine": 6, + "endColumn": 16, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "SubnetA", + "entityType": "Resource", + "resourceType": "AWS::EC2::Subnet" + }, + "propertyPath": "Properties.VpcId", + "category": "Best Practice", + "startLine": 10, + "startColumn": 7, + "endLine": 10, + "endColumn": 12, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'VPC'" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "SubnetA", + "entityType": "Resource", + "resourceType": "AWS::EC2::Subnet" + }, + "propertyPath": "Properties.CidrBlock", + "category": "Best Practice", + "startLine": 11, + "startColumn": 7, + "endLine": 11, + "endColumn": 16, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "SubnetA", + "entityType": "Resource", + "resourceType": "AWS::EC2::Subnet" + }, + "propertyPath": "Properties.AvailabilityZone", + "category": "Best Practice", + "startLine": 12, + "startColumn": 7, + "endLine": 12, + "endColumn": 23, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "SubnetB", + "entityType": "Resource", + "resourceType": "AWS::EC2::Subnet" + }, + "propertyPath": "Properties.VpcId", + "category": "Best Practice", + "startLine": 16, + "startColumn": 7, + "endLine": 16, + "endColumn": 12, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'VPC'" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "SubnetB", + "entityType": "Resource", + "resourceType": "AWS::EC2::Subnet" + }, + "propertyPath": "Properties.CidrBlock", + "category": "Best Practice", + "startLine": 17, + "startColumn": 7, + "endLine": 17, + "endColumn": 16, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "SubnetB", + "entityType": "Resource", + "resourceType": "AWS::EC2::Subnet" + }, + "propertyPath": "Properties.AvailabilityZone", + "category": "Best Practice", + "startLine": 18, + "startColumn": 7, + "endLine": 18, + "endColumn": 23, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'VPC' of type 'AWS::EC2::VPC' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "VPC", + "entityType": "Resource", + "resourceType": "AWS::EC2::VPC" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'SubnetA' of type 'AWS::EC2::Subnet' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "SubnetA", + "entityType": "Resource", + "resourceType": "AWS::EC2::Subnet" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 9, + "startColumn": 5, + "endLine": 9, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'SubnetB' of type 'AWS::EC2::Subnet' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "SubnetB", + "entityType": "Resource", + "resourceType": "AWS::EC2::Subnet" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 15, + "startColumn": 5, + "endLine": 15, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "bad/subnet_overlap_multi.yaml": { + "filePath": "bad/subnet_overlap_multi.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 5, + "counts": { + "fatal": 0, + "errors": 4, + "warnings": 4, + "informational": 18, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "E3059", + "severity": "ERROR", + "message": "Subnet CIDR '172.16.0.0/16' is not within VPC CIDR '10.0.0.0/8'", + "source": "CFN_LINT", + "entity": { + "logicalId": "SubnetC", + "entityType": "Resource", + "resourceType": "AWS::EC2::Subnet" + }, + "propertyPath": "Properties.CidrBlock", + "category": "Resource", + "startLine": 28, + "startColumn": 7, + "endLine": 28, + "endColumn": 16, + "ruleDescription": "Validate subnet CIDRs are within the CIDRs of the VPC", + "phase": "LINT" + }, + { + "ruleId": "E3060", + "severity": "ERROR", + "message": "'10.0.0.0/16' overlaps with '10.0.0.0/8'", + "source": "CFN_LINT", + "entity": { + "logicalId": "SubnetB", + "entityType": "Resource", + "resourceType": "AWS::EC2::Subnet" + }, + "propertyPath": "Properties.CidrBlock", + "category": "Resource", + "startLine": 22, + "startColumn": 7, + "endLine": 22, + "endColumn": 16, + "relatedResources": [ + { + "resource": { + "id": "SubnetA", + "resourceType": "AWS::EC2::Subnet" + }, + "location": { + "startLine": 12, + "startColumn": 3, + "endLine": 12, + "endColumn": 10 + }, + "message": "Overlapping subnet CIDR 10.0.0.0/8" + } + ], + "ruleDescription": "Validate subnet CIDRs do not overlap with other subnets", + "phase": "LINT", + "context": { + "extra": { + "cidr": "10.0.0.0/16" + } + } + }, + { + "ruleId": "E3060", + "severity": "ERROR", + "message": "'10.0.1.0/24' overlaps with '10.0.0.0/16'", + "source": "CFN_LINT", + "entity": { + "logicalId": "SubnetD", + "entityType": "Resource", + "resourceType": "AWS::EC2::Subnet" + }, + "propertyPath": "Properties.CidrBlock", + "category": "Resource", + "startLine": 34, + "startColumn": 7, + "endLine": 34, + "endColumn": 16, + "relatedResources": [ + { + "resource": { + "id": "SubnetB", + "resourceType": "AWS::EC2::Subnet" + }, + "location": { + "startLine": 18, + "startColumn": 3, + "endLine": 18, + "endColumn": 10 + }, + "message": "Overlapping subnet CIDR 10.0.0.0/16" + } + ], + "ruleDescription": "Validate subnet CIDRs do not overlap with other subnets", + "phase": "LINT", + "context": { + "extra": { + "cidr": "10.0.1.0/24" + } + } + }, + { + "ruleId": "E3060", + "severity": "ERROR", + "message": "'10.0.1.0/24' overlaps with '10.0.0.0/8'", + "source": "CFN_LINT", + "entity": { + "logicalId": "SubnetD", + "entityType": "Resource", + "resourceType": "AWS::EC2::Subnet" + }, + "propertyPath": "Properties.CidrBlock", + "category": "Resource", + "startLine": 34, + "startColumn": 7, + "endLine": 34, + "endColumn": 16, + "relatedResources": [ + { + "resource": { + "id": "SubnetA", + "resourceType": "AWS::EC2::Subnet" + }, + "location": { + "startLine": 12, + "startColumn": 3, + "endLine": 12, + "endColumn": 10 + }, + "message": "Overlapping subnet CIDR 10.0.0.0/8" + } + ], + "ruleDescription": "Validate subnet CIDRs do not overlap with other subnets", + "phase": "LINT", + "context": { + "extra": { + "cidr": "10.0.1.0/24" + } + } + }, + { + "ruleId": "W3010", + "severity": "WARN", + "message": "Avoid hardcoding availability zones 'us-east-1a'", + "source": "CFN_LINT", + "entity": { + "logicalId": "SubnetA", + "entityType": "Resource", + "resourceType": "AWS::EC2::Subnet" + }, + "propertyPath": "Properties.AvailabilityZone", + "category": "Best Practice", + "startLine": 17, + "startColumn": 7, + "endLine": 17, + "endColumn": 23, + "ruleDescription": "Availability zone properties should not be hardcoded", + "phase": "LINT" + }, + { + "ruleId": "W3010", + "severity": "WARN", + "message": "Avoid hardcoding availability zones 'us-east-1b'", + "source": "CFN_LINT", + "entity": { + "logicalId": "SubnetB", + "entityType": "Resource", + "resourceType": "AWS::EC2::Subnet" + }, + "propertyPath": "Properties.AvailabilityZone", + "category": "Best Practice", + "startLine": 23, + "startColumn": 7, + "endLine": 23, + "endColumn": 23, + "ruleDescription": "Availability zone properties should not be hardcoded", + "phase": "LINT" + }, + { + "ruleId": "W3010", + "severity": "WARN", + "message": "Avoid hardcoding availability zones 'us-east-1c'", + "source": "CFN_LINT", + "entity": { + "logicalId": "SubnetC", + "entityType": "Resource", + "resourceType": "AWS::EC2::Subnet" + }, + "propertyPath": "Properties.AvailabilityZone", + "category": "Best Practice", + "startLine": 29, + "startColumn": 7, + "endLine": 29, + "endColumn": 23, + "ruleDescription": "Availability zone properties should not be hardcoded", + "phase": "LINT" + }, + { + "ruleId": "W3010", + "severity": "WARN", + "message": "Avoid hardcoding availability zones 'us-east-1d'", + "source": "CFN_LINT", + "entity": { + "logicalId": "SubnetD", + "entityType": "Resource", + "resourceType": "AWS::EC2::Subnet" + }, + "propertyPath": "Properties.AvailabilityZone", + "category": "Best Practice", + "startLine": 35, + "startColumn": 7, + "endLine": 35, + "endColumn": 23, + "ruleDescription": "Availability zone properties should not be hardcoded", + "phase": "LINT" + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "VPC", + "entityType": "Resource", + "resourceType": "AWS::EC2::VPC" + }, + "propertyPath": "Properties.CidrBlock", + "category": "Best Practice", + "startLine": 11, + "startColumn": 7, + "endLine": 11, + "endColumn": 16, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "SubnetA", + "entityType": "Resource", + "resourceType": "AWS::EC2::Subnet" + }, + "propertyPath": "Properties.VpcId", + "category": "Best Practice", + "startLine": 15, + "startColumn": 7, + "endLine": 15, + "endColumn": 12, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'VPC'" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "SubnetA", + "entityType": "Resource", + "resourceType": "AWS::EC2::Subnet" + }, + "propertyPath": "Properties.CidrBlock", + "category": "Best Practice", + "startLine": 16, + "startColumn": 7, + "endLine": 16, + "endColumn": 16, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "SubnetA", + "entityType": "Resource", + "resourceType": "AWS::EC2::Subnet" + }, + "propertyPath": "Properties.AvailabilityZone", + "category": "Best Practice", + "startLine": 17, + "startColumn": 7, + "endLine": 17, + "endColumn": 23, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "SubnetB", + "entityType": "Resource", + "resourceType": "AWS::EC2::Subnet" + }, + "propertyPath": "Properties.VpcId", + "category": "Best Practice", + "startLine": 21, + "startColumn": 7, + "endLine": 21, + "endColumn": 12, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'VPC'" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "SubnetB", + "entityType": "Resource", + "resourceType": "AWS::EC2::Subnet" + }, + "propertyPath": "Properties.CidrBlock", + "category": "Best Practice", + "startLine": 22, + "startColumn": 7, + "endLine": 22, + "endColumn": 16, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "SubnetB", + "entityType": "Resource", + "resourceType": "AWS::EC2::Subnet" + }, + "propertyPath": "Properties.AvailabilityZone", + "category": "Best Practice", + "startLine": 23, + "startColumn": 7, + "endLine": 23, + "endColumn": 23, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "SubnetC", + "entityType": "Resource", + "resourceType": "AWS::EC2::Subnet" + }, + "propertyPath": "Properties.VpcId", + "category": "Best Practice", + "startLine": 27, + "startColumn": 7, + "endLine": 27, + "endColumn": 12, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'VPC'" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "SubnetC", + "entityType": "Resource", + "resourceType": "AWS::EC2::Subnet" + }, + "propertyPath": "Properties.CidrBlock", + "category": "Best Practice", + "startLine": 28, + "startColumn": 7, + "endLine": 28, + "endColumn": 16, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "SubnetC", + "entityType": "Resource", + "resourceType": "AWS::EC2::Subnet" + }, + "propertyPath": "Properties.AvailabilityZone", + "category": "Best Practice", + "startLine": 29, + "startColumn": 7, + "endLine": 29, + "endColumn": 23, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "SubnetD", + "entityType": "Resource", + "resourceType": "AWS::EC2::Subnet" + }, + "propertyPath": "Properties.VpcId", + "category": "Best Practice", + "startLine": 33, + "startColumn": 7, + "endLine": 33, + "endColumn": 12, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'VPC'" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "SubnetD", + "entityType": "Resource", + "resourceType": "AWS::EC2::Subnet" + }, + "propertyPath": "Properties.CidrBlock", + "category": "Best Practice", + "startLine": 34, + "startColumn": 7, + "endLine": 34, + "endColumn": 16, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "SubnetD", + "entityType": "Resource", + "resourceType": "AWS::EC2::Subnet" + }, + "propertyPath": "Properties.AvailabilityZone", + "category": "Best Practice", + "startLine": 35, + "startColumn": 7, + "endLine": 35, + "endColumn": 23, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "E1005", - "severity": "ERROR", - "message": "Transform 'Parameters' must be an object, got a string", - "source": "CFN_LINT", - "propertyPath": "Transform", - "category": "Structure", - "startLine": 6, + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'VPC' of type 'AWS::EC2::VPC' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "VPC", + "entityType": "Resource", + "resourceType": "AWS::EC2::VPC" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 10, "startColumn": 5, - "endLine": 6, + "endLine": 10, "endColumn": 15, - "ruleDescription": "Validate Transform configuration", - "phase": "PARSE" - }, - { - "ruleId": "E1005", - "severity": "ERROR", - "message": "Transform 'Name' must be a string, got a list", - "source": "CFN_LINT", - "propertyPath": "Transform", - "category": "Structure", - "startLine": 7, - "startColumn": 5, - "endLine": 7, - "endColumn": 9, - "ruleDescription": "Validate Transform configuration", - "phase": "PARSE" - } - ] - }, - "bad/transform/auto_publish_alias.yaml": { - "filePath": "bad/transform/auto_publish_alias.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 2, - "counts": { - "fatal": 0, - "errors": 2, - "warnings": 0, - "informational": 0, - "debug": 0 + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "E0001", - "severity": "ERROR", - "message": "Error transforming template: Resource with id [SkillFunctionExtraItems] is invalid. Type of property 'AutoPublishAlias' is invalid.", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'SubnetA' of type 'AWS::EC2::Subnet' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "SkillFunctionExtraItems", + "logicalId": "SubnetA", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties/AutoPublishAlias", - "category": "Structure", - "startLine": 22, - "startColumn": 7, - "endLine": 22, - "endColumn": 23, - "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 14, + "startColumn": 5, + "endLine": 14, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "E0001", - "severity": "ERROR", - "message": "Error transforming template: Resource with id [SkillFunctionNotRef] is invalid. 'AutoPublishAlias' must be a string or a Ref to a template parameter", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'SubnetB' of type 'AWS::EC2::Subnet' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "SkillFunctionNotRef", + "logicalId": "SubnetB", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties/AutoPublishAlias", - "category": "Structure", - "startLine": 33, - "startColumn": 7, - "endLine": 33, - "endColumn": 23, - "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 20, + "startColumn": 5, + "endLine": 20, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" - } - ] - }, - "bad/transform/no_properties.yaml": { - "filePath": "bad/transform/no_properties.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 0, - "informational": 0, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "E0001", - "severity": "ERROR", - "message": "Error transforming template: Resource with id [MyApi] is invalid. Missing required property 'StageName'.", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'SubnetC' of type 'AWS::EC2::Subnet' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "MyApi", + "logicalId": "SubnetC", "entityType": "Resource", - "resourceType": "AWS::Serverless::Api" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties/StageName", - "category": "Structure", - "startLine": 7, - "startColumn": 3, - "endLine": 7, - "endColumn": 8, - "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 26, + "startColumn": 5, + "endLine": 26, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" - } - ] - }, - "bad/transform_serverless_auto_publish_alias.yaml": { - "filePath": "bad/transform_serverless_auto_publish_alias.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 0, - "informational": 0, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "E0001", - "severity": "ERROR", - "message": "Error transforming template: Resource with id [ProcessorFunction] is invalid. 'AutoPublishAlias' must be a string or a Ref to a template parameter", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'SubnetD' of type 'AWS::EC2::Subnet' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "ProcessorFunction", + "logicalId": "SubnetD", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties/AutoPublishAlias", - "category": "Structure", - "startLine": 10, - "startColumn": 7, - "endLine": 10, - "endColumn": 23, - "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 32, + "startColumn": 5, + "endLine": 32, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "bad/transform_serverless_template.yaml": { - "filePath": "bad/transform_serverless_template.yaml", - "status": "OK", + "bad/template.yaml": { + "filePath": "bad/template.yaml", + "status": "ERROR", "metadata": { - "resourcesScanned": 6, + "resourcesScanned": 0, "counts": { - "fatal": 0, - "errors": 3, + "fatal": 1, + "errors": 0, "warnings": 0, "informational": 0, "debug": 0 @@ -16935,61 +18902,17 @@ }, "diagnostics": [ { - "ruleId": "E0001", - "severity": "ERROR", - "message": "Error transforming template: Resource with id [myFunctionMyTimer] is invalid. Missing required property 'Schedule'.", - "source": "CFN_LINT", - "entity": { - "logicalId": "myFunction", - "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" - }, - "propertyPath": "Properties/Events/MyTimer", - "category": "Structure", - "startLine": 39, - "startColumn": 9, - "endLine": 39, - "endColumn": 16, - "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", - "phase": "LINT" - }, - { - "ruleId": "E0001", - "severity": "ERROR", - "message": "Error transforming template: Resource with id [ExampleLayer] is invalid. Missing required property 'ContentUri'.", - "source": "CFN_LINT", - "entity": { - "logicalId": "ExampleLayer", - "entityType": "Resource", - "resourceType": "AWS::Serverless::LayerVersion" - }, - "propertyPath": "Properties/ContentUri", - "category": "Structure", - "startLine": 50, - "startColumn": 3, - "endLine": 50, - "endColumn": 15, - "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", - "phase": "LINT" - }, - { - "ruleId": "E0001", - "severity": "ERROR", - "message": "Error transforming template: Resource with id [AppName] is invalid. Resource is missing the required [Location] property.", - "source": "CFN_LINT", - "entity": { - "logicalId": "AppName", - "entityType": "Resource", - "resourceType": "AWS::Serverless::Application" - }, - "propertyPath": "Properties/Location", + "ruleId": "F1101", + "severity": "FATAL", + "message": "YAML parse error: while parsing a block mapping, did not find expected key at byte 234 line 12 column 11", + "source": "SCHEMA", "category": "Structure", - "startLine": 56, - "startColumn": 3, - "endLine": 56, - "endColumn": 10, - "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", - "phase": "LINT" + "startLine": 12, + "startColumn": 11, + "endLine": 12, + "endColumn": 11, + "ruleDescription": "Invalid YAML/JSON syntax", + "phase": "PARSE" } ] } diff --git a/src/resources/expected/validation_reports4.json b/src/resources/expected/validation_reports4.json index d61a3e43..b6487412 100644 --- a/src/resources/expected/validation_reports4.json +++ b/src/resources/expected/validation_reports4.json @@ -1,4 +1,487 @@ { + "bad/templates/base.yaml": { + "filePath": "bad/templates/base.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 0, + "counts": { + "fatal": 2, + "errors": 2, + "warnings": 0, + "informational": 0, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "F0001", + "severity": "FATAL", + "message": "Resources section must exist and be non-empty", + "source": "SCHEMA", + "category": "Structure", + "startLine": 4, + "startColumn": 1, + "endLine": 4, + "endColumn": 10, + "ruleDescription": "Resources section must exist and be non-empty", + "phase": "SCHEMA" + }, + { + "ruleId": "F0002", + "severity": "FATAL", + "message": "AWSTemplateFormatVersion must be '2010-09-09', got '2010-09-10'", + "source": "SCHEMA", + "propertyPath": "AWSTemplateFormatVersion", + "category": "Structure", + "startLine": 1, + "startColumn": 1, + "endLine": 1, + "endColumn": 25, + "ruleDescription": "AWSTemplateFormatVersion must be 2010-09-09", + "phase": "SCHEMA" + }, + { + "ruleId": "E1005", + "severity": "ERROR", + "message": "Transform object is missing required 'Name' property", + "source": "CFN_LINT", + "propertyPath": "Transform", + "category": "Structure", + "startLine": 2, + "startColumn": 1, + "endLine": 2, + "endColumn": 10, + "ruleDescription": "Validate Transform configuration", + "phase": "PARSE" + }, + { + "ruleId": "E1005", + "severity": "ERROR", + "message": "Transform object has unknown property 'key' - expected one of 'Name', 'Parameters'", + "source": "CFN_LINT", + "propertyPath": "Transform", + "category": "Structure", + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 6, + "ruleDescription": "Validate Transform configuration", + "phase": "PARSE" + } + ] + }, + "bad/templates/base_date.yaml": { + "filePath": "bad/templates/base_date.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 0, + "counts": { + "fatal": 2, + "errors": 0, + "warnings": 0, + "informational": 0, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "F0001", + "severity": "FATAL", + "message": "Resources section must exist and be non-empty", + "source": "SCHEMA", + "category": "Structure", + "startLine": 2, + "startColumn": 1, + "endLine": 2, + "endColumn": 10, + "ruleDescription": "Resources section must exist and be non-empty", + "phase": "SCHEMA" + }, + { + "ruleId": "F0002", + "severity": "FATAL", + "message": "AWSTemplateFormatVersion must be '2010-09-09', got '2010-09-10'", + "source": "SCHEMA", + "propertyPath": "AWSTemplateFormatVersion", + "category": "Structure", + "startLine": 1, + "startColumn": 1, + "endLine": 1, + "endColumn": 25, + "ruleDescription": "AWSTemplateFormatVersion must be 2010-09-09", + "phase": "SCHEMA" + } + ] + }, + "bad/templates/base_null.yaml": { + "filePath": "bad/templates/base_null.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 0, + "counts": { + "fatal": 2, + "errors": 1, + "warnings": 0, + "informational": 0, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "F0001", + "severity": "FATAL", + "message": "Resources section must exist and be non-empty", + "source": "SCHEMA", + "category": "Structure", + "startLine": 3, + "startColumn": 1, + "endLine": 3, + "endColumn": 10, + "ruleDescription": "Resources section must exist and be non-empty", + "phase": "SCHEMA" + }, + { + "ruleId": "F0002", + "severity": "FATAL", + "message": "AWSTemplateFormatVersion must be '2010-09-09', got null", + "source": "SCHEMA", + "propertyPath": "AWSTemplateFormatVersion", + "category": "Structure", + "startLine": 1, + "startColumn": 1, + "endLine": 1, + "endColumn": 25, + "ruleDescription": "AWSTemplateFormatVersion must be 2010-09-09", + "phase": "PARSE" + }, + { + "ruleId": "E1005", + "severity": "ERROR", + "message": "Transform must be a transform name, a list of transforms, or a {Name, Parameters} object, got null", + "source": "CFN_LINT", + "propertyPath": "Transform", + "category": "Structure", + "startLine": 2, + "startColumn": 1, + "endLine": 2, + "endColumn": 10, + "ruleDescription": "Validate Transform configuration", + "phase": "PARSE" + } + ] + }, + "bad/templates/description_object.yaml": { + "filePath": "bad/templates/description_object.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 1, + "errors": 0, + "warnings": 0, + "informational": 0, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "F1004", + "severity": "FATAL", + "message": "Description must be a string, got a list", + "source": "SCHEMA", + "propertyPath": "Description", + "category": "Structure", + "startLine": 2, + "startColumn": 1, + "endLine": 2, + "endColumn": 12, + "ruleDescription": "Description must be a string", + "phase": "PARSE" + } + ] + }, + "bad/templates/transform_invalid_entries.yaml": { + "filePath": "bad/templates/transform_invalid_entries.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 3, + "warnings": 0, + "informational": 0, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "E1005", + "severity": "ERROR", + "message": "Transform entry must be a transform name or a {Name, Parameters} object, got a number", + "source": "CFN_LINT", + "propertyPath": "Transform", + "category": "Structure", + "startLine": 4, + "startColumn": 5, + "endLine": 4, + "endColumn": 6, + "ruleDescription": "Validate Transform configuration", + "phase": "PARSE" + }, + { + "ruleId": "E1005", + "severity": "ERROR", + "message": "Transform 'Parameters' must be an object, got a string", + "source": "CFN_LINT", + "propertyPath": "Transform", + "category": "Structure", + "startLine": 6, + "startColumn": 5, + "endLine": 6, + "endColumn": 15, + "ruleDescription": "Validate Transform configuration", + "phase": "PARSE" + }, + { + "ruleId": "E1005", + "severity": "ERROR", + "message": "Transform 'Name' must be a string, got a list", + "source": "CFN_LINT", + "propertyPath": "Transform", + "category": "Structure", + "startLine": 7, + "startColumn": 5, + "endLine": 7, + "endColumn": 9, + "ruleDescription": "Validate Transform configuration", + "phase": "PARSE" + } + ] + }, + "bad/transform/auto_publish_alias.yaml": { + "filePath": "bad/transform/auto_publish_alias.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 2, + "counts": { + "fatal": 0, + "errors": 2, + "warnings": 0, + "informational": 0, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "E0001", + "severity": "ERROR", + "message": "Error transforming template: Resource with id [SkillFunctionExtraItems] is invalid. Type of property 'AutoPublishAlias' is invalid.", + "source": "CFN_LINT", + "entity": { + "logicalId": "SkillFunctionExtraItems", + "entityType": "Resource", + "resourceType": "AWS::Serverless::Function" + }, + "propertyPath": "Properties/AutoPublishAlias", + "category": "Structure", + "startLine": 22, + "startColumn": 7, + "endLine": 22, + "endColumn": 23, + "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", + "phase": "LINT" + }, + { + "ruleId": "E0001", + "severity": "ERROR", + "message": "Error transforming template: Resource with id [SkillFunctionNotRef] is invalid. 'AutoPublishAlias' must be a string or a Ref to a template parameter", + "source": "CFN_LINT", + "entity": { + "logicalId": "SkillFunctionNotRef", + "entityType": "Resource", + "resourceType": "AWS::Serverless::Function" + }, + "propertyPath": "Properties/AutoPublishAlias", + "category": "Structure", + "startLine": 33, + "startColumn": 7, + "endLine": 33, + "endColumn": 23, + "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", + "phase": "LINT" + } + ] + }, + "bad/transform/no_properties.yaml": { + "filePath": "bad/transform/no_properties.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 1, + "warnings": 0, + "informational": 0, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "E0001", + "severity": "ERROR", + "message": "Error transforming template: Resource with id [MyApi] is invalid. Missing required property 'StageName'.", + "source": "CFN_LINT", + "entity": { + "logicalId": "MyApi", + "entityType": "Resource", + "resourceType": "AWS::Serverless::Api" + }, + "propertyPath": "Properties/StageName", + "category": "Structure", + "startLine": 7, + "startColumn": 3, + "endLine": 7, + "endColumn": 8, + "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", + "phase": "LINT" + } + ] + }, + "bad/transform_serverless_auto_publish_alias.yaml": { + "filePath": "bad/transform_serverless_auto_publish_alias.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 1, + "warnings": 0, + "informational": 0, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "E0001", + "severity": "ERROR", + "message": "Error transforming template: Resource with id [ProcessorFunction] is invalid. 'AutoPublishAlias' must be a string or a Ref to a template parameter", + "source": "CFN_LINT", + "entity": { + "logicalId": "ProcessorFunction", + "entityType": "Resource", + "resourceType": "AWS::Serverless::Function" + }, + "propertyPath": "Properties/AutoPublishAlias", + "category": "Structure", + "startLine": 10, + "startColumn": 7, + "endLine": 10, + "endColumn": 23, + "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", + "phase": "LINT" + } + ] + }, + "bad/transform_serverless_template.yaml": { + "filePath": "bad/transform_serverless_template.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 6, + "counts": { + "fatal": 0, + "errors": 3, + "warnings": 0, + "informational": 0, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "E0001", + "severity": "ERROR", + "message": "Error transforming template: Resource with id [myFunctionMyTimer] is invalid. Missing required property 'Schedule'.", + "source": "CFN_LINT", + "entity": { + "logicalId": "myFunction", + "entityType": "Resource", + "resourceType": "AWS::Serverless::Function" + }, + "propertyPath": "Properties/Events/MyTimer", + "category": "Structure", + "startLine": 39, + "startColumn": 9, + "endLine": 39, + "endColumn": 16, + "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", + "phase": "LINT" + }, + { + "ruleId": "E0001", + "severity": "ERROR", + "message": "Error transforming template: Resource with id [ExampleLayer] is invalid. Missing required property 'ContentUri'.", + "source": "CFN_LINT", + "entity": { + "logicalId": "ExampleLayer", + "entityType": "Resource", + "resourceType": "AWS::Serverless::LayerVersion" + }, + "propertyPath": "Properties/ContentUri", + "category": "Structure", + "startLine": 50, + "startColumn": 3, + "endLine": 50, + "endColumn": 15, + "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", + "phase": "LINT" + }, + { + "ruleId": "E0001", + "severity": "ERROR", + "message": "Error transforming template: Resource with id [AppName] is invalid. Resource is missing the required [Location] property.", + "source": "CFN_LINT", + "entity": { + "logicalId": "AppName", + "entityType": "Resource", + "resourceType": "AWS::Serverless::Application" + }, + "propertyPath": "Properties/Location", + "category": "Structure", + "startLine": 56, + "startColumn": 3, + "endLine": 56, + "endColumn": 10, + "ruleDescription": "SAM (AWS::Serverless) transform would reject the template", + "phase": "LINT" + } + ] + }, "bad/undefined_condition.yaml": { "filePath": "bad/undefined_condition.yaml", "status": "OK", @@ -67345,4598 +67828,5 @@ "phase": "LINT" } ] - }, - "cdk/py-ecs-serviceconnect--CdkExamplesServiceConnectStackEcrStack6B6F0F99.nested.template.json": { - "filePath": "cdk/py-ecs-serviceconnect--CdkExamplesServiceConnectStackEcrStack6B6F0F99.nested.template.json", - "status": "OK", - "metadata": { - "resourcesScanned": 8, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 1, - "informational": 6, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "W3005", - "severity": "WARN", - "message": "'CustomCDKECRDeploymentbd07c930edb94112a20f03f096f53666512MiBServiceRole8C8B0491' dependency already enforced by a 'GetAtt' at 'Properties.Role'", - "source": "CFN_LINT", - "entity": { - "logicalId": "CustomCDKECRDeploymentbd07c930edb94112a20f03f096f53666512MiB28EAD8E4", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", - "category": "Best Practice", - "startLine": 163, - "startColumn": 4, - "endLine": 163, - "endColumn": 14, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", - "phase": "LINT" - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'RepositoryName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "FrontendRepository7D714FA2", - "entityType": "Resource", - "resourceType": "AWS::ECR::Repository" - }, - "propertyPath": "Properties.RepositoryName", - "category": "Best Practice", - "startLine": 6, - "startColumn": 5, - "endLine": 6, - "endColumn": 20, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ecr.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'RepositoryName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "BackendDataRepositoryD361813E", - "entityType": "Resource", - "resourceType": "AWS::ECR::Repository" - }, - "propertyPath": "Properties.RepositoryName", - "category": "Best Practice", - "startLine": 17, - "startColumn": 5, - "endLine": 17, - "endColumn": 20, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ecr.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'FrontendRepository7D714FA2' of type 'AWS::ECR::Repository' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "FrontendRepository7D714FA2", - "entityType": "Resource", - "resourceType": "AWS::ECR::Repository" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 5, - "startColumn": 4, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'BackendDataRepositoryD361813E' of type 'AWS::ECR::Repository' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "BackendDataRepositoryD361813E", - "entityType": "Resource", - "resourceType": "AWS::ECR::Repository" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 16, - "startColumn": 4, - "endLine": 16, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'CustomCDKECRDeploymentbd07c930edb94112a20f03f096f53666512MiBServiceRole8C8B0491' of type 'AWS::IAM::Role' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "CustomCDKECRDeploymentbd07c930edb94112a20f03f096f53666512MiBServiceRole8C8B0491", - "entityType": "Resource", - "resourceType": "AWS::IAM::Role" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 70, - "startColumn": 4, - "endLine": 70, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'CustomCDKECRDeploymentbd07c930edb94112a20f03f096f53666512MiB28EAD8E4' of type 'AWS::Lambda::Function' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "CustomCDKECRDeploymentbd07c930edb94112a20f03f096f53666512MiB28EAD8E4", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 144, - "startColumn": 4, - "endLine": 144, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "cdk/py-ecs-serviceconnect--CdkExamplesServiceConnectStackEcsStack19C526D0.nested.template.json": { - "filePath": "cdk/py-ecs-serviceconnect--CdkExamplesServiceConnectStackEcsStack19C526D0.nested.template.json", - "status": "OK", - "metadata": { - "resourcesScanned": 20, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 61, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ClusterName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "ECSCluster7D463CD4", - "entityType": "Resource", - "resourceType": "AWS::ECS::Cluster" - }, - "propertyPath": "Properties.ClusterName", - "category": "Best Practice", - "startLine": 6, - "startColumn": 5, - "endLine": 6, - "endColumn": 17, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Name' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "ECSClusterDefaultServiceDiscoveryNamespace5AC2D2BE", - "entityType": "Resource", - "resourceType": "AWS::ServiceDiscovery::PrivateDnsNamespace" - }, - "propertyPath": "Properties.Name", - "category": "Best Practice", - "startLine": 29, - "startColumn": 5, - "endLine": 29, - "endColumn": 10, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Vpc' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "ECSClusterDefaultServiceDiscoveryNamespace5AC2D2BE", - "entityType": "Resource", - "resourceType": "AWS::ServiceDiscovery::PrivateDnsNamespace" - }, - "propertyPath": "Properties.Vpc", - "category": "Best Practice", - "startLine": 30, - "startColumn": 5, - "endLine": 30, - "endColumn": 9, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter 'referencetoCdkExamplesServiceConnectStackServiceConnectVPCE46B65DFRef' (type String)" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'LogGroupName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "ECSServiceLogGroupD961AA4E", - "entityType": "Resource", - "resourceType": "AWS::Logs::LogGroup" - }, - "propertyPath": "Properties.LogGroupName", - "category": "Best Practice", - "startLine": 41, - "startColumn": 5, - "endLine": 41, - "endColumn": 18, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-logs.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "dynamic (Join:{ref:ECSCluster7D463CD4}-service)" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "ECSSecurityGroupA14DBE7D", - "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" - }, - "propertyPath": "Properties.GroupDescription", - "category": "Best Practice", - "startLine": 219, - "startColumn": 5, - "endLine": 219, - "endColumn": 22, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "ECSSecurityGroupA14DBE7D", - "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" - }, - "propertyPath": "Properties.VpcId", - "category": "Best Practice", - "startLine": 238, - "startColumn": 5, - "endLine": 238, - "endColumn": 11, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter 'referencetoCdkExamplesServiceConnectStackServiceConnectVPCE46B65DFRef' (type String)" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'FromPort' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "ECSSecurityGroupfromCdkExamplesServiceConnectStackEcsStackPublicLBSG6A107D2A50006E3540BF", - "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" - }, - "propertyPath": "Properties.FromPort", - "category": "Best Practice", - "startLine": 250, - "startColumn": 5, - "endLine": 250, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'GroupId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "ECSSecurityGroupfromCdkExamplesServiceConnectStackEcsStackPublicLBSG6A107D2A50006E3540BF", - "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" - }, - "propertyPath": "Properties.GroupId", - "category": "Best Practice", - "startLine": 251, - "startColumn": 5, - "endLine": 251, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt ECSSecurityGroupA14DBE7D.GroupId" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'IpProtocol' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "ECSSecurityGroupfromCdkExamplesServiceConnectStackEcsStackPublicLBSG6A107D2A50006E3540BF", - "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" - }, - "propertyPath": "Properties.IpProtocol", - "category": "Best Practice", - "startLine": 257, - "startColumn": 5, - "endLine": 257, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'SourceSecurityGroupId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "ECSSecurityGroupfromCdkExamplesServiceConnectStackEcsStackPublicLBSG6A107D2A50006E3540BF", - "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" - }, - "propertyPath": "Properties.SourceSecurityGroupId", - "category": "Best Practice", - "startLine": 258, - "startColumn": 5, - "endLine": 258, - "endColumn": 27, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt PublicLBSG963B1ACE.GroupId" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ToPort' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "ECSSecurityGroupfromCdkExamplesServiceConnectStackEcsStackPublicLBSG6A107D2A50006E3540BF", - "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" - }, - "propertyPath": "Properties.ToPort", - "category": "Best Practice", - "startLine": 264, - "startColumn": 5, - "endLine": 264, - "endColumn": 12, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "FrontendTaskDefinition6CBC2B00", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.ContainerDefinitions", - "category": "Best Practice", - "startLine": 273, - "startColumn": 5, - "endLine": 273, - "endColumn": 26, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "FrontendTaskDefinition6CBC2B00", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.Cpu", - "category": "Best Practice", - "startLine": 302, - "startColumn": 5, - "endLine": 302, - "endColumn": 9, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ExecutionRoleArn' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "FrontendTaskDefinition6CBC2B00", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.ExecutionRoleArn", - "category": "Best Practice", - "startLine": 303, - "startColumn": 5, - "endLine": 303, - "endColumn": 22, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt ECSTaskIamRole84EB0A02.Arn" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Family' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "FrontendTaskDefinition6CBC2B00", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.Family", - "category": "Best Practice", - "startLine": 309, - "startColumn": 5, - "endLine": 309, - "endColumn": 12, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Memory' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "FrontendTaskDefinition6CBC2B00", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.Memory", - "category": "Best Practice", - "startLine": 310, - "startColumn": 5, - "endLine": 310, - "endColumn": 12, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "FrontendTaskDefinition6CBC2B00", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.NetworkMode", - "category": "Best Practice", - "startLine": 311, - "startColumn": 5, - "endLine": 311, - "endColumn": 17, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "FrontendTaskDefinition6CBC2B00", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.RequiresCompatibilities", - "category": "Best Practice", - "startLine": 312, - "startColumn": 5, - "endLine": 312, - "endColumn": 29, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'TaskRoleArn' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "FrontendTaskDefinition6CBC2B00", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.TaskRoleArn", - "category": "Best Practice", - "startLine": 315, - "startColumn": 5, - "endLine": 315, - "endColumn": 17, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt TaskexecutionRole978012CD.Arn" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "BackendTaskDefinitionEC224DE6", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.ContainerDefinitions", - "category": "Best Practice", - "startLine": 337, - "startColumn": 5, - "endLine": 337, - "endColumn": 26, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "BackendTaskDefinitionEC224DE6", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.Cpu", - "category": "Best Practice", - "startLine": 366, - "startColumn": 5, - "endLine": 366, - "endColumn": 9, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ExecutionRoleArn' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "BackendTaskDefinitionEC224DE6", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.ExecutionRoleArn", - "category": "Best Practice", - "startLine": 367, - "startColumn": 5, - "endLine": 367, - "endColumn": 22, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt ECSTaskIamRole84EB0A02.Arn" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Family' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "BackendTaskDefinitionEC224DE6", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.Family", - "category": "Best Practice", - "startLine": 373, - "startColumn": 5, - "endLine": 373, - "endColumn": 12, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Memory' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "BackendTaskDefinitionEC224DE6", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.Memory", - "category": "Best Practice", - "startLine": 374, - "startColumn": 5, - "endLine": 374, - "endColumn": 12, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "BackendTaskDefinitionEC224DE6", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.NetworkMode", - "category": "Best Practice", - "startLine": 375, - "startColumn": 5, - "endLine": 375, - "endColumn": 17, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "BackendTaskDefinitionEC224DE6", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.RequiresCompatibilities", - "category": "Best Practice", - "startLine": 376, - "startColumn": 5, - "endLine": 376, - "endColumn": 29, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'TaskRoleArn' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "BackendTaskDefinitionEC224DE6", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.TaskRoleArn", - "category": "Best Practice", - "startLine": 379, - "startColumn": 5, - "endLine": 379, - "endColumn": 17, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt TaskexecutionRole978012CD.Arn" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Cluster' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "FrontendServiceBC94BA93", - "entityType": "Resource", - "resourceType": "AWS::ECS::Service" - }, - "propertyPath": "Properties.Cluster", - "category": "Best Practice", - "startLine": 401, - "startColumn": 5, - "endLine": 401, - "endColumn": 13, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'ECSCluster7D463CD4'" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'LaunchType' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "FrontendServiceBC94BA93", - "entityType": "Resource", - "resourceType": "AWS::ECS::Service" - }, - "propertyPath": "Properties.LaunchType", - "category": "Best Practice", - "startLine": 411, - "startColumn": 5, - "endLine": 411, - "endColumn": 16, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ServiceName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "FrontendServiceBC94BA93", - "entityType": "Resource", - "resourceType": "AWS::ECS::Service" - }, - "propertyPath": "Properties.ServiceName", - "category": "Best Practice", - "startLine": 456, - "startColumn": 5, - "endLine": 456, - "endColumn": 17, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Cluster' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "BackendService7A4224EE", - "entityType": "Resource", - "resourceType": "AWS::ECS::Service" - }, - "propertyPath": "Properties.Cluster", - "category": "Best Practice", - "startLine": 473, - "startColumn": 5, - "endLine": 473, - "endColumn": 13, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'ECSCluster7D463CD4'" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'LaunchType' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "BackendService7A4224EE", - "entityType": "Resource", - "resourceType": "AWS::ECS::Service" - }, - "propertyPath": "Properties.LaunchType", - "category": "Best Practice", - "startLine": 482, - "startColumn": 5, - "endLine": 482, - "endColumn": 16, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ServiceName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "BackendService7A4224EE", - "entityType": "Resource", - "resourceType": "AWS::ECS::Service" - }, - "propertyPath": "Properties.ServiceName", - "category": "Best Practice", - "startLine": 518, - "startColumn": 5, - "endLine": 518, - "endColumn": 17, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "PublicLBSG963B1ACE", - "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" - }, - "propertyPath": "Properties.GroupDescription", - "category": "Best Practice", - "startLine": 533, - "startColumn": 5, - "endLine": 533, - "endColumn": 22, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "PublicLBSG963B1ACE", - "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" - }, - "propertyPath": "Properties.VpcId", - "category": "Best Practice", - "startLine": 550, - "startColumn": 5, - "endLine": 550, - "endColumn": 11, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter 'referencetoCdkExamplesServiceConnectStackServiceConnectVPCE46B65DFRef' (type String)" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Name' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "TargetGroup3D7CD9B8", - "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancingV2::TargetGroup" - }, - "propertyPath": "Properties.Name", - "category": "Best Practice", - "startLine": 566, - "startColumn": 5, - "endLine": 566, - "endColumn": 10, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Port' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "TargetGroup3D7CD9B8", - "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancingV2::TargetGroup" - }, - "propertyPath": "Properties.Port", - "category": "Best Practice", - "startLine": 567, - "startColumn": 5, - "endLine": 567, - "endColumn": 10, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Protocol' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "TargetGroup3D7CD9B8", - "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancingV2::TargetGroup" - }, - "propertyPath": "Properties.Protocol", - "category": "Best Practice", - "startLine": 568, - "startColumn": 5, - "endLine": 568, - "endColumn": 14, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'TargetType' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "TargetGroup3D7CD9B8", - "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancingV2::TargetGroup" - }, - "propertyPath": "Properties.TargetType", - "category": "Best Practice", - "startLine": 579, - "startColumn": 5, - "endLine": 579, - "endColumn": 16, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "TargetGroup3D7CD9B8", - "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancingV2::TargetGroup" - }, - "propertyPath": "Properties.VpcId", - "category": "Best Practice", - "startLine": 581, - "startColumn": 5, - "endLine": 581, - "endColumn": 11, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter 'referencetoCdkExamplesServiceConnectStackServiceConnectVPCE46B65DFRef' (type String)" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Scheme' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "FrontendLB2FA80AC2", - "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancingV2::LoadBalancer" - }, - "propertyPath": "Properties.Scheme", - "category": "Best Practice", - "startLine": 602, - "startColumn": 5, - "endLine": 602, - "endColumn": 12, - "documentationUrl": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-loadbalancer.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Type' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "FrontendLB2FA80AC2", - "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancingV2::LoadBalancer" - }, - "propertyPath": "Properties.Type", - "category": "Best Practice", - "startLine": 619, - "startColumn": 5, - "endLine": 619, - "endColumn": 10, - "documentationUrl": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-loadbalancer.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'LoadBalancerArn' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "FrontendLBListener230479D8", - "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancingV2::Listener" - }, - "propertyPath": "Properties.LoadBalancerArn", - "category": "Best Practice", - "startLine": 636, - "startColumn": 5, - "endLine": 636, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-elasticloadbalancingv2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'FrontendLB2FA80AC2'" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ListenerArn' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "ListenerRule73F9AC5E", - "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancingV2::ListenerRule" - }, - "propertyPath": "Properties.ListenerArn", - "category": "Best Practice", - "startLine": 667, - "startColumn": 5, - "endLine": 667, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-elasticloadbalancingv2", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'FrontendLBListener230479D8'" - } - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'ECSCluster7D463CD4' of type 'AWS::ECS::Cluster' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "ECSCluster7D463CD4", - "entityType": "Resource", - "resourceType": "AWS::ECS::Cluster" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 5, - "startColumn": 4, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'ECSClusterDefaultServiceDiscoveryNamespace5AC2D2BE' of type 'AWS::ServiceDiscovery::PrivateDnsNamespace' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "ECSClusterDefaultServiceDiscoveryNamespace5AC2D2BE", - "entityType": "Resource", - "resourceType": "AWS::ServiceDiscovery::PrivateDnsNamespace" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 28, - "startColumn": 4, - "endLine": 28, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'ECSServiceLogGroupD961AA4E' of type 'AWS::Logs::LogGroup' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "ECSServiceLogGroupD961AA4E", - "entityType": "Resource", - "resourceType": "AWS::Logs::LogGroup" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 40, - "startColumn": 4, - "endLine": 40, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'ECSTaskIamRole84EB0A02' of type 'AWS::IAM::Role' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "ECSTaskIamRole84EB0A02", - "entityType": "Resource", - "resourceType": "AWS::IAM::Role" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 62, - "startColumn": 4, - "endLine": 62, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'TaskexecutionRole978012CD' of type 'AWS::IAM::Role' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "TaskexecutionRole978012CD", - "entityType": "Resource", - "resourceType": "AWS::IAM::Role" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 172, - "startColumn": 4, - "endLine": 172, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'ECSSecurityGroupA14DBE7D' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "ECSSecurityGroupA14DBE7D", - "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 218, - "startColumn": 4, - "endLine": 218, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'FrontendTaskDefinition6CBC2B00' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "FrontendTaskDefinition6CBC2B00", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 272, - "startColumn": 4, - "endLine": 272, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'FrontendTaskDefinitionFrontendContainerLogGroup994ED50C' of type 'AWS::Logs::LogGroup' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "FrontendTaskDefinitionFrontendContainerLogGroup994ED50C", - "entityType": "Resource", - "resourceType": "AWS::Logs::LogGroup" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 326, - "startColumn": 3, - "endLine": 326, - "endColumn": 59, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'BackendTaskDefinitionEC224DE6' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "BackendTaskDefinitionEC224DE6", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 336, - "startColumn": 4, - "endLine": 336, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'BackendTaskDefinitionBackendContainerLogGroup5E30F6E8' of type 'AWS::Logs::LogGroup' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "BackendTaskDefinitionBackendContainerLogGroup5E30F6E8", - "entityType": "Resource", - "resourceType": "AWS::Logs::LogGroup" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 390, - "startColumn": 3, - "endLine": 390, - "endColumn": 57, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'FrontendServiceBC94BA93' of type 'AWS::ECS::Service' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "FrontendServiceBC94BA93", - "entityType": "Resource", - "resourceType": "AWS::ECS::Service" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 400, - "startColumn": 4, - "endLine": 400, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'BackendService7A4224EE' of type 'AWS::ECS::Service' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "BackendService7A4224EE", - "entityType": "Resource", - "resourceType": "AWS::ECS::Service" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 472, - "startColumn": 4, - "endLine": 472, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'PublicLBSG963B1ACE' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "PublicLBSG963B1ACE", - "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 532, - "startColumn": 4, - "endLine": 532, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'TargetGroup3D7CD9B8' of type 'AWS::ElasticLoadBalancingV2::TargetGroup' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "TargetGroup3D7CD9B8", - "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancingV2::TargetGroup" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 560, - "startColumn": 4, - "endLine": 560, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'FrontendLB2FA80AC2' of type 'AWS::ElasticLoadBalancingV2::LoadBalancer' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "FrontendLB2FA80AC2", - "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancingV2::LoadBalancer" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 591, - "startColumn": 4, - "endLine": 591, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'FrontendLBListener230479D8' of type 'AWS::ElasticLoadBalancingV2::Listener' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "FrontendLBListener230479D8", - "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancingV2::Listener" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 627, - "startColumn": 4, - "endLine": 627, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'ListenerRule73F9AC5E' of type 'AWS::ElasticLoadBalancingV2::ListenerRule' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "ListenerRule73F9AC5E", - "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancingV2::ListenerRule" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 648, - "startColumn": 4, - "endLine": 648, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "cdk/py-emr--emr-cluster.template.json": { - "filePath": "cdk/py-emr--emr-cluster.template.json", - "status": "OK", - "metadata": { - "resourcesScanned": 16, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 33, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "emrcluster", - "entityType": "Resource", - "resourceType": "AWS::EMR::Cluster" - }, - "category": "Best Practice", - "startLine": 314, - "startColumn": 3, - "endLine": 314, - "endColumn": 14, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "emrcluster", - "entityType": "Resource", - "resourceType": "AWS::EMR::Cluster" - }, - "category": "Best Practice", - "startLine": 314, - "startColumn": 3, - "endLine": 314, - "endColumn": 14, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "vpcA2121C38", - "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" - }, - "propertyPath": "Properties.CidrBlock", - "category": "Best Practice", - "startLine": 6, - "startColumn": 5, - "endLine": 6, - "endColumn": 15, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'InstanceTenancy' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "vpcA2121C38", - "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" - }, - "propertyPath": "Properties.InstanceTenancy", - "category": "Best Practice", - "startLine": 9, - "startColumn": 5, - "endLine": 9, - "endColumn": 21, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "vpcpublicSubnet1SubnetA635257E", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.AvailabilityZone", - "category": "Best Practice", - "startLine": 24, - "startColumn": 5, - "endLine": 24, - "endColumn": 22, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "vpcpublicSubnet1SubnetA635257E", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.CidrBlock", - "category": "Best Practice", - "startLine": 32, - "startColumn": 5, - "endLine": 32, - "endColumn": 15, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "vpcpublicSubnet1SubnetA635257E", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.VpcId", - "category": "Best Practice", - "startLine": 48, - "startColumn": 5, - "endLine": 48, - "endColumn": 11, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'vpcA2121C38'" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "vpcpublicSubnet1RouteTableA38152FE", - "entityType": "Resource", - "resourceType": "AWS::EC2::RouteTable" - }, - "propertyPath": "Properties.VpcId", - "category": "Best Practice", - "startLine": 65, - "startColumn": 5, - "endLine": 65, - "endColumn": 11, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'vpcA2121C38'" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "vpcpublicSubnet1RouteTableAssociationB46101B8", - "entityType": "Resource", - "resourceType": "AWS::EC2::SubnetRouteTableAssociation" - }, - "propertyPath": "Properties.RouteTableId", - "category": "Best Practice", - "startLine": 76, - "startColumn": 5, - "endLine": 76, - "endColumn": 18, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'vpcpublicSubnet1RouteTableA38152FE'", - "extra": { - "replacement_strategy": "delete_then_create" - } - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "vpcpublicSubnet1RouteTableAssociationB46101B8", - "entityType": "Resource", - "resourceType": "AWS::EC2::SubnetRouteTableAssociation" - }, - "propertyPath": "Properties.SubnetId", - "category": "Best Practice", - "startLine": 79, - "startColumn": 5, - "endLine": 79, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'vpcpublicSubnet1SubnetA635257E'", - "extra": { - "replacement_strategy": "delete_then_create" - } - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'DestinationCidrBlock' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "vpcpublicSubnet1DefaultRouteF0973989", - "entityType": "Resource", - "resourceType": "AWS::EC2::Route" - }, - "propertyPath": "Properties.DestinationCidrBlock", - "category": "Best Practice", - "startLine": 90, - "startColumn": 5, - "endLine": 90, - "endColumn": 26, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "vpcpublicSubnet1DefaultRouteF0973989", - "entityType": "Resource", - "resourceType": "AWS::EC2::Route" - }, - "propertyPath": "Properties.RouteTableId", - "category": "Best Practice", - "startLine": 94, - "startColumn": 5, - "endLine": 94, - "endColumn": 18, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'vpcpublicSubnet1RouteTableA38152FE'" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "vpcpublicSubnet2Subnet027D165B", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.AvailabilityZone", - "category": "Best Practice", - "startLine": 108, - "startColumn": 5, - "endLine": 108, - "endColumn": 22, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "vpcpublicSubnet2Subnet027D165B", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.CidrBlock", - "category": "Best Practice", - "startLine": 116, - "startColumn": 5, - "endLine": 116, - "endColumn": 15, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "vpcpublicSubnet2Subnet027D165B", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.VpcId", - "category": "Best Practice", - "startLine": 132, - "startColumn": 5, - "endLine": 132, - "endColumn": 11, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'vpcA2121C38'" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "vpcpublicSubnet2RouteTableA6135437", - "entityType": "Resource", - "resourceType": "AWS::EC2::RouteTable" - }, - "propertyPath": "Properties.VpcId", - "category": "Best Practice", - "startLine": 149, - "startColumn": 5, - "endLine": 149, - "endColumn": 11, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'vpcA2121C38'" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "vpcpublicSubnet2RouteTableAssociation73F6478A", - "entityType": "Resource", - "resourceType": "AWS::EC2::SubnetRouteTableAssociation" - }, - "propertyPath": "Properties.RouteTableId", - "category": "Best Practice", - "startLine": 160, - "startColumn": 5, - "endLine": 160, - "endColumn": 18, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'vpcpublicSubnet2RouteTableA6135437'", - "extra": { - "replacement_strategy": "delete_then_create" - } - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "vpcpublicSubnet2RouteTableAssociation73F6478A", - "entityType": "Resource", - "resourceType": "AWS::EC2::SubnetRouteTableAssociation" - }, - "propertyPath": "Properties.SubnetId", - "category": "Best Practice", - "startLine": 163, - "startColumn": 5, - "endLine": 163, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'vpcpublicSubnet2Subnet027D165B'", - "extra": { - "replacement_strategy": "delete_then_create" - } - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'DestinationCidrBlock' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "vpcpublicSubnet2DefaultRoute13685A07", - "entityType": "Resource", - "resourceType": "AWS::EC2::Route" - }, - "propertyPath": "Properties.DestinationCidrBlock", - "category": "Best Practice", - "startLine": 174, - "startColumn": 5, - "endLine": 174, - "endColumn": 26, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "vpcpublicSubnet2DefaultRoute13685A07", - "entityType": "Resource", - "resourceType": "AWS::EC2::Route" - }, - "propertyPath": "Properties.RouteTableId", - "category": "Best Practice", - "startLine": 178, - "startColumn": 5, - "endLine": 178, - "endColumn": 18, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'vpcpublicSubnet2RouteTableA6135437'" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "vpcVPCGW7984C166", - "entityType": "Resource", - "resourceType": "AWS::EC2::VPCGatewayAttachment" - }, - "propertyPath": "Properties.VpcId", - "category": "Best Practice", - "startLine": 209, - "startColumn": 5, - "endLine": 209, - "endColumn": 11, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2-vpc-gateway-attachment.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'vpcA2121C38'", - "extra": { - "replacement_strategy": "delete_then_create" - } - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'InstanceProfileName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "emrjobflowprofile", - "entityType": "Resource", - "resourceType": "AWS::IAM::InstanceProfile" - }, - "propertyPath": "Properties.InstanceProfileName", - "category": "Best Practice", - "startLine": 303, - "startColumn": 5, - "endLine": 303, - "endColumn": 25, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Applications' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "emrcluster", - "entityType": "Resource", - "resourceType": "AWS::EMR::Cluster" - }, - "propertyPath": "Properties.Applications", - "category": "Best Practice", - "startLine": 317, - "startColumn": 5, - "endLine": 317, - "endColumn": 18, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Configurations' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "emrcluster", - "entityType": "Resource", - "resourceType": "AWS::EMR::Cluster" - }, - "propertyPath": "Properties.Configurations", - "category": "Best Practice", - "startLine": 322, - "startColumn": 5, - "endLine": 322, - "endColumn": 20, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'JobFlowRole' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "emrcluster", - "entityType": "Resource", - "resourceType": "AWS::EMR::Cluster" - }, - "propertyPath": "Properties.JobFlowRole", - "category": "Best Practice", - "startLine": 365, - "startColumn": 5, - "endLine": 365, - "endColumn": 17, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'LogUri' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "emrcluster", - "entityType": "Resource", - "resourceType": "AWS::EMR::Cluster" - }, - "propertyPath": "Properties.LogUri", - "category": "Best Practice", - "startLine": 366, - "startColumn": 5, - "endLine": 366, - "endColumn": 12, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Name' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "emrcluster", - "entityType": "Resource", - "resourceType": "AWS::EMR::Cluster" - }, - "propertyPath": "Properties.Name", - "category": "Best Practice", - "startLine": 378, - "startColumn": 5, - "endLine": 378, - "endColumn": 10, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ReleaseLabel' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "emrcluster", - "entityType": "Resource", - "resourceType": "AWS::EMR::Cluster" - }, - "propertyPath": "Properties.ReleaseLabel", - "category": "Best Practice", - "startLine": 379, - "startColumn": 5, - "endLine": 379, - "endColumn": 18, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ServiceRole' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "emrcluster", - "entityType": "Resource", - "resourceType": "AWS::EMR::Cluster" - }, - "propertyPath": "Properties.ServiceRole", - "category": "Best Practice", - "startLine": 380, - "startColumn": 5, - "endLine": 380, - "endColumn": 17, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'emrservicerole3BE5EDAF'" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Steps' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "emrcluster", - "entityType": "Resource", - "resourceType": "AWS::EMR::Cluster" - }, - "propertyPath": "Properties.Steps", - "category": "Best Practice", - "startLine": 383, - "startColumn": 5, - "endLine": 383, - "endColumn": 11, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'emrservicerole3BE5EDAF' of type 'AWS::IAM::Role' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "emrservicerole3BE5EDAF", - "entityType": "Resource", - "resourceType": "AWS::IAM::Role" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 219, - "startColumn": 4, - "endLine": 219, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'emrjobflowrole15D4DAE5' of type 'AWS::IAM::Role' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "emrjobflowrole15D4DAE5", - "entityType": "Resource", - "resourceType": "AWS::IAM::Role" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 268, - "startColumn": 4, - "endLine": 268, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'emrcluster' of type 'AWS::EMR::Cluster' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "emrcluster", - "entityType": "Resource", - "resourceType": "AWS::EMR::Cluster" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 316, - "startColumn": 4, - "endLine": 316, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "cdk/py-iotcore--CdkIotThingStack.template.json": { - "filePath": "cdk/py-iotcore--CdkIotThingStack.template.json", - "status": "OK", - "metadata": { - "resourcesScanned": 19, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 5, - "informational": 22, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "W2531", - "severity": "WARN", - "message": "Runtime 'nodejs18.x' was deprecated on '2025-09-01'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'nodejs24.x'", - "source": "CFN_LINT", - "entity": { - "logicalId": "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aFD4BFC8A", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 189, - "startColumn": 5, - "endLine": 189, - "endColumn": 13, - "ruleDescription": "Check if EOL Lambda Function Runtimes are used", - "phase": "SCHEMA", - "context": { - "actualValue": "nodejs18.x", - "lifecycle": "deprecated" - } - }, - { - "ruleId": "W2531", - "severity": "WARN", - "message": "Runtime 'nodejs18.x' was deprecated on '2025-09-01'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'nodejs24.x'", - "source": "CFN_LINT", - "entity": { - "logicalId": "IoTCertProviderframeworkonEvent8FF1476F", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 321, - "startColumn": 5, - "endLine": 321, - "endColumn": 13, - "ruleDescription": "Check if EOL Lambda Function Runtimes are used", - "phase": "SCHEMA", - "context": { - "actualValue": "nodejs18.x", - "lifecycle": "deprecated" - } - }, - { - "ruleId": "W3005", - "severity": "WARN", - "message": "'CdkThing001LambdaRoleD7EE5CD3' dependency already enforced by a 'GetAtt' at 'Properties.Role'", - "source": "CFN_LINT", - "entity": { - "logicalId": "CertHandler220363A9", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", - "category": "Best Practice", - "startLine": 87, - "startColumn": 4, - "endLine": 87, - "endColumn": 14, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", - "phase": "LINT" - }, - { - "ruleId": "W3005", - "severity": "WARN", - "message": "'LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aServiceRole9741ECFB' dependency already enforced by a 'GetAtt' at 'Properties.Role'", - "source": "CFN_LINT", - "entity": { - "logicalId": "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aFD4BFC8A", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", - "category": "Best Practice", - "startLine": 204, - "startColumn": 4, - "endLine": 204, - "endColumn": 14, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", - "phase": "LINT" - }, - { - "ruleId": "W3005", - "severity": "WARN", - "message": "'IoTCertProviderframeworkonEventServiceRole80DDBEA7' dependency already enforced by a 'GetAtt' at 'Properties.Role'", - "source": "CFN_LINT", - "entity": { - "logicalId": "IoTCertProviderframeworkonEvent8FF1476F", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", - "category": "Best Practice", - "startLine": 324, - "startColumn": 4, - "endLine": 324, - "endColumn": 14, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", - "phase": "LINT" - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "CfnLogGroup", - "entityType": "Resource", - "resourceType": "AWS::Logs::LogGroup" - }, - "category": "Best Practice", - "startLine": 516, - "startColumn": 3, - "endLine": 516, - "endColumn": 15, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "CfnLogGroup", - "entityType": "Resource", - "resourceType": "AWS::Logs::LogGroup" - }, - "category": "Best Practice", - "startLine": 516, - "startColumn": 3, - "endLine": 516, - "endColumn": 15, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ThingName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "MyCdkThing", - "entityType": "Resource", - "resourceType": "AWS::IoT::Thing" - }, - "propertyPath": "Properties.ThingName", - "category": "Best Practice", - "startLine": 6, - "startColumn": 5, - "endLine": 6, - "endColumn": 15, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "CertHandler220363A9", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "Properties.FunctionName", - "category": "Best Practice", - "startLine": 76, - "startColumn": 5, - "endLine": 76, - "endColumn": 18, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ServiceToken' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "IoTCertCustomResource", - "entityType": "Resource", - "resourceType": "AWS::CloudFormation::CustomResource" - }, - "propertyPath": "Properties.ServiceToken", - "category": "Best Practice", - "startLine": 338, - "startColumn": 5, - "endLine": 338, - "endColumn": 18, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt IoTCertProviderframeworkonEvent8FF1476F.Arn" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'PolicyName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "CfnPolicy", - "entityType": "Resource", - "resourceType": "AWS::IoT::Policy" - }, - "propertyPath": "Properties.PolicyName", - "category": "Best Practice", - "startLine": 407, - "startColumn": 5, - "endLine": 407, - "endColumn": 16, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'PolicyName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "CdkThing001PolicyPrincipalAttachment", - "entityType": "Resource", - "resourceType": "AWS::IoT::PolicyPrincipalAttachment" - }, - "propertyPath": "Properties.PolicyName", - "category": "Best Practice", - "startLine": 416, - "startColumn": 5, - "endLine": 416, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Principal' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "CdkThing001PolicyPrincipalAttachment", - "entityType": "Resource", - "resourceType": "AWS::IoT::PolicyPrincipalAttachment" - }, - "propertyPath": "Properties.Principal", - "category": "Best Practice", - "startLine": 417, - "startColumn": 5, - "endLine": 417, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "dynamic (Join:arn:aws:iot:us-east-1:123456789012:cert/{ref:IoTCertCustomResource})" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Principal' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "CdkThing001ThingPrincipalAttachment", - "entityType": "Resource", - "resourceType": "AWS::IoT::ThingPrincipalAttachment" - }, - "propertyPath": "Properties.Principal", - "category": "Best Practice", - "startLine": 447, - "startColumn": 5, - "endLine": 447, - "endColumn": 15, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "dynamic (Join:arn:aws:iot:us-east-1:123456789012:cert/{ref:IoTCertCustomResource})" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ThingName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "CdkThing001ThingPrincipalAttachment", - "entityType": "Resource", - "resourceType": "AWS::IoT::ThingPrincipalAttachment" - }, - "propertyPath": "Properties.ThingName", - "category": "Best Practice", - "startLine": 469, - "startColumn": 5, - "endLine": 469, - "endColumn": 15, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'RoleName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "CfnRole", - "entityType": "Resource", - "resourceType": "AWS::IAM::Role" - }, - "propertyPath": "Properties.RoleName", - "category": "Best Practice", - "startLine": 510, - "startColumn": 5, - "endLine": 510, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'LogGroupName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "CfnLogGroup", - "entityType": "Resource", - "resourceType": "AWS::Logs::LogGroup" - }, - "propertyPath": "Properties.LogGroupName", - "category": "Best Practice", - "startLine": 519, - "startColumn": 5, - "endLine": 519, - "endColumn": 18, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-logs.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'CdkThing001LambdaRoleD7EE5CD3' of type 'AWS::IAM::Role' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "CdkThing001LambdaRoleD7EE5CD3", - "entityType": "Resource", - "resourceType": "AWS::IAM::Role" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 14, - "startColumn": 4, - "endLine": 14, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'CertHandler220363A9' of type 'AWS::Lambda::Function' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "CertHandler220363A9", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 69, - "startColumn": 4, - "endLine": 69, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aServiceRole9741ECFB' of type 'AWS::IAM::Role' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aServiceRole9741ECFB", - "entityType": "Resource", - "resourceType": "AWS::IAM::Role" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 126, - "startColumn": 4, - "endLine": 126, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aFD4BFC8A' of type 'AWS::Lambda::Function' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aFD4BFC8A", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 187, - "startColumn": 4, - "endLine": 187, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'IoTCertProviderframeworkonEventServiceRole80DDBEA7' of type 'AWS::IAM::Role' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "IoTCertProviderframeworkonEventServiceRole80DDBEA7", - "entityType": "Resource", - "resourceType": "AWS::IAM::Role" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 217, - "startColumn": 4, - "endLine": 217, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'IoTCertProviderframeworkonEvent8FF1476F' of type 'AWS::Lambda::Function' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "IoTCertProviderframeworkonEvent8FF1476F", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 296, - "startColumn": 4, - "endLine": 296, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'CfnPolicy' of type 'AWS::IoT::Policy' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "CfnPolicy", - "entityType": "Resource", - "resourceType": "AWS::IoT::Policy" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 353, - "startColumn": 4, - "endLine": 353, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'CfnRole' of type 'AWS::IAM::Role' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "CfnRole", - "entityType": "Resource", - "resourceType": "AWS::IAM::Role" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 477, - "startColumn": 4, - "endLine": 477, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'CfnLogGroup' of type 'AWS::Logs::LogGroup' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "CfnLogGroup", - "entityType": "Resource", - "resourceType": "AWS::Logs::LogGroup" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 518, - "startColumn": 4, - "endLine": 518, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'CdkIoTCoreRule' of type 'AWS::IoT::TopicRule' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "CdkIoTCoreRule", - "entityType": "Resource", - "resourceType": "AWS::IoT::TopicRule" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 528, - "startColumn": 4, - "endLine": 528, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "cdk/py-lambda-cron--LambdaCronExample.template.json": { - "filePath": "cdk/py-lambda-cron--LambdaCronExample.template.json", - "status": "OK", - "metadata": { - "resourcesScanned": 5, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 1, - "informational": 7, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "W3005", - "severity": "WARN", - "message": "'SingletonServiceRoleDDD815CD' dependency already enforced by a 'GetAtt' at 'Properties.Role'", - "source": "CFN_LINT", - "entity": { - "logicalId": "Singleton8C7B99F3", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", - "category": "Best Practice", - "startLine": 53, - "startColumn": 4, - "endLine": 53, - "endColumn": 14, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", - "phase": "LINT" - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Action' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "RuleAllowEventRuleLambdaCronExampleSingleton4F1DF641E5122DD7", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" - }, - "propertyPath": "Properties.Action", - "category": "Best Practice", - "startLine": 84, - "startColumn": 5, - "endLine": 84, - "endColumn": 12, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "RuleAllowEventRuleLambdaCronExampleSingleton4F1DF641E5122DD7", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" - }, - "propertyPath": "Properties.FunctionName", - "category": "Best Practice", - "startLine": 85, - "startColumn": 5, - "endLine": 85, - "endColumn": 18, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt Singleton8C7B99F3.Arn" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Principal' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "RuleAllowEventRuleLambdaCronExampleSingleton4F1DF641E5122DD7", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" - }, - "propertyPath": "Properties.Principal", - "category": "Best Practice", - "startLine": 91, - "startColumn": 5, - "endLine": 91, - "endColumn": 15, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'SourceArn' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "RuleAllowEventRuleLambdaCronExampleSingleton4F1DF641E5122DD7", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" - }, - "propertyPath": "Properties.SourceArn", - "category": "Best Practice", - "startLine": 92, - "startColumn": 5, - "endLine": 92, - "endColumn": 15, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt Rule4C995B7F.Arn" - } - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'SingletonServiceRoleDDD815CD' of type 'AWS::IAM::Role' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "SingletonServiceRoleDDD815CD", - "entityType": "Resource", - "resourceType": "AWS::IAM::Role" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 5, - "startColumn": 4, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Singleton8C7B99F3' of type 'AWS::Lambda::Function' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "Singleton8C7B99F3", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 39, - "startColumn": 4, - "endLine": 39, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Rule4C995B7F' of type 'AWS::Events::Rule' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "Rule4C995B7F", - "entityType": "Resource", - "resourceType": "AWS::Events::Rule" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 62, - "startColumn": 4, - "endLine": 62, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "cdk/py-lambda-from-container--LambdaContainerFunctionStack.template.json": { - "filePath": "cdk/py-lambda-from-container--LambdaContainerFunctionStack.template.json", - "status": "OK", - "metadata": { - "resourcesScanned": 3, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 1, - "informational": 4, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "W3005", - "severity": "WARN", - "message": "'lambdaContainerFunctionServiceRole5E36DB3C' dependency already enforced by a 'GetAtt' at 'Properties.Role'", - "source": "CFN_LINT", - "entity": { - "logicalId": "lambdaContainerFunction5815FD88", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", - "category": "Best Practice", - "startLine": 63, - "startColumn": 4, - "endLine": 63, - "endColumn": 14, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", - "phase": "LINT" - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "lambdaContainerFunction5815FD88", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "Properties.FunctionName", - "category": "Best Practice", - "startLine": 51, - "startColumn": 5, - "endLine": 51, - "endColumn": 18, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'PackageType' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "lambdaContainerFunction5815FD88", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "Properties.PackageType", - "category": "Best Practice", - "startLine": 53, - "startColumn": 5, - "endLine": 53, - "endColumn": 17, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'lambdaContainerFunctionServiceRole5E36DB3C' of type 'AWS::IAM::Role' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "lambdaContainerFunctionServiceRole5E36DB3C", - "entityType": "Resource", - "resourceType": "AWS::IAM::Role" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 5, - "startColumn": 4, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'lambdaContainerFunction5815FD88' of type 'AWS::Lambda::Function' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "lambdaContainerFunction5815FD88", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 39, - "startColumn": 4, - "endLine": 39, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "cdk/py-lambda-layer--LambdaLayerExample.template.json": { - "filePath": "cdk/py-lambda-layer--LambdaLayerExample.template.json", - "status": "OK", - "metadata": { - "resourcesScanned": 4, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 2, - "informational": 5, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "W2531", - "severity": "WARN", - "message": "Runtime 'python3.8' was deprecated on '2024-10-14'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'python3.14'", - "source": "CFN_LINT", - "entity": { - "logicalId": "lambdafunction45C982D3", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 83, - "startColumn": 5, - "endLine": 83, - "endColumn": 13, - "ruleDescription": "Check if EOL Lambda Function Runtimes are used", - "phase": "SCHEMA", - "context": { - "actualValue": "python3.8", - "lifecycle": "deprecated" - } - }, - { - "ruleId": "W3005", - "severity": "WARN", - "message": "'lambdafunctionServiceRole85538ADB' dependency already enforced by a 'GetAtt' at 'Properties.Role'", - "source": "CFN_LINT", - "entity": { - "logicalId": "lambdafunction45C982D3", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", - "category": "Best Practice", - "startLine": 85, - "startColumn": 4, - "endLine": 85, - "endColumn": 14, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", - "phase": "LINT" - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'CompatibleRuntimes' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "helperlayerC2FA2F58", - "entityType": "Resource", - "resourceType": "AWS::Lambda::LayerVersion" - }, - "propertyPath": "Properties.CompatibleRuntimes", - "category": "Best Practice", - "startLine": 6, - "startColumn": 5, - "endLine": 6, - "endColumn": 24, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-lambda.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Content' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "helperlayerC2FA2F58", - "entityType": "Resource", - "resourceType": "AWS::Lambda::LayerVersion" - }, - "propertyPath": "Properties.Content", - "category": "Best Practice", - "startLine": 11, - "startColumn": 5, - "endLine": 11, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-lambda.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Description' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "helperlayerC2FA2F58", - "entityType": "Resource", - "resourceType": "AWS::Lambda::LayerVersion" - }, - "propertyPath": "Properties.Description", - "category": "Best Practice", - "startLine": 17, - "startColumn": 5, - "endLine": 17, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-lambda.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'lambdafunctionServiceRole85538ADB' of type 'AWS::IAM::Role' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "lambdafunctionServiceRole85538ADB", - "entityType": "Resource", - "resourceType": "AWS::IAM::Role" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 30, - "startColumn": 4, - "endLine": 30, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'lambdafunction45C982D3' of type 'AWS::Lambda::Function' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "lambdafunction45C982D3", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 64, - "startColumn": 4, - "endLine": 64, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "cdk/py-stepfunctions--aws-stepfunctions-integ.template.json": { - "filePath": "cdk/py-stepfunctions--aws-stepfunctions-integ.template.json", - "status": "OK", - "metadata": { - "resourcesScanned": 8, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 5, - "informational": 6, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "W2531", - "severity": "WARN", - "message": "Runtime 'python3.9' was deprecated on '2025-12-15'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'python3.14'", - "source": "CFN_LINT", - "entity": { - "logicalId": "submitLambda3C32AFD4", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 53, - "startColumn": 5, - "endLine": 53, - "endColumn": 13, - "ruleDescription": "Check if EOL Lambda Function Runtimes are used", - "phase": "SCHEMA", - "context": { - "actualValue": "python3.9", - "lifecycle": "deprecated" - } - }, - { - "ruleId": "W2531", - "severity": "WARN", - "message": "Runtime 'python3.9' was deprecated on '2025-12-15'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'python3.14'", - "source": "CFN_LINT", - "entity": { - "logicalId": "statusLambdaCF47B86D", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 115, - "startColumn": 5, - "endLine": 115, - "endColumn": 13, - "ruleDescription": "Check if EOL Lambda Function Runtimes are used", - "phase": "SCHEMA", - "context": { - "actualValue": "python3.9", - "lifecycle": "deprecated" - } - }, - { - "ruleId": "W3005", - "severity": "WARN", - "message": "'submitLambdaServiceRole576DCA8F' dependency already enforced by a 'GetAtt' at 'Properties.Role'", - "source": "CFN_LINT", - "entity": { - "logicalId": "submitLambda3C32AFD4", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", - "category": "Best Practice", - "startLine": 55, - "startColumn": 4, - "endLine": 55, - "endColumn": 14, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", - "phase": "LINT" - }, - { - "ruleId": "W3005", - "severity": "WARN", - "message": "'statusLambdaServiceRoleD1132168' dependency already enforced by a 'GetAtt' at 'Properties.Role'", - "source": "CFN_LINT", - "entity": { - "logicalId": "statusLambdaCF47B86D", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", - "category": "Best Practice", - "startLine": 117, - "startColumn": 4, - "endLine": 117, - "endColumn": 14, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", - "phase": "LINT" - }, - { - "ruleId": "W3005", - "severity": "WARN", - "message": "'StateMachineRoleB840431D' dependency already enforced by a 'GetAtt' at 'Properties.RoleArn'", - "source": "CFN_LINT", - "entity": { - "logicalId": "StateMachine2E01A3A5", - "entityType": "Resource", - "resourceType": "AWS::StepFunctions::StateMachine" - }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", - "category": "Best Practice", - "startLine": 258, - "startColumn": 4, - "endLine": 258, - "endColumn": 14, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'submitLambdaServiceRole576DCA8F' of type 'AWS::IAM::Role' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "submitLambdaServiceRole576DCA8F", - "entityType": "Resource", - "resourceType": "AWS::IAM::Role" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 5, - "startColumn": 4, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'submitLambda3C32AFD4' of type 'AWS::Lambda::Function' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "submitLambda3C32AFD4", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 39, - "startColumn": 4, - "endLine": 39, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'statusLambdaServiceRoleD1132168' of type 'AWS::IAM::Role' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "statusLambdaServiceRoleD1132168", - "entityType": "Resource", - "resourceType": "AWS::IAM::Role" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 67, - "startColumn": 4, - "endLine": 67, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'statusLambdaCF47B86D' of type 'AWS::Lambda::Function' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "statusLambdaCF47B86D", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 101, - "startColumn": 4, - "endLine": 101, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'StateMachineRoleB840431D' of type 'AWS::IAM::Role' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "StateMachineRoleB840431D", - "entityType": "Resource", - "resourceType": "AWS::IAM::Role" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 129, - "startColumn": 4, - "endLine": 129, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'StateMachine2E01A3A5' of type 'AWS::StepFunctions::StateMachine' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "StateMachine2E01A3A5", - "entityType": "Resource", - "resourceType": "AWS::StepFunctions::StateMachine" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 220, - "startColumn": 4, - "endLine": 220, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "cdk/py-url-shortener--urlshort-app.template.json": { - "filePath": "cdk/py-url-shortener--urlshort-app.template.json", - "status": "OK", - "metadata": { - "resourcesScanned": 20, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 3, - "informational": 39, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "E2531", - "severity": "ERROR", - "message": "Runtime 'python3.7' was deprecated on '2023-12-04'. Creation was disabled on '2024-01-09', and updates will be disabled on '2027-03-03'. Please consider updating to 'python3.14'", - "source": "CFN_LINT", - "entity": { - "logicalId": "UrlShortenerFunctionB5E87AC1", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 141, - "startColumn": 5, - "endLine": 141, - "endColumn": 13, - "ruleDescription": "Check if Lambda Function Runtimes are blocked for create", - "phase": "SCHEMA", - "context": { - "actualValue": "python3.7", - "lifecycle": "create-blocked" - } - }, - { - "ruleId": "W3005", - "severity": "WARN", - "message": "'UrlShortenerFunctionServiceRole2FBF9CDA' dependency already enforced by a 'GetAtt' at 'Properties.Role'", - "source": "CFN_LINT", - "entity": { - "logicalId": "UrlShortenerFunctionB5E87AC1", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", - "category": "Best Practice", - "startLine": 144, - "startColumn": 4, - "endLine": 144, - "endColumn": 14, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", - "phase": "LINT" - }, - { - "ruleId": "W9002", - "severity": "WARN", - "message": "Property 'RegionalCertificateArn' has a hardcoded ARN - use Ref, GetAtt, or a parameter instead", - "source": "ENGINE", - "entity": { - "logicalId": "UrlShortenerApiDomain85D0CE65", - "entityType": "Resource", - "resourceType": "AWS::ApiGateway::DomainName" - }, - "propertyPath": "Properties.RegionalCertificateArn", - "category": "Best Practice", - "startLine": 499, - "startColumn": 5, - "endLine": 499, - "endColumn": 28, - "ruleDescription": "Hardcoded ARN property", - "phase": "LINT" - }, - { - "ruleId": "W9013", - "severity": "WARN", - "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", - "source": "ENGINE", - "entity": { - "logicalId": "UrlShortenerApiDomain85D0CE65", - "entityType": "Resource", - "resourceType": "AWS::ApiGateway::DomainName" - }, - "category": "Security", - "startLine": 490, - "startColumn": 3, - "endLine": 490, - "endColumn": 33, - "ruleDescription": "Hardcoded account ID in ARN", - "phase": "LINT" - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "TableCD117FA1", - "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" - }, - "propertyPath": "Properties.KeySchema", - "category": "Best Practice", - "startLine": 12, - "startColumn": 5, - "endLine": 12, - "endColumn": 15, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'RestApiId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "UrlShortenerApiDeployment97FF782966d8a7a27285a49d048d420aab9f3106", - "entityType": "Resource", - "resourceType": "AWS::ApiGateway::Deployment" - }, - "propertyPath": "Properties.RestApiId", - "category": "Best Practice", - "startLine": 223, - "startColumn": 5, - "endLine": 223, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'UrlShortenerApi1FE619BE'" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'RestApiId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "UrlShortenerApiDeploymentStageprod9A3CCA44", - "entityType": "Resource", - "resourceType": "AWS::ApiGateway::Stage" - }, - "propertyPath": "Properties.RestApiId", - "category": "Best Practice", - "startLine": 243, - "startColumn": 5, - "endLine": 243, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'UrlShortenerApi1FE619BE'" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'StageName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "UrlShortenerApiDeploymentStageprod9A3CCA44", - "entityType": "Resource", - "resourceType": "AWS::ApiGateway::Stage" - }, - "propertyPath": "Properties.StageName", - "category": "Best Practice", - "startLine": 246, - "startColumn": 5, - "endLine": 246, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ParentId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "UrlShortenerApiproxy991A3B5C", - "entityType": "Resource", - "resourceType": "AWS::ApiGateway::Resource" - }, - "propertyPath": "Properties.ParentId", - "category": "Best Practice", - "startLine": 258, - "startColumn": 5, - "endLine": 258, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt UrlShortenerApi1FE619BE.RootResourceId" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'PathPart' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "UrlShortenerApiproxy991A3B5C", - "entityType": "Resource", - "resourceType": "AWS::ApiGateway::Resource" - }, - "propertyPath": "Properties.PathPart", - "category": "Best Practice", - "startLine": 264, - "startColumn": 5, - "endLine": 264, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'RestApiId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "UrlShortenerApiproxy991A3B5C", - "entityType": "Resource", - "resourceType": "AWS::ApiGateway::Resource" - }, - "propertyPath": "Properties.RestApiId", - "category": "Best Practice", - "startLine": 265, - "startColumn": 5, - "endLine": 265, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'UrlShortenerApi1FE619BE'" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Action' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "UrlShortenerApiproxyANYApiPermissionurlshortappUrlShortenerApiB1BAB0CDANYproxy8ED41C08", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" - }, - "propertyPath": "Properties.Action", - "category": "Best Practice", - "startLine": 276, - "startColumn": 5, - "endLine": 276, - "endColumn": 12, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "UrlShortenerApiproxyANYApiPermissionurlshortappUrlShortenerApiB1BAB0CDANYproxy8ED41C08", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" - }, - "propertyPath": "Properties.FunctionName", - "category": "Best Practice", - "startLine": 277, - "startColumn": 5, - "endLine": 277, - "endColumn": 18, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt UrlShortenerFunctionB5E87AC1.Arn" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Principal' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "UrlShortenerApiproxyANYApiPermissionurlshortappUrlShortenerApiB1BAB0CDANYproxy8ED41C08", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" - }, - "propertyPath": "Properties.Principal", - "category": "Best Practice", - "startLine": 283, - "startColumn": 5, - "endLine": 283, - "endColumn": 15, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'SourceArn' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "UrlShortenerApiproxyANYApiPermissionurlshortappUrlShortenerApiB1BAB0CDANYproxy8ED41C08", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" - }, - "propertyPath": "Properties.SourceArn", - "category": "Best Practice", - "startLine": 284, - "startColumn": 5, - "endLine": 284, - "endColumn": 15, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "dynamic (Join:arn:aws:execute-api:us-east-1:111111111111:{ref:UrlShortenerApi1FE619BE}/{ref:UrlShortenerApiDeploymentStageprod9A3CCA44}/*/*)" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Action' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "UrlShortenerApiproxyANYApiPermissionTesturlshortappUrlShortenerApiB1BAB0CDANYproxy1B61094D", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" - }, - "propertyPath": "Properties.Action", - "category": "Best Practice", - "startLine": 312, - "startColumn": 5, - "endLine": 312, - "endColumn": 12, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "UrlShortenerApiproxyANYApiPermissionTesturlshortappUrlShortenerApiB1BAB0CDANYproxy1B61094D", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" - }, - "propertyPath": "Properties.FunctionName", - "category": "Best Practice", - "startLine": 313, - "startColumn": 5, - "endLine": 313, - "endColumn": 18, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt UrlShortenerFunctionB5E87AC1.Arn" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Principal' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "UrlShortenerApiproxyANYApiPermissionTesturlshortappUrlShortenerApiB1BAB0CDANYproxy1B61094D", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" - }, - "propertyPath": "Properties.Principal", - "category": "Best Practice", - "startLine": 319, - "startColumn": 5, - "endLine": 319, - "endColumn": 15, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'SourceArn' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "UrlShortenerApiproxyANYApiPermissionTesturlshortappUrlShortenerApiB1BAB0CDANYproxy1B61094D", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" - }, - "propertyPath": "Properties.SourceArn", - "category": "Best Practice", - "startLine": 320, - "startColumn": 5, - "endLine": 320, - "endColumn": 15, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "dynamic (Join:arn:aws:execute-api:us-east-1:111111111111:{ref:UrlShortenerApi1FE619BE}/test-invoke-stage/*/*)" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'HttpMethod' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "UrlShortenerApiproxyANY05B511A9", - "entityType": "Resource", - "resourceType": "AWS::ApiGateway::Method" - }, - "propertyPath": "Properties.HttpMethod", - "category": "Best Practice", - "startLine": 345, - "startColumn": 5, - "endLine": 345, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ResourceId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "UrlShortenerApiproxyANY05B511A9", - "entityType": "Resource", - "resourceType": "AWS::ApiGateway::Method" - }, - "propertyPath": "Properties.ResourceId", - "category": "Best Practice", - "startLine": 369, - "startColumn": 5, - "endLine": 369, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'UrlShortenerApiproxy991A3B5C'" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'RestApiId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "UrlShortenerApiproxyANY05B511A9", - "entityType": "Resource", - "resourceType": "AWS::ApiGateway::Method" - }, - "propertyPath": "Properties.RestApiId", - "category": "Best Practice", - "startLine": 372, - "startColumn": 5, - "endLine": 372, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'UrlShortenerApi1FE619BE'" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Action' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "UrlShortenerApiANYApiPermissionurlshortappUrlShortenerApiB1BAB0CDANYB5D53F00", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" - }, - "propertyPath": "Properties.Action", - "category": "Best Practice", - "startLine": 383, - "startColumn": 5, - "endLine": 383, - "endColumn": 12, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "UrlShortenerApiANYApiPermissionurlshortappUrlShortenerApiB1BAB0CDANYB5D53F00", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" - }, - "propertyPath": "Properties.FunctionName", - "category": "Best Practice", - "startLine": 384, - "startColumn": 5, - "endLine": 384, - "endColumn": 18, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt UrlShortenerFunctionB5E87AC1.Arn" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Principal' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "UrlShortenerApiANYApiPermissionurlshortappUrlShortenerApiB1BAB0CDANYB5D53F00", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" - }, - "propertyPath": "Properties.Principal", - "category": "Best Practice", - "startLine": 390, - "startColumn": 5, - "endLine": 390, - "endColumn": 15, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'SourceArn' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "UrlShortenerApiANYApiPermissionurlshortappUrlShortenerApiB1BAB0CDANYB5D53F00", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" - }, - "propertyPath": "Properties.SourceArn", - "category": "Best Practice", - "startLine": 391, - "startColumn": 5, - "endLine": 391, - "endColumn": 15, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "dynamic (Join:arn:aws:execute-api:us-east-1:111111111111:{ref:UrlShortenerApi1FE619BE}/{ref:UrlShortenerApiDeploymentStageprod9A3CCA44}/*/)" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Action' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "UrlShortenerApiANYApiPermissionTesturlshortappUrlShortenerApiB1BAB0CDANYD47A7EFF", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" - }, - "propertyPath": "Properties.Action", - "category": "Best Practice", - "startLine": 419, - "startColumn": 5, - "endLine": 419, - "endColumn": 12, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "UrlShortenerApiANYApiPermissionTesturlshortappUrlShortenerApiB1BAB0CDANYD47A7EFF", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" - }, - "propertyPath": "Properties.FunctionName", - "category": "Best Practice", - "startLine": 420, - "startColumn": 5, - "endLine": 420, - "endColumn": 18, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt UrlShortenerFunctionB5E87AC1.Arn" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Principal' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "UrlShortenerApiANYApiPermissionTesturlshortappUrlShortenerApiB1BAB0CDANYD47A7EFF", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" - }, - "propertyPath": "Properties.Principal", - "category": "Best Practice", - "startLine": 426, - "startColumn": 5, - "endLine": 426, - "endColumn": 15, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'SourceArn' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "UrlShortenerApiANYApiPermissionTesturlshortappUrlShortenerApiB1BAB0CDANYD47A7EFF", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" - }, - "propertyPath": "Properties.SourceArn", - "category": "Best Practice", - "startLine": 427, - "startColumn": 5, - "endLine": 427, - "endColumn": 15, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "dynamic (Join:arn:aws:execute-api:us-east-1:111111111111:{ref:UrlShortenerApi1FE619BE}/test-invoke-stage/*/)" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'HttpMethod' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "UrlShortenerApiANY5994BD69", - "entityType": "Resource", - "resourceType": "AWS::ApiGateway::Method" - }, - "propertyPath": "Properties.HttpMethod", - "category": "Best Practice", - "startLine": 452, - "startColumn": 5, - "endLine": 452, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ResourceId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "UrlShortenerApiANY5994BD69", - "entityType": "Resource", - "resourceType": "AWS::ApiGateway::Method" - }, - "propertyPath": "Properties.ResourceId", - "category": "Best Practice", - "startLine": 476, - "startColumn": 5, - "endLine": 476, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt UrlShortenerApi1FE619BE.RootResourceId" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'RestApiId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "UrlShortenerApiANY5994BD69", - "entityType": "Resource", - "resourceType": "AWS::ApiGateway::Method" - }, - "propertyPath": "Properties.RestApiId", - "category": "Best Practice", - "startLine": 482, - "startColumn": 5, - "endLine": 482, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'UrlShortenerApi1FE619BE'" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'DomainName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "UrlShortenerApiDomain85D0CE65", - "entityType": "Resource", - "resourceType": "AWS::ApiGateway::DomainName" - }, - "propertyPath": "Properties.DomainName", - "category": "Best Practice", - "startLine": 493, - "startColumn": 5, - "endLine": 493, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'DomainName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "UrlShortenerApiDomainMapurlshortappUrlShortenerApiB1BAB0CD7C6BCC1C", - "entityType": "Resource", - "resourceType": "AWS::ApiGateway::BasePathMapping" - }, - "propertyPath": "Properties.DomainName", - "category": "Best Practice", - "startLine": 508, - "startColumn": 5, - "endLine": 508, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'UrlShortenerApiDomain85D0CE65'" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'HostedZoneId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "UrlShortenerDomain9F16453F", - "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSet" - }, - "propertyPath": "Properties.HostedZoneId", - "category": "Best Practice", - "startLine": 539, - "startColumn": 5, - "endLine": 539, - "endColumn": 18, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53-recordset", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'TableCD117FA1' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "TableCD117FA1", - "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 5, - "startColumn": 4, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'UrlShortenerFunctionServiceRole2FBF9CDA' of type 'AWS::IAM::Role' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "UrlShortenerFunctionServiceRole2FBF9CDA", - "entityType": "Resource", - "resourceType": "AWS::IAM::Role" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 31, - "startColumn": 4, - "endLine": 31, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'UrlShortenerFunctionB5E87AC1' of type 'AWS::Lambda::Function' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "UrlShortenerFunctionB5E87AC1", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 122, - "startColumn": 4, - "endLine": 122, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'UrlShortenerApi1FE619BE' of type 'AWS::ApiGateway::RestApi' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "UrlShortenerApi1FE619BE", - "entityType": "Resource", - "resourceType": "AWS::ApiGateway::RestApi" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 157, - "startColumn": 4, - "endLine": 157, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'UrlShortenerApiCloudWatchRole28577D98' of type 'AWS::IAM::Role' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "UrlShortenerApiCloudWatchRole28577D98", - "entityType": "Resource", - "resourceType": "AWS::IAM::Role" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 166, - "startColumn": 4, - "endLine": 166, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'UrlShortenerApiDeploymentStageprod9A3CCA44' of type 'AWS::ApiGateway::Stage' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "UrlShortenerApiDeploymentStageprod9A3CCA44", - "entityType": "Resource", - "resourceType": "AWS::ApiGateway::Stage" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 239, - "startColumn": 4, - "endLine": 239, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'UrlShortenerApiDomain85D0CE65' of type 'AWS::ApiGateway::DomainName' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "UrlShortenerApiDomain85D0CE65", - "entityType": "Resource", - "resourceType": "AWS::ApiGateway::DomainName" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 492, - "startColumn": 4, - "endLine": 492, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] } } diff --git a/src/resources/expected/validation_reports5.json b/src/resources/expected/validation_reports5.json index 2c1c14d6..13049617 100644 --- a/src/resources/expected/validation_reports5.json +++ b/src/resources/expected/validation_reports5.json @@ -1,14 +1,14 @@ { - "cdk/py-url-shortener--urlshort-load-test.template.json": { - "filePath": "cdk/py-url-shortener--urlshort-load-test.template.json", + "cdk/py-ecs-serviceconnect--CdkExamplesServiceConnectStackEcrStack6B6F0F99.nested.template.json": { + "filePath": "cdk/py-ecs-serviceconnect--CdkExamplesServiceConnectStackEcrStack6B6F0F99.nested.template.json", "status": "OK", "metadata": { "resourcesScanned": 8, "counts": { "fatal": 0, "errors": 0, - "warnings": 0, - "informational": 18, + "warnings": 1, + "informational": 6, "debug": 0 }, "suppressed": 0, @@ -16,23 +16,43 @@ "severityLevel": "DEBUG" }, "diagnostics": [ + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'CustomCDKECRDeploymentbd07c930edb94112a20f03f096f53666512MiBServiceRole8C8B0491' dependency already enforced by a 'GetAtt' at 'Properties.Role'", + "source": "CFN_LINT", + "entity": { + "logicalId": "CustomCDKECRDeploymentbd07c930edb94112a20f03f096f53666512MiB28EAD8E4", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 163, + "startColumn": 4, + "endLine": 163, + "endColumn": 14, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" + }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", + "message": "Property 'RepositoryName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "generatorPingTask1D3C2E79", + "logicalId": "FrontendRepository7D714FA2", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::ECR::Repository" }, - "propertyPath": "Properties.ContainerDefinitions", + "propertyPath": "Properties.RepositoryName", "category": "Best Practice", - "startLine": 32, + "startLine": 6, "startColumn": 5, - "endLine": 32, - "endColumn": 26, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "endLine": 6, + "endColumn": 20, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ecr.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -42,20 +62,20 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", + "message": "Property 'RepositoryName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "generatorPingTask1D3C2E79", + "logicalId": "BackendDataRepositoryD361813E", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::ECR::Repository" }, - "propertyPath": "Properties.Cpu", + "propertyPath": "Properties.RepositoryName", "category": "Best Practice", - "startLine": 47, + "startLine": 17, "startColumn": 5, - "endLine": 47, - "endColumn": 9, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "endLine": 17, + "endColumn": 20, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ecr.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -63,115 +83,120 @@ } }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'ExecutionRoleArn' is create-only; updating it will cause resource replacement", + "message": "Resource 'FrontendRepository7D714FA2' of type 'AWS::ECR::Repository' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "generatorPingTask1D3C2E79", + "logicalId": "FrontendRepository7D714FA2", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::ECR::Repository" }, - "propertyPath": "Properties.ExecutionRoleArn", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 48, - "startColumn": 5, - "endLine": 48, - "endColumn": 22, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt generatorPingTaskExecutionRoleA7BE7F8B.Arn" - } + "startLine": 5, + "startColumn": 4, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Family' is create-only; updating it will cause resource replacement", + "message": "Resource 'BackendDataRepositoryD361813E' of type 'AWS::ECR::Repository' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "generatorPingTask1D3C2E79", + "logicalId": "BackendDataRepositoryD361813E", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::ECR::Repository" }, - "propertyPath": "Properties.Family", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 54, - "startColumn": 5, - "endLine": 54, - "endColumn": 12, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 16, + "startColumn": 4, + "endLine": 16, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Memory' is create-only; updating it will cause resource replacement", + "message": "Resource 'CustomCDKECRDeploymentbd07c930edb94112a20f03f096f53666512MiBServiceRole8C8B0491' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "generatorPingTask1D3C2E79", + "logicalId": "CustomCDKECRDeploymentbd07c930edb94112a20f03f096f53666512MiBServiceRole8C8B0491", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.Memory", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 55, - "startColumn": 5, - "endLine": 55, - "endColumn": 12, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 70, + "startColumn": 4, + "endLine": 70, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", + "message": "Resource 'CustomCDKECRDeploymentbd07c930edb94112a20f03f096f53666512MiB28EAD8E4' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "generatorPingTask1D3C2E79", + "logicalId": "CustomCDKECRDeploymentbd07c930edb94112a20f03f096f53666512MiB28EAD8E4", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.NetworkMode", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 56, - "startColumn": 5, - "endLine": 56, - "endColumn": 17, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 144, + "startColumn": 4, + "endLine": 144, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "cdk/py-ecs-serviceconnect--CdkExamplesServiceConnectStackEcsStack19C526D0.nested.template.json": { + "filePath": "cdk/py-ecs-serviceconnect--CdkExamplesServiceConnectStackEcsStack19C526D0.nested.template.json", + "status": "OK", + "metadata": { + "resourcesScanned": 20, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 61, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", + "message": "Property 'ClusterName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "generatorPingTask1D3C2E79", + "logicalId": "ECSCluster7D463CD4", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::ECS::Cluster" }, - "propertyPath": "Properties.RequiresCompatibilities", + "propertyPath": "Properties.ClusterName", "category": "Best Practice", - "startLine": 57, + "startLine": 6, "startColumn": 5, - "endLine": 57, - "endColumn": 29, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "endLine": 6, + "endColumn": 17, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -181,70 +206,70 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'TaskRoleArn' is create-only; updating it will cause resource replacement", + "message": "Property 'Name' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "generatorPingTask1D3C2E79", + "logicalId": "ECSClusterDefaultServiceDiscoveryNamespace5AC2D2BE", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::ServiceDiscovery::PrivateDnsNamespace" }, - "propertyPath": "Properties.TaskRoleArn", + "propertyPath": "Properties.Name", "category": "Best Practice", - "startLine": 60, + "startLine": 29, "startColumn": 5, - "endLine": 60, - "endColumn": 17, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "endLine": 29, + "endColumn": 10, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt generatorPingTaskTaskRoleA4886BE8.Arn" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Cluster' is create-only; updating it will cause resource replacement", + "message": "Property 'Vpc' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "generatorserviceServiceA6AC5079", + "logicalId": "ECSClusterDefaultServiceDiscoveryNamespace5AC2D2BE", "entityType": "Resource", - "resourceType": "AWS::ECS::Service" + "resourceType": "AWS::ServiceDiscovery::PrivateDnsNamespace" }, - "propertyPath": "Properties.Cluster", + "propertyPath": "Properties.Vpc", "category": "Best Practice", - "startLine": 138, + "startLine": 30, "startColumn": 5, - "endLine": 138, - "endColumn": 13, + "endLine": 30, + "endColumn": 9, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "Ref to 'generatorcluster9804CB70'" + "resolutionSource": "parameter 'referencetoCdkExamplesServiceConnectStackServiceConnectVPCE46B65DFRef' (type String)" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'LaunchType' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'LogGroupName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "generatorserviceServiceA6AC5079", + "logicalId": "ECSServiceLogGroupD961AA4E", "entityType": "Resource", - "resourceType": "AWS::ECS::Service" + "resourceType": "AWS::Logs::LogGroup" }, - "propertyPath": "Properties.LaunchType", + "propertyPath": "Properties.LogGroupName", "category": "Best Practice", - "startLine": 152, + "startLine": 41, "startColumn": 5, - "endLine": 152, - "endColumn": 16, + "endLine": 41, + "endColumn": 18, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-logs.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only", + "resolutionSource": "dynamic (Join:{ref:ECSCluster7D463CD4}-service)" } }, { @@ -253,15 +278,15 @@ "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "generatorserviceSecurityGroup3D8BECF8", + "logicalId": "ECSSecurityGroupA14DBE7D", "entityType": "Resource", "resourceType": "AWS::EC2::SecurityGroup" }, "propertyPath": "Properties.GroupDescription", "category": "Best Practice", - "startLine": 185, + "startLine": 219, "startColumn": 5, - "endLine": 185, + "endLine": 219, "endColumn": 22, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", @@ -275,241 +300,250 @@ "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "generatorserviceSecurityGroup3D8BECF8", + "logicalId": "ECSSecurityGroupA14DBE7D", "entityType": "Resource", "resourceType": "AWS::EC2::SecurityGroup" }, "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 193, + "startLine": 238, "startColumn": 5, - "endLine": 193, + "endLine": 238, "endColumn": 11, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "parameter 'referencetoCdkExamplesServiceConnectStackServiceConnectVPCE46B65DFRef' (type String)" } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'generatorcluster9804CB70' of type 'AWS::ECS::Cluster' supports Tags but none are configured", + "message": "Property 'FromPort' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "generatorcluster9804CB70", + "logicalId": "ECSSecurityGroupfromCdkExamplesServiceConnectStackEcsStackPublicLBSG6A107D2A50006E3540BF", "entityType": "Resource", - "resourceType": "AWS::ECS::Cluster" + "resourceType": "AWS::EC2::SecurityGroupIngress" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.FromPort", "category": "Best Practice", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 28, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 250, + "startColumn": 5, + "endLine": 250, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'generatorPingTaskTaskRoleA4886BE8' of type 'AWS::IAM::Role' supports Tags but none are configured", + "message": "Property 'GroupId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "generatorPingTaskTaskRoleA4886BE8", + "logicalId": "ECSSecurityGroupfromCdkExamplesServiceConnectStackEcsStackPublicLBSG6A107D2A50006E3540BF", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::EC2::SecurityGroupIngress" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.GroupId", "category": "Best Practice", - "startLine": 11, - "startColumn": 4, - "endLine": 11, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 251, + "startColumn": 5, + "endLine": 251, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "GetAtt ECSSecurityGroupA14DBE7D.GroupId" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'generatorPingTask1D3C2E79' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", + "message": "Property 'IpProtocol' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "generatorPingTask1D3C2E79", + "logicalId": "ECSSecurityGroupfromCdkExamplesServiceConnectStackEcsStackPublicLBSG6A107D2A50006E3540BF", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::EC2::SecurityGroupIngress" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.IpProtocol", "category": "Best Practice", - "startLine": 31, - "startColumn": 4, - "endLine": 31, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 257, + "startColumn": 5, + "endLine": 257, + "endColumn": 16, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'generatorPingTaskExecutionRoleA7BE7F8B' of type 'AWS::IAM::Role' supports Tags but none are configured", + "message": "Property 'SourceSecurityGroupId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "generatorPingTaskExecutionRoleA7BE7F8B", + "logicalId": "ECSSecurityGroupfromCdkExamplesServiceConnectStackEcsStackPublicLBSG6A107D2A50006E3540BF", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::EC2::SecurityGroupIngress" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.SourceSecurityGroupId", "category": "Best Practice", - "startLine": 73, - "startColumn": 4, - "endLine": 73, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 258, + "startColumn": 5, + "endLine": 258, + "endColumn": 27, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "GetAtt PublicLBSG963B1ACE.GroupId" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'generatorserviceServiceA6AC5079' of type 'AWS::ECS::Service' supports Tags but none are configured", + "message": "Property 'ToPort' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "generatorserviceServiceA6AC5079", + "logicalId": "ECSSecurityGroupfromCdkExamplesServiceConnectStackEcsStackPublicLBSG6A107D2A50006E3540BF", "entityType": "Resource", - "resourceType": "AWS::ECS::Service" + "resourceType": "AWS::EC2::SecurityGroupIngress" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.ToPort", "category": "Best Practice", - "startLine": 137, - "startColumn": 4, - "endLine": 137, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 264, + "startColumn": 5, + "endLine": 264, + "endColumn": 12, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'generatorserviceSecurityGroup3D8BECF8' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", + "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "generatorserviceSecurityGroup3D8BECF8", + "logicalId": "FrontendTaskDefinition6CBC2B00", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 184, - "startColumn": 4, - "endLine": 184, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "cdk/r53-resolver--R53ResolverStack.template.json": { - "filePath": "cdk/r53-resolver--R53ResolverStack.template.json", - "status": "OK", - "metadata": { - "resourcesScanned": 18, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 1, - "informational": 33, - "debug": 0 + "startLine": 273, + "startColumn": 5, + "endLine": 273, + "endColumn": 26, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "W3005", - "severity": "WARN", - "message": "'CustomVpcRestrictDefaultSGCustomResourceProviderRole26592FE0' dependency already enforced by a 'GetAtt' at 'Properties.Role'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "CustomVpcRestrictDefaultSGCustomResourceProviderHandlerDC833E5E", + "logicalId": "FrontendTaskDefinition6CBC2B00", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", + "propertyPath": "Properties.Cpu", "category": "Best Practice", - "startLine": 271, - "startColumn": 4, - "endLine": 271, - "endColumn": 14, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", - "phase": "LINT" + "startLine": 302, + "startColumn": 5, + "endLine": 302, + "endColumn": 9, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Property 'ExecutionRoleArn' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "R53ResolverTestVPC9B993306", + "logicalId": "FrontendTaskDefinition6CBC2B00", "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Properties.ExecutionRoleArn", "category": "Best Practice", - "startLine": 6, + "startLine": 303, "startColumn": 5, - "endLine": 6, - "endColumn": 15, + "endLine": 303, + "endColumn": 22, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "GetAtt ECSTaskIamRole84EB0A02.Arn" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'InstanceTenancy' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'Family' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "R53ResolverTestVPC9B993306", + "logicalId": "FrontendTaskDefinition6CBC2B00", "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.InstanceTenancy", + "propertyPath": "Properties.Family", "category": "Best Practice", - "startLine": 9, + "startLine": 309, "startColumn": 5, - "endLine": 9, - "endColumn": 21, + "endLine": 309, + "endColumn": 12, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", + "message": "Property 'Memory' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "R53ResolverTestVPCPrivateSubnet1Subnet5DBB6B2C", + "logicalId": "FrontendTaskDefinition6CBC2B00", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.AvailabilityZone", + "propertyPath": "Properties.Memory", "category": "Best Practice", - "startLine": 24, + "startLine": 310, "startColumn": 5, - "endLine": 24, - "endColumn": 22, + "endLine": 310, + "endColumn": 12, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -519,19 +553,20 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "R53ResolverTestVPCPrivateSubnet1Subnet5DBB6B2C", + "logicalId": "FrontendTaskDefinition6CBC2B00", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 32, + "startLine": 311, "startColumn": 5, - "endLine": 32, - "endColumn": 15, + "endLine": 311, + "endColumn": 17, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -541,142 +576,137 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "R53ResolverTestVPCPrivateSubnet1Subnet5DBB6B2C", + "logicalId": "FrontendTaskDefinition6CBC2B00", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 48, + "startLine": 312, "startColumn": 5, - "endLine": 48, - "endColumn": 11, + "endLine": 312, + "endColumn": 29, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'R53ResolverTestVPC9B993306'" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "message": "Property 'TaskRoleArn' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "R53ResolverTestVPCPrivateSubnet1RouteTable6E169019", + "logicalId": "FrontendTaskDefinition6CBC2B00", "entityType": "Resource", - "resourceType": "AWS::EC2::RouteTable" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.TaskRoleArn", "category": "Best Practice", - "startLine": 65, + "startLine": 315, "startColumn": 5, - "endLine": 65, - "endColumn": 11, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", + "endLine": 315, + "endColumn": 17, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "Ref to 'R53ResolverTestVPC9B993306'" + "resolutionSource": "GetAtt TaskexecutionRole978012CD.Arn" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", + "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "R53ResolverTestVPCPrivateSubnet1RouteTableAssociation41B46D9B", + "logicalId": "BackendTaskDefinitionEC224DE6", "entityType": "Resource", - "resourceType": "AWS::EC2::SubnetRouteTableAssociation" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.RouteTableId", + "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 76, + "startLine": 337, "startColumn": 5, - "endLine": 76, - "endColumn": 18, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 337, + "endColumn": 26, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'R53ResolverTestVPCPrivateSubnet1RouteTable6E169019'", - "extra": { - "replacement_strategy": "delete_then_create" - } + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", + "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "R53ResolverTestVPCPrivateSubnet1RouteTableAssociation41B46D9B", + "logicalId": "BackendTaskDefinitionEC224DE6", "entityType": "Resource", - "resourceType": "AWS::EC2::SubnetRouteTableAssociation" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.SubnetId", + "propertyPath": "Properties.Cpu", "category": "Best Practice", - "startLine": 79, + "startLine": 366, "startColumn": 5, - "endLine": 79, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 366, + "endColumn": 9, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'R53ResolverTestVPCPrivateSubnet1Subnet5DBB6B2C'", - "extra": { - "replacement_strategy": "delete_then_create" - } + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", + "message": "Property 'ExecutionRoleArn' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "R53ResolverTestVPCPrivateSubnet2Subnet495784E7", + "logicalId": "BackendTaskDefinitionEC224DE6", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.AvailabilityZone", + "propertyPath": "Properties.ExecutionRoleArn", "category": "Best Practice", - "startLine": 90, + "startLine": 367, "startColumn": 5, - "endLine": 90, + "endLine": 367, "endColumn": 22, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "GetAtt ECSTaskIamRole84EB0A02.Arn" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Property 'Family' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "R53ResolverTestVPCPrivateSubnet2Subnet495784E7", + "logicalId": "BackendTaskDefinitionEC224DE6", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Properties.Family", "category": "Best Practice", - "startLine": 98, + "startLine": 373, "startColumn": 5, - "endLine": 98, - "endColumn": 15, + "endLine": 373, + "endColumn": 12, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -686,166 +716,157 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "message": "Property 'Memory' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "R53ResolverTestVPCPrivateSubnet2Subnet495784E7", + "logicalId": "BackendTaskDefinitionEC224DE6", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.Memory", "category": "Best Practice", - "startLine": 114, + "startLine": 374, "startColumn": 5, - "endLine": 114, - "endColumn": 11, + "endLine": 374, + "endColumn": 12, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'R53ResolverTestVPC9B993306'" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "R53ResolverTestVPCPrivateSubnet2RouteTable0899A697", + "logicalId": "BackendTaskDefinitionEC224DE6", "entityType": "Resource", - "resourceType": "AWS::EC2::RouteTable" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 131, + "startLine": 375, "startColumn": 5, - "endLine": 131, - "endColumn": 11, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", + "endLine": 375, + "endColumn": 17, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'R53ResolverTestVPC9B993306'" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", + "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "R53ResolverTestVPCPrivateSubnet2RouteTableAssociation53E27A3B", + "logicalId": "BackendTaskDefinitionEC224DE6", "entityType": "Resource", - "resourceType": "AWS::EC2::SubnetRouteTableAssociation" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.RouteTableId", + "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 142, + "startLine": 376, "startColumn": 5, - "endLine": 142, - "endColumn": 18, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 376, + "endColumn": 29, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'R53ResolverTestVPCPrivateSubnet2RouteTable0899A697'", - "extra": { - "replacement_strategy": "delete_then_create" - } + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", + "message": "Property 'TaskRoleArn' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "R53ResolverTestVPCPrivateSubnet2RouteTableAssociation53E27A3B", + "logicalId": "BackendTaskDefinitionEC224DE6", "entityType": "Resource", - "resourceType": "AWS::EC2::SubnetRouteTableAssociation" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.SubnetId", + "propertyPath": "Properties.TaskRoleArn", "category": "Best Practice", - "startLine": 145, + "startLine": 379, "startColumn": 5, - "endLine": 145, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 379, + "endColumn": 17, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "Ref to 'R53ResolverTestVPCPrivateSubnet2Subnet495784E7'", - "extra": { - "replacement_strategy": "delete_then_create" - } + "resolutionSource": "GetAtt TaskexecutionRole978012CD.Arn" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'FirewallRuleGroupId' is create-only; updating it will cause resource replacement", + "message": "Property 'Cluster' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "BlockListRuleGroupDirectBlockListRuleGroupAssociation40E90DB0", + "logicalId": "FrontendServiceBC94BA93", "entityType": "Resource", - "resourceType": "AWS::Route53Resolver::FirewallRuleGroupAssociation" + "resourceType": "AWS::ECS::Service" }, - "propertyPath": "Properties.FirewallRuleGroupId", + "propertyPath": "Properties.Cluster", "category": "Best Practice", - "startLine": 316, + "startLine": 401, "startColumn": 5, - "endLine": 316, - "endColumn": 25, + "endLine": 401, + "endColumn": 13, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "GetAtt BlockListRuleGroup55F6B55D.Id" + "resolutionSource": "Ref to 'ECSCluster7D463CD4'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "message": "Property 'LaunchType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "BlockListRuleGroupDirectBlockListRuleGroupAssociation40E90DB0", + "logicalId": "FrontendServiceBC94BA93", "entityType": "Resource", - "resourceType": "AWS::Route53Resolver::FirewallRuleGroupAssociation" + "resourceType": "AWS::ECS::Service" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.LaunchType", "category": "Best Practice", - "startLine": 323, + "startLine": 411, "startColumn": 5, - "endLine": 323, - "endColumn": 11, + "endLine": 411, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'R53ResolverTestVPC9B993306'" + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", + "message": "Property 'ServiceName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "sgoutboundendpointEC0509A3", + "logicalId": "FrontendServiceBC94BA93", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::ECS::Service" }, - "propertyPath": "Properties.GroupDescription", + "propertyPath": "Properties.ServiceName", "category": "Best Practice", - "startLine": 334, + "startLine": 456, "startColumn": 5, - "endLine": 334, - "endColumn": 22, + "endLine": 456, + "endColumn": 17, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -855,66 +876,64 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "message": "Property 'Cluster' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "sgoutboundendpointEC0509A3", + "logicalId": "BackendService7A4224EE", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::ECS::Service" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.Cluster", "category": "Best Practice", - "startLine": 396, + "startLine": 473, "startColumn": 5, - "endLine": 396, - "endColumn": 11, + "endLine": 473, + "endColumn": 13, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "Ref to 'R53ResolverTestVPC9B993306'" + "resolutionSource": "Ref to 'ECSCluster7D463CD4'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Direction' is create-only; updating it will cause resource replacement", + "message": "Property 'LaunchType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "OutboundEndpoint", + "logicalId": "BackendService7A4224EE", "entityType": "Resource", - "resourceType": "AWS::Route53Resolver::ResolverEndpoint" + "resourceType": "AWS::ECS::Service" }, - "propertyPath": "Properties.Direction", + "propertyPath": "Properties.LaunchType", "category": "Best Practice", - "startLine": 407, + "startLine": 482, "startColumn": 5, - "endLine": 407, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53resolver", + "endLine": 482, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'SecurityGroupIds' is create-only; updating it will cause resource replacement", + "message": "Property 'ServiceName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "OutboundEndpoint", + "logicalId": "BackendService7A4224EE", "entityType": "Resource", - "resourceType": "AWS::Route53Resolver::ResolverEndpoint" + "resourceType": "AWS::ECS::Service" }, - "propertyPath": "Properties.SecurityGroupIds", + "propertyPath": "Properties.ServiceName", "category": "Best Practice", - "startLine": 420, + "startLine": 518, "startColumn": 5, - "endLine": 420, - "endColumn": 22, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53resolver", + "endLine": 518, + "endColumn": 17, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -927,15 +946,15 @@ "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "sginboundendpoint32081788", + "logicalId": "PublicLBSG963B1ACE", "entityType": "Resource", "resourceType": "AWS::EC2::SecurityGroup" }, "propertyPath": "Properties.GroupDescription", "category": "Best Practice", - "startLine": 436, + "startLine": 533, "startColumn": 5, - "endLine": 436, + "endLine": 533, "endColumn": 22, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", @@ -949,40 +968,39 @@ "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "sginboundendpoint32081788", + "logicalId": "PublicLBSG963B1ACE", "entityType": "Resource", "resourceType": "AWS::EC2::SecurityGroup" }, "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 460, + "startLine": 550, "startColumn": 5, - "endLine": 460, + "endLine": 550, "endColumn": 11, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "Ref to 'R53ResolverTestVPC9B993306'" + "resolutionSource": "parameter 'referencetoCdkExamplesServiceConnectStackServiceConnectVPCE46B65DFRef' (type String)" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Direction' is create-only; updating it will cause resource replacement", + "message": "Property 'Name' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "InboundEndpoint", + "logicalId": "TargetGroup3D7CD9B8", "entityType": "Resource", - "resourceType": "AWS::Route53Resolver::ResolverEndpoint" + "resourceType": "AWS::ElasticLoadBalancingV2::TargetGroup" }, - "propertyPath": "Properties.Direction", + "propertyPath": "Properties.Name", "category": "Best Practice", - "startLine": 471, + "startLine": 566, "startColumn": 5, - "endLine": 471, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53resolver", + "endLine": 566, + "endColumn": 10, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -992,20 +1010,19 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'SecurityGroupIds' is create-only; updating it will cause resource replacement", + "message": "Property 'Port' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "InboundEndpoint", + "logicalId": "TargetGroup3D7CD9B8", "entityType": "Resource", - "resourceType": "AWS::Route53Resolver::ResolverEndpoint" + "resourceType": "AWS::ElasticLoadBalancingV2::TargetGroup" }, - "propertyPath": "Properties.SecurityGroupIds", + "propertyPath": "Properties.Port", "category": "Best Practice", - "startLine": 484, + "startLine": 567, "startColumn": 5, - "endLine": 484, - "endColumn": 22, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53resolver", + "endLine": 567, + "endColumn": 10, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -1013,61 +1030,182 @@ } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'CustomVpcRestrictDefaultSGCustomResourceProviderRole26592FE0' of type 'AWS::IAM::Role' supports Tags but none are configured", + "message": "Property 'Protocol' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "CustomVpcRestrictDefaultSGCustomResourceProviderRole26592FE0", + "logicalId": "TargetGroup3D7CD9B8", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::ElasticLoadBalancingV2::TargetGroup" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.Protocol", "category": "Best Practice", - "startLine": 180, - "startColumn": 4, - "endLine": 180, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", + "startLine": 568, + "startColumn": 5, + "endLine": 568, + "endColumn": 14, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'CustomVpcRestrictDefaultSGCustomResourceProviderHandlerDC833E5E' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "message": "Property 'TargetType' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "CustomVpcRestrictDefaultSGCustomResourceProviderHandlerDC833E5E", + "logicalId": "TargetGroup3D7CD9B8", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::ElasticLoadBalancingV2::TargetGroup" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.TargetType", "category": "Best Practice", - "startLine": 252, - "startColumn": 4, - "endLine": 252, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 579, + "startColumn": 5, + "endLine": 579, + "endColumn": 16, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "TargetGroup3D7CD9B8", + "entityType": "Resource", + "resourceType": "AWS::ElasticLoadBalancingV2::TargetGroup" + }, + "propertyPath": "Properties.VpcId", + "category": "Best Practice", + "startLine": 581, + "startColumn": 5, + "endLine": 581, + "endColumn": 11, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "parameter 'referencetoCdkExamplesServiceConnectStackServiceConnectVPCE46B65DFRef' (type String)" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Scheme' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "FrontendLB2FA80AC2", + "entityType": "Resource", + "resourceType": "AWS::ElasticLoadBalancingV2::LoadBalancer" + }, + "propertyPath": "Properties.Scheme", + "category": "Best Practice", + "startLine": 602, + "startColumn": 5, + "endLine": 602, + "endColumn": 12, + "documentationUrl": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-loadbalancer.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Type' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "FrontendLB2FA80AC2", + "entityType": "Resource", + "resourceType": "AWS::ElasticLoadBalancingV2::LoadBalancer" + }, + "propertyPath": "Properties.Type", + "category": "Best Practice", + "startLine": 619, + "startColumn": 5, + "endLine": 619, + "endColumn": 10, + "documentationUrl": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-loadbalancer.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'LoadBalancerArn' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "FrontendLBListener230479D8", + "entityType": "Resource", + "resourceType": "AWS::ElasticLoadBalancingV2::Listener" + }, + "propertyPath": "Properties.LoadBalancerArn", + "category": "Best Practice", + "startLine": 636, + "startColumn": 5, + "endLine": 636, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-elasticloadbalancingv2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'FrontendLB2FA80AC2'" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ListenerArn' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ListenerRule73F9AC5E", + "entityType": "Resource", + "resourceType": "AWS::ElasticLoadBalancingV2::ListenerRule" + }, + "propertyPath": "Properties.ListenerArn", + "category": "Best Practice", + "startLine": 667, + "startColumn": 5, + "endLine": 667, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-elasticloadbalancingv2", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'FrontendLBListener230479D8'" + } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'BlockListC03D0423' of type 'AWS::Route53Resolver::FirewallDomainList' supports Tags but none are configured", + "message": "Resource 'ECSCluster7D463CD4' of type 'AWS::ECS::Cluster' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "BlockListC03D0423", + "logicalId": "ECSCluster7D463CD4", "entityType": "Resource", - "resourceType": "AWS::Route53Resolver::FirewallDomainList" + "resourceType": "AWS::ECS::Cluster" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 282, + "startLine": 5, "startColumn": 4, - "endLine": 282, + "endLine": 5, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -1075,19 +1213,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'BlockListRuleGroup55F6B55D' of type 'AWS::Route53Resolver::FirewallRuleGroup' supports Tags but none are configured", + "message": "Resource 'ECSClusterDefaultServiceDiscoveryNamespace5AC2D2BE' of type 'AWS::ServiceDiscovery::PrivateDnsNamespace' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "BlockListRuleGroup55F6B55D", + "logicalId": "ECSClusterDefaultServiceDiscoveryNamespace5AC2D2BE", "entityType": "Resource", - "resourceType": "AWS::Route53Resolver::FirewallRuleGroup" + "resourceType": "AWS::ServiceDiscovery::PrivateDnsNamespace" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 294, + "startLine": 28, "startColumn": 4, - "endLine": 294, + "endLine": 28, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -1095,19 +1233,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'BlockListRuleGroupDirectBlockListRuleGroupAssociation40E90DB0' of type 'AWS::Route53Resolver::FirewallRuleGroupAssociation' supports Tags but none are configured", + "message": "Resource 'ECSServiceLogGroupD961AA4E' of type 'AWS::Logs::LogGroup' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "BlockListRuleGroupDirectBlockListRuleGroupAssociation40E90DB0", + "logicalId": "ECSServiceLogGroupD961AA4E", "entityType": "Resource", - "resourceType": "AWS::Route53Resolver::FirewallRuleGroupAssociation" + "resourceType": "AWS::Logs::LogGroup" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 315, + "startLine": 40, "startColumn": 4, - "endLine": 315, + "endLine": 40, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -1115,19 +1253,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'sgoutboundendpointEC0509A3' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", + "message": "Resource 'ECSTaskIamRole84EB0A02' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "sgoutboundendpointEC0509A3", + "logicalId": "ECSTaskIamRole84EB0A02", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::IAM::Role" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 333, + "startLine": 62, "startColumn": 4, - "endLine": 333, + "endLine": 62, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -1135,19 +1273,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'OutboundEndpoint' of type 'AWS::Route53Resolver::ResolverEndpoint' supports Tags but none are configured", + "message": "Resource 'TaskexecutionRole978012CD' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "OutboundEndpoint", + "logicalId": "TaskexecutionRole978012CD", "entityType": "Resource", - "resourceType": "AWS::Route53Resolver::ResolverEndpoint" + "resourceType": "AWS::IAM::Role" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 406, + "startLine": 172, "startColumn": 4, - "endLine": 406, + "endLine": 172, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -1155,19 +1293,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'sginboundendpoint32081788' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", + "message": "Resource 'ECSSecurityGroupA14DBE7D' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "sginboundendpoint32081788", + "logicalId": "ECSSecurityGroupA14DBE7D", "entityType": "Resource", "resourceType": "AWS::EC2::SecurityGroup" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 435, + "startLine": 218, "startColumn": 4, - "endLine": 435, + "endLine": 218, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -1175,295 +1313,99 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'InboundEndpoint' of type 'AWS::Route53Resolver::ResolverEndpoint' supports Tags but none are configured", + "message": "Resource 'FrontendTaskDefinition6CBC2B00' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "InboundEndpoint", + "logicalId": "FrontendTaskDefinition6CBC2B00", "entityType": "Resource", - "resourceType": "AWS::Route53Resolver::ResolverEndpoint" + "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 470, + "startLine": 272, "startColumn": 4, - "endLine": 470, + "endLine": 272, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" - } - ] - }, - "cdk/rekognition-lambda-s3-trigger--RekognitionLambdaS3TriggerStack.template.json": { - "filePath": "cdk/rekognition-lambda-s3-trigger--RekognitionLambdaS3TriggerStack.template.json", - "status": "OK", - "metadata": { - "resourcesScanned": 15, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 4, - "informational": 14, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "W2531", - "severity": "WARN", - "message": "Runtime 'nodejs20.x' was deprecated on '2026-04-30'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'nodejs24.x'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'FrontendTaskDefinitionFrontendContainerLogGroup994ED50C' of type 'AWS::Logs::LogGroup' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "RekFunction9837D13D", + "logicalId": "FrontendTaskDefinitionFrontendContainerLogGroup994ED50C", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::Logs::LogGroup" }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 310, - "startColumn": 5, - "endLine": 310, - "endColumn": 13, - "ruleDescription": "Check if EOL Lambda Function Runtimes are used", - "phase": "SCHEMA", - "context": { - "actualValue": "nodejs20.x", - "lifecycle": "deprecated" - } + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 326, + "startColumn": 3, + "endLine": 326, + "endColumn": 59, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "W3005", - "severity": "WARN", - "message": "'RekFunctionServiceRole3947AEF4' dependency already enforced by a 'GetAtt' at 'Properties.Role'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'BackendTaskDefinitionEC224DE6' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "RekFunction9837D13D", + "logicalId": "BackendTaskDefinitionEC224DE6", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 312, + "startLine": 336, "startColumn": 4, - "endLine": 312, - "endColumn": 14, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "endLine": 336, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "W3005", - "severity": "WARN", - "message": "'BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleB6FB88EC' dependency already enforced by a 'GetAtt' at 'Properties.Role'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'BackendTaskDefinitionBackendContainerLogGroup5E30F6E8' of type 'AWS::Logs::LogGroup' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "BucketNotificationsHandler050a0587b7544547bf325f094a3db8347ECC3691", + "logicalId": "BackendTaskDefinitionBackendContainerLogGroup5E30F6E8", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", - "category": "Best Practice", - "startLine": 428, - "startColumn": 4, - "endLine": 428, - "endColumn": 14, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", - "phase": "LINT" - }, - { - "ruleId": "W3005", - "severity": "WARN", - "message": "'LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aServiceRole9741ECFB' dependency already enforced by a 'GetAtt' at 'Properties.Role'", - "source": "CFN_LINT", - "entity": { - "logicalId": "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aFD4BFC8A", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", - "category": "Best Practice", - "startLine": 516, - "startColumn": 4, - "endLine": 516, - "endColumn": 14, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", - "phase": "LINT" - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Action' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "BucketAllowBucketNotificationsToRekognitionLambdaS3TriggerStackRekFunction8330C87915B3782A", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" - }, - "propertyPath": "Properties.Action", - "category": "Best Practice", - "startLine": 103, - "startColumn": 5, - "endLine": 103, - "endColumn": 12, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "BucketAllowBucketNotificationsToRekognitionLambdaS3TriggerStackRekFunction8330C87915B3782A", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" - }, - "propertyPath": "Properties.FunctionName", - "category": "Best Practice", - "startLine": 104, - "startColumn": 5, - "endLine": 104, - "endColumn": 18, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt RekFunction9837D13D.Arn" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Principal' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "BucketAllowBucketNotificationsToRekognitionLambdaS3TriggerStackRekFunction8330C87915B3782A", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" - }, - "propertyPath": "Properties.Principal", - "category": "Best Practice", - "startLine": 110, - "startColumn": 5, - "endLine": 110, - "endColumn": 15, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'SourceAccount' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "BucketAllowBucketNotificationsToRekognitionLambdaS3TriggerStackRekFunction8330C87915B3782A", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" - }, - "propertyPath": "Properties.SourceAccount", - "category": "Best Practice", - "startLine": 111, - "startColumn": 5, - "endLine": 111, - "endColumn": 19, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'SourceArn' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "BucketAllowBucketNotificationsToRekognitionLambdaS3TriggerStackRekFunction8330C87915B3782A", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" - }, - "propertyPath": "Properties.SourceArn", - "category": "Best Practice", - "startLine": 114, - "startColumn": 5, - "endLine": 114, - "endColumn": 15, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt Bucket83908E77.Arn" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Classifications0C921F6C", - "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" - }, - "propertyPath": "Properties.KeySchema", - "category": "Best Practice", - "startLine": 134, - "startColumn": 5, - "endLine": 134, - "endColumn": 15, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Bucket83908E77' of type 'AWS::S3::Bucket' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "Bucket83908E77", - "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::Logs::LogGroup" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 3, + "startLine": 390, "startColumn": 3, - "endLine": 3, - "endColumn": 18, + "endLine": 390, + "endColumn": 57, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Classifications0C921F6C' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", + "message": "Resource 'FrontendServiceBC94BA93' of type 'AWS::ECS::Service' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Classifications0C921F6C", + "logicalId": "FrontendServiceBC94BA93", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::ECS::Service" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 127, + "startLine": 400, "startColumn": 4, - "endLine": 127, + "endLine": 400, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -1471,19 +1413,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'RekFunctionServiceRole3947AEF4' of type 'AWS::IAM::Role' supports Tags but none are configured", + "message": "Resource 'BackendService7A4224EE' of type 'AWS::ECS::Service' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "RekFunctionServiceRole3947AEF4", + "logicalId": "BackendService7A4224EE", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::ECS::Service" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 153, + "startLine": 472, "startColumn": 4, - "endLine": 153, + "endLine": 472, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -1491,19 +1433,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'RekFunction9837D13D' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "message": "Resource 'PublicLBSG963B1ACE' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "RekFunction9837D13D", + "logicalId": "PublicLBSG963B1ACE", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::EC2::SecurityGroup" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 286, + "startLine": 532, "startColumn": 4, - "endLine": 286, + "endLine": 532, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -1511,19 +1453,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleB6FB88EC' of type 'AWS::IAM::Role' supports Tags but none are configured", + "message": "Resource 'TargetGroup3D7CD9B8' of type 'AWS::ElasticLoadBalancingV2::TargetGroup' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleB6FB88EC", + "logicalId": "TargetGroup3D7CD9B8", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::ElasticLoadBalancingV2::TargetGroup" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 350, + "startLine": 560, "startColumn": 4, - "endLine": 350, + "endLine": 560, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -1531,19 +1473,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'BucketNotificationsHandler050a0587b7544547bf325f094a3db8347ECC3691' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "message": "Resource 'FrontendLB2FA80AC2' of type 'AWS::ElasticLoadBalancingV2::LoadBalancer' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "BucketNotificationsHandler050a0587b7544547bf325f094a3db8347ECC3691", + "logicalId": "FrontendLB2FA80AC2", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::ElasticLoadBalancingV2::LoadBalancer" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 413, + "startLine": 591, "startColumn": 4, - "endLine": 413, + "endLine": 591, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -1551,19 +1493,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aServiceRole9741ECFB' of type 'AWS::IAM::Role' supports Tags but none are configured", + "message": "Resource 'FrontendLBListener230479D8' of type 'AWS::ElasticLoadBalancingV2::Listener' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aServiceRole9741ECFB", + "logicalId": "FrontendLBListener230479D8", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::ElasticLoadBalancingV2::Listener" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 438, + "startLine": 627, "startColumn": 4, - "endLine": 438, + "endLine": 627, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -1571,35 +1513,35 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aFD4BFC8A' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "message": "Resource 'ListenerRule73F9AC5E' of type 'AWS::ElasticLoadBalancingV2::ListenerRule' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aFD4BFC8A", + "logicalId": "ListenerRule73F9AC5E", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::ElasticLoadBalancingV2::ListenerRule" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 499, + "startLine": 648, "startColumn": 4, - "endLine": 499, + "endLine": 648, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "cdk/resource-overrides--resource-overrides.template.json": { - "filePath": "cdk/resource-overrides--resource-overrides.template.json", + "cdk/py-emr--emr-cluster.template.json": { + "filePath": "cdk/py-emr--emr-cluster.template.json", "status": "OK", "metadata": { - "resourcesScanned": 21, + "resourcesScanned": 16, "counts": { - "fatal": 2, - "errors": 2, - "warnings": 4, - "informational": 31, + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 33, "debug": 0 }, "suppressed": 0, @@ -1608,206 +1550,56 @@ }, "diagnostics": [ { - "ruleId": "F3002", - "severity": "FATAL", - "message": "Additional properties are not allowed ('Foo' was unexpected)", - "source": "SCHEMA", + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "ASGLaunchConfigC00AF12B", + "logicalId": "emrcluster", "entityType": "Resource", - "resourceType": "AWS::AutoScaling::LaunchConfiguration" + "resourceType": "AWS::EMR::Cluster" }, - "propertyPath": "Properties.Foo", - "category": "Schema", - "startLine": 418, - "startColumn": 5, - "endLine": 418, - "endColumn": 9, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", - "ruleDescription": "Additional properties are not allowed", - "phase": "SCHEMA", - "context": { - "property": "Foo", - "extra": { - "allowed_properties": [ - "AssociatePublicIpAddress", - "BlockDeviceMappings", - "ClassicLinkVPCId", - "ClassicLinkVPCSecurityGroups", - "EbsOptimized", - "IamInstanceProfile", - "ImageId", - "InstanceId", - "InstanceMonitoring", - "InstanceType", - "KernelId", - "KeyName", - "LaunchConfigurationName", - "MetadataOptions", - "PlacementTenancy", - "RamDiskId", - "SecurityGroups", - "SpotPrice", - "UserData" - ] - } - } - }, - { - "ruleId": "F3006", - "severity": "FATAL", - "message": "Unknown resource type 'AWS::S3::Bucketeer'", - "source": "SCHEMA", - "entity": { - "logicalId": "MyBucketF68F3FF0", - "entityType": "Resource", - "resourceType": "AWS::S3::Bucketeer" - }, - "category": "Schema", - "startLine": 11, - "startColumn": 3, - "endLine": 11, - "endColumn": 20, - "ruleDescription": "AWS resource type must be recognized and available in the configured region", - "phase": "SCHEMA", - "context": { - "extra": { - "resource_type": "AWS::S3::Bucketeer" - } - } - }, - { - "ruleId": "E3001", - "severity": "ERROR", - "message": "Resource 'MyBucketF68F3FF0' has invalid property 'Transform'. Valid resource attributes: Type, Properties, DependsOn, Condition, Metadata, DeletionPolicy, UpdateReplacePolicy, UpdatePolicy, CreationPolicy, Fn::Transform, Version", - "source": "CFN_LINT", - "entity": { - "logicalId": "MyBucketF68F3FF0", - "entityType": "Resource", - "resourceType": "AWS::S3::Bucketeer" - }, - "category": "Resource", - "startLine": 78, - "startColumn": 4, - "endLine": 78, - "endColumn": 14, - "ruleDescription": "Basic CloudFormation Resource Check", - "phase": "PARSE" - }, - { - "ruleId": "E3016", - "severity": "ERROR", - "message": "UpdatePolicy is not supported on resource type 'AWS::S3::Bucketeer'", - "source": "CFN_LINT", - "entity": { - "logicalId": "MyBucketF68F3FF0", - "entityType": "Resource", - "resourceType": "AWS::S3::Bucketeer" - }, - "propertyPath": "UpdatePolicy", - "suggestedFix": "Remove UpdatePolicy or change resource type to one of: AWS::AppStream::Fleet, AWS::AutoScaling::AutoScalingGroup, AWS::ElastiCache::ReplicationGroup, AWS::Elasticsearch::Domain, AWS::Lambda::Alias, AWS::OpenSearchService::Domain", - "category": "Resource", - "startLine": 71, - "startColumn": 4, - "endLine": 71, - "endColumn": 17, - "ruleDescription": "Check UpdatePolicy values for Resources", - "phase": "LINT" - }, - { - "ruleId": "W3005", - "severity": "WARN", - "message": "'Other34654A52' dependency already enforced by a 'GetAtt' at 'Properties.AnalyticsConfigurations.0.StorageClassAnalysis.DataExport.Destination.BucketArn'", - "source": "CFN_LINT", - "entity": { - "logicalId": "MyBucketF68F3FF0", - "entityType": "Resource", - "resourceType": "AWS::S3::Bucketeer" - }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", - "category": "Best Practice", - "startLine": 68, - "startColumn": 4, - "endLine": 68, - "endColumn": 14, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", - "phase": "LINT" - }, - { - "ruleId": "W3005", - "severity": "WARN", - "message": "'Other34654A52' dependency already enforced by a 'GetAtt' at 'Properties.Token'", - "source": "CFN_LINT", - "entity": { - "logicalId": "MyBucketF68F3FF0", - "entityType": "Resource", - "resourceType": "AWS::S3::Bucketeer" - }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", "category": "Best Practice", - "startLine": 68, - "startColumn": 4, - "endLine": 68, + "startLine": 314, + "startColumn": 3, + "endLine": 314, "endColumn": 14, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "W3005", - "severity": "WARN", - "message": "'Other34654A52' dependency already enforced by a 'Ref' at 'Properties.LoggingConfiguration.DestinationBucketName'", + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "MyBucketF68F3FF0", + "logicalId": "emrcluster", "entityType": "Resource", - "resourceType": "AWS::S3::Bucketeer" + "resourceType": "AWS::EMR::Cluster" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", "category": "Best Practice", - "startLine": 68, - "startColumn": 4, - "endLine": 68, + "startLine": 314, + "startColumn": 3, + "endLine": 314, "endColumn": 14, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, - { - "ruleId": "W3697", - "severity": "WARN", - "message": "Resource type 'AWS::AutoScaling::LaunchConfiguration' is from a service in maintenance mode since 2024-10-01. Consider migrating to an alternative", - "source": "CFN_LINT", - "entity": { - "logicalId": "ASGLaunchConfigC00AF12B", - "entityType": "Resource", - "resourceType": "AWS::AutoScaling::LaunchConfiguration" - }, - "category": "Deprecation", - "startLine": 397, - "startColumn": 3, - "endLine": 397, - "endColumn": 27, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", - "ruleDescription": "Resource type is from a service in maintenance mode", - "phase": "SCHEMA" - }, { "ruleId": "I9001", "severity": "INFO", "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "VPCB9E5F0B4", + "logicalId": "vpcA2121C38", "entityType": "Resource", "resourceType": "AWS::EC2::VPC" }, "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 83, + "startLine": 6, "startColumn": 5, - "endLine": 83, + "endLine": 6, "endColumn": 15, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", @@ -1821,15 +1613,15 @@ "message": "Property 'InstanceTenancy' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "VPCB9E5F0B4", + "logicalId": "vpcA2121C38", "entityType": "Resource", "resourceType": "AWS::EC2::VPC" }, "propertyPath": "Properties.InstanceTenancy", "category": "Best Practice", - "startLine": 86, + "startLine": 9, "startColumn": 5, - "endLine": 86, + "endLine": 9, "endColumn": 21, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", @@ -1843,15 +1635,15 @@ "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "VPCPublicSubnet1SubnetB4246D30", + "logicalId": "vpcpublicSubnet1SubnetA635257E", "entityType": "Resource", "resourceType": "AWS::EC2::Subnet" }, "propertyPath": "Properties.AvailabilityZone", "category": "Best Practice", - "startLine": 101, + "startLine": 24, "startColumn": 5, - "endLine": 101, + "endLine": 24, "endColumn": 22, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", @@ -1865,15 +1657,15 @@ "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "VPCPublicSubnet1SubnetB4246D30", + "logicalId": "vpcpublicSubnet1SubnetA635257E", "entityType": "Resource", "resourceType": "AWS::EC2::Subnet" }, "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 109, + "startLine": 32, "startColumn": 5, - "endLine": 109, + "endLine": 32, "endColumn": 15, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", @@ -1887,21 +1679,21 @@ "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "VPCPublicSubnet1SubnetB4246D30", + "logicalId": "vpcpublicSubnet1SubnetA635257E", "entityType": "Resource", "resourceType": "AWS::EC2::Subnet" }, "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 125, + "startLine": 48, "startColumn": 5, - "endLine": 125, + "endLine": 48, "endColumn": 11, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "Ref to 'VPCB9E5F0B4'" + "resolutionSource": "Ref to 'vpcA2121C38'" } }, { @@ -1910,22 +1702,22 @@ "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "VPCPublicSubnet1RouteTableFEE4B781", + "logicalId": "vpcpublicSubnet1RouteTableA38152FE", "entityType": "Resource", "resourceType": "AWS::EC2::RouteTable" }, "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 142, + "startLine": 65, "startColumn": 5, - "endLine": 142, + "endLine": 65, "endColumn": 11, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "Ref to 'VPCB9E5F0B4'" + "resolutionSource": "Ref to 'vpcA2121C38'" } }, { @@ -1934,22 +1726,22 @@ "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "VPCPublicSubnet1RouteTableAssociation0B0896DC", + "logicalId": "vpcpublicSubnet1RouteTableAssociationB46101B8", "entityType": "Resource", "resourceType": "AWS::EC2::SubnetRouteTableAssociation" }, "propertyPath": "Properties.RouteTableId", "category": "Best Practice", - "startLine": 153, + "startLine": 76, "startColumn": 5, - "endLine": 153, + "endLine": 76, "endColumn": 18, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "Ref to 'VPCPublicSubnet1RouteTableFEE4B781'", + "resolutionSource": "Ref to 'vpcpublicSubnet1RouteTableA38152FE'", "extra": { "replacement_strategy": "delete_then_create" } @@ -1961,22 +1753,22 @@ "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "VPCPublicSubnet1RouteTableAssociation0B0896DC", + "logicalId": "vpcpublicSubnet1RouteTableAssociationB46101B8", "entityType": "Resource", "resourceType": "AWS::EC2::SubnetRouteTableAssociation" }, "propertyPath": "Properties.SubnetId", "category": "Best Practice", - "startLine": 156, + "startLine": 79, "startColumn": 5, - "endLine": 156, + "endLine": 79, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "Ref to 'VPCPublicSubnet1SubnetB4246D30'", + "resolutionSource": "Ref to 'vpcpublicSubnet1SubnetA635257E'", "extra": { "replacement_strategy": "delete_then_create" } @@ -1988,15 +1780,15 @@ "message": "Property 'DestinationCidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "VPCPublicSubnet1DefaultRoute91CEF279", + "logicalId": "vpcpublicSubnet1DefaultRouteF0973989", "entityType": "Resource", "resourceType": "AWS::EC2::Route" }, "propertyPath": "Properties.DestinationCidrBlock", "category": "Best Practice", - "startLine": 167, + "startLine": 90, "startColumn": 5, - "endLine": 167, + "endLine": 90, "endColumn": 26, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -2011,159 +1803,113 @@ "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "VPCPublicSubnet1DefaultRoute91CEF279", + "logicalId": "vpcpublicSubnet1DefaultRouteF0973989", "entityType": "Resource", "resourceType": "AWS::EC2::Route" }, "propertyPath": "Properties.RouteTableId", "category": "Best Practice", - "startLine": 171, + "startLine": 94, "startColumn": 5, - "endLine": 171, + "endLine": 94, "endColumn": 18, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "Ref to 'VPCPublicSubnet1RouteTableFEE4B781'" + "resolutionSource": "Ref to 'vpcpublicSubnet1RouteTableA38152FE'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'AllocationId' is create-only; updating it will cause resource replacement", + "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "VPCPublicSubnet1NATGatewayE0556630", + "logicalId": "vpcpublicSubnet2Subnet027D165B", "entityType": "Resource", - "resourceType": "AWS::EC2::NatGateway" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.AllocationId", + "propertyPath": "Properties.AvailabilityZone", "category": "Best Practice", - "startLine": 200, + "startLine": 108, "startColumn": 5, - "endLine": 200, - "endColumn": 18, + "endLine": 108, + "endColumn": 22, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt VPCPublicSubnet1EIP6AD938E8.AllocationId" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "VPCPublicSubnet1NATGatewayE0556630", + "logicalId": "vpcpublicSubnet2Subnet027D165B", "entityType": "Resource", - "resourceType": "AWS::EC2::NatGateway" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.SubnetId", + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 206, + "startLine": 116, "startColumn": 5, - "endLine": 206, - "endColumn": 14, + "endLine": 116, + "endColumn": 15, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'VPCPublicSubnet1SubnetB4246D30'" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "VPCPrivateSubnet1Subnet8BCA10E0", + "logicalId": "vpcpublicSubnet2Subnet027D165B", "entityType": "Resource", "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.AvailabilityZone", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 227, + "startLine": 132, "startColumn": 5, - "endLine": 227, - "endColumn": 22, + "endLine": 132, + "endColumn": 11, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'vpcA2121C38'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "VPCPrivateSubnet1Subnet8BCA10E0", + "logicalId": "vpcpublicSubnet2RouteTableA6135437", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.CidrBlock", - "category": "Best Practice", - "startLine": 235, - "startColumn": 5, - "endLine": 235, - "endColumn": 15, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "VPCPrivateSubnet1Subnet8BCA10E0", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.VpcId", - "category": "Best Practice", - "startLine": 251, - "startColumn": 5, - "endLine": 251, - "endColumn": 11, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'VPCB9E5F0B4'" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "VPCPrivateSubnet1RouteTableBE8A6027", - "entityType": "Resource", - "resourceType": "AWS::EC2::RouteTable" + "resourceType": "AWS::EC2::RouteTable" }, "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 268, + "startLine": 149, "startColumn": 5, - "endLine": 268, + "endLine": 149, "endColumn": 11, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "Ref to 'VPCB9E5F0B4'" + "resolutionSource": "Ref to 'vpcA2121C38'" } }, { @@ -2172,22 +1918,22 @@ "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "VPCPrivateSubnet1RouteTableAssociation347902D1", + "logicalId": "vpcpublicSubnet2RouteTableAssociation73F6478A", "entityType": "Resource", "resourceType": "AWS::EC2::SubnetRouteTableAssociation" }, "propertyPath": "Properties.RouteTableId", "category": "Best Practice", - "startLine": 279, + "startLine": 160, "startColumn": 5, - "endLine": 279, + "endLine": 160, "endColumn": 18, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "Ref to 'VPCPrivateSubnet1RouteTableBE8A6027'", + "resolutionSource": "Ref to 'vpcpublicSubnet2RouteTableA6135437'", "extra": { "replacement_strategy": "delete_then_create" } @@ -2199,22 +1945,22 @@ "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "VPCPrivateSubnet1RouteTableAssociation347902D1", + "logicalId": "vpcpublicSubnet2RouteTableAssociation73F6478A", "entityType": "Resource", "resourceType": "AWS::EC2::SubnetRouteTableAssociation" }, "propertyPath": "Properties.SubnetId", "category": "Best Practice", - "startLine": 282, + "startLine": 163, "startColumn": 5, - "endLine": 282, + "endLine": 163, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "Ref to 'VPCPrivateSubnet1Subnet8BCA10E0'", + "resolutionSource": "Ref to 'vpcpublicSubnet2Subnet027D165B'", "extra": { "replacement_strategy": "delete_then_create" } @@ -2226,15 +1972,15 @@ "message": "Property 'DestinationCidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "VPCPrivateSubnet1DefaultRouteAE1D6490", + "logicalId": "vpcpublicSubnet2DefaultRoute13685A07", "entityType": "Resource", "resourceType": "AWS::EC2::Route" }, "propertyPath": "Properties.DestinationCidrBlock", "category": "Best Practice", - "startLine": 293, + "startLine": 174, "startColumn": 5, - "endLine": 293, + "endLine": 174, "endColumn": 26, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -2249,22 +1995,22 @@ "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "VPCPrivateSubnet1DefaultRouteAE1D6490", + "logicalId": "vpcpublicSubnet2DefaultRoute13685A07", "entityType": "Resource", "resourceType": "AWS::EC2::Route" }, "propertyPath": "Properties.RouteTableId", "category": "Best Practice", - "startLine": 297, + "startLine": 178, "startColumn": 5, - "endLine": 297, + "endLine": 178, "endColumn": 18, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "Ref to 'VPCPrivateSubnet1RouteTableBE8A6027'" + "resolutionSource": "Ref to 'vpcpublicSubnet2RouteTableA6135437'" } }, { @@ -2273,22 +2019,22 @@ "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "VPCVPCGW99B986DC", + "logicalId": "vpcVPCGW7984C166", "entityType": "Resource", "resourceType": "AWS::EC2::VPCGatewayAttachment" }, "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 325, + "startLine": 209, "startColumn": 5, - "endLine": 325, + "endLine": 209, "endColumn": 11, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2-vpc-gateway-attachment.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "Ref to 'VPCB9E5F0B4'", + "resolutionSource": "Ref to 'vpcA2121C38'", "extra": { "replacement_strategy": "delete_then_create" } @@ -2297,19 +2043,19 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", + "message": "Property 'InstanceProfileName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ASGInstanceSecurityGroup0525485D", + "logicalId": "emrjobflowprofile", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::IAM::InstanceProfile" }, - "propertyPath": "Properties.GroupDescription", + "propertyPath": "Properties.InstanceProfileName", "category": "Best Practice", - "startLine": 336, + "startLine": 303, "startColumn": 5, - "endLine": 336, - "endColumn": 22, + "endLine": 303, + "endColumn": 25, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -2319,67 +2065,63 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "message": "Property 'Applications' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ASGInstanceSecurityGroup0525485D", + "logicalId": "emrcluster", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::EMR::Cluster" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.Applications", "category": "Best Practice", - "startLine": 350, + "startLine": 317, "startColumn": 5, - "endLine": 350, - "endColumn": 11, + "endLine": 317, + "endColumn": 18, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'VPCB9E5F0B4'" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'IamInstanceProfile' is create-only; updating it will cause resource replacement", + "message": "Property 'Configurations' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ASGLaunchConfigC00AF12B", + "logicalId": "emrcluster", "entityType": "Resource", - "resourceType": "AWS::AutoScaling::LaunchConfiguration" + "resourceType": "AWS::EMR::Cluster" }, - "propertyPath": "Properties.IamInstanceProfile", + "propertyPath": "Properties.Configurations", "category": "Best Practice", - "startLine": 400, + "startLine": 322, "startColumn": 5, - "endLine": 400, - "endColumn": 24, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", + "endLine": 322, + "endColumn": 20, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'ASGInstanceProfile0A2834D7'" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "message": "Property 'JobFlowRole' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ASGLaunchConfigC00AF12B", + "logicalId": "emrcluster", "entityType": "Resource", - "resourceType": "AWS::AutoScaling::LaunchConfiguration" + "resourceType": "AWS::EMR::Cluster" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Properties.JobFlowRole", "category": "Best Practice", - "startLine": 403, + "startLine": 365, "startColumn": 5, - "endLine": 403, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", + "endLine": 365, + "endColumn": 17, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -2389,20 +2131,19 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'InstanceType' is create-only; updating it will cause resource replacement", + "message": "Property 'LogUri' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ASGLaunchConfigC00AF12B", + "logicalId": "emrcluster", "entityType": "Resource", - "resourceType": "AWS::AutoScaling::LaunchConfiguration" + "resourceType": "AWS::EMR::Cluster" }, - "propertyPath": "Properties.InstanceType", + "propertyPath": "Properties.LogUri", "category": "Best Practice", - "startLine": 406, + "startLine": 366, "startColumn": 5, - "endLine": 406, - "endColumn": 18, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", + "endLine": 366, + "endColumn": 12, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -2412,20 +2153,19 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'SecurityGroups' is create-only; updating it will cause resource replacement", + "message": "Property 'Name' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ASGLaunchConfigC00AF12B", + "logicalId": "emrcluster", "entityType": "Resource", - "resourceType": "AWS::AutoScaling::LaunchConfiguration" + "resourceType": "AWS::EMR::Cluster" }, - "propertyPath": "Properties.SecurityGroups", + "propertyPath": "Properties.Name", "category": "Best Practice", - "startLine": 407, + "startLine": 378, "startColumn": 5, - "endLine": 407, - "endColumn": 20, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", + "endLine": 378, + "endColumn": 10, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -2435,20 +2175,19 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'UserData' is create-only; updating it will cause resource replacement", + "message": "Property 'ReleaseLabel' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ASGLaunchConfigC00AF12B", + "logicalId": "emrcluster", "entityType": "Resource", - "resourceType": "AWS::AutoScaling::LaunchConfiguration" + "resourceType": "AWS::EMR::Cluster" }, - "propertyPath": "Properties.UserData", + "propertyPath": "Properties.ReleaseLabel", "category": "Best Practice", - "startLine": 415, + "startLine": 379, "startColumn": 5, - "endLine": 415, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", + "endLine": 379, + "endColumn": 18, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -2458,80 +2197,120 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'LaunchConfigurationName' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'ServiceRole' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ASG46ED3070", + "logicalId": "emrcluster", "entityType": "Resource", - "resourceType": "AWS::AutoScaling::AutoScalingGroup" + "resourceType": "AWS::EMR::Cluster" }, - "propertyPath": "Properties.LaunchConfigurationName", + "propertyPath": "Properties.ServiceRole", "category": "Best Practice", - "startLine": 432, + "startLine": 380, "startColumn": 5, - "endLine": 432, - "endColumn": 29, + "endLine": 380, + "endColumn": 17, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only", - "resolutionSource": "Ref to 'ASGLaunchConfigC00AF12B'" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'emrservicerole3BE5EDAF'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'VPCZoneIdentifier' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'Steps' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ASG46ED3070", + "logicalId": "emrcluster", "entityType": "Resource", - "resourceType": "AWS::AutoScaling::AutoScalingGroup" + "resourceType": "AWS::EMR::Cluster" }, - "propertyPath": "Properties.VPCZoneIdentifier", + "propertyPath": "Properties.Steps", "category": "Best Practice", - "startLine": 444, + "startLine": 383, "startColumn": 5, - "endLine": 444, - "endColumn": 23, + "endLine": 383, + "endColumn": 11, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only" } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Other34654A52' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Resource 'emrservicerole3BE5EDAF' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Other34654A52", + "logicalId": "emrservicerole3BE5EDAF", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::IAM::Role" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 17, + "startLine": 219, + "startColumn": 4, + "endLine": 219, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'emrjobflowrole15D4DAE5' of type 'AWS::IAM::Role' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "emrjobflowrole15D4DAE5", + "entityType": "Resource", + "resourceType": "AWS::IAM::Role" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 268, + "startColumn": 4, + "endLine": 268, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'emrcluster' of type 'AWS::EMR::Cluster' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "emrcluster", + "entityType": "Resource", + "resourceType": "AWS::EMR::Cluster" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 316, + "startColumn": 4, + "endLine": 316, + "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "cdk/route53-resolver-dns-firewall--Route53ResolverDnsFirewallStack.template.json": { - "filePath": "cdk/route53-resolver-dns-firewall--Route53ResolverDnsFirewallStack.template.json", + "cdk/py-iotcore--CdkIotThingStack.template.json": { + "filePath": "cdk/py-iotcore--CdkIotThingStack.template.json", "status": "OK", "metadata": { - "resourcesScanned": 31, + "resourcesScanned": 19, "counts": { "fatal": 0, "errors": 0, - "warnings": 0, - "informational": 55, + "warnings": 5, + "informational": 22, "debug": 0 }, "suppressed": 0, @@ -2540,211 +2319,230 @@ }, "diagnostics": [ { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W2531", + "severity": "WARN", + "message": "Runtime 'nodejs18.x' was deprecated on '2025-09-01'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'nodejs24.x'", + "source": "CFN_LINT", "entity": { - "logicalId": "Vpc8378EB38", + "logicalId": "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aFD4BFC8A", "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.CidrBlock", - "category": "Best Practice", - "startLine": 6, + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 189, "startColumn": 5, - "endLine": 6, - "endColumn": 15, - "ruleDescription": "Create-only property updated triggers resource replacement", + "endLine": 189, + "endColumn": 13, + "ruleDescription": "Check if EOL Lambda Function Runtimes are used", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "actualValue": "nodejs18.x", + "lifecycle": "deprecated" } }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'InstanceTenancy' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W2531", + "severity": "WARN", + "message": "Runtime 'nodejs18.x' was deprecated on '2025-09-01'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'nodejs24.x'", + "source": "CFN_LINT", "entity": { - "logicalId": "Vpc8378EB38", + "logicalId": "IoTCertProviderframeworkonEvent8FF1476F", "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.InstanceTenancy", - "category": "Best Practice", - "startLine": 9, + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 321, "startColumn": 5, - "endLine": 9, - "endColumn": 21, - "ruleDescription": "Create-only property updated triggers resource replacement", + "endLine": 321, + "endColumn": 13, + "ruleDescription": "Check if EOL Lambda Function Runtimes are used", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "actualValue": "nodejs18.x", + "lifecycle": "deprecated" } }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W3005", + "severity": "WARN", + "message": "'CdkThing001LambdaRoleD7EE5CD3' dependency already enforced by a 'GetAtt' at 'Properties.Role'", + "source": "CFN_LINT", "entity": { - "logicalId": "VpcPublicSubnet1Subnet5C2D37C4", + "logicalId": "CertHandler220363A9", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.AvailabilityZone", + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", "category": "Best Practice", - "startLine": 24, - "startColumn": 5, - "endLine": 24, - "endColumn": 22, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 87, + "startColumn": 4, + "endLine": 87, + "endColumn": 14, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "W3005", + "severity": "WARN", + "message": "'LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aServiceRole9741ECFB' dependency already enforced by a 'GetAtt' at 'Properties.Role'", + "source": "CFN_LINT", + "entity": { + "logicalId": "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aFD4BFC8A", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 204, + "startColumn": 4, + "endLine": 204, + "endColumn": 14, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" + }, + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'IoTCertProviderframeworkonEventServiceRole80DDBEA7' dependency already enforced by a 'GetAtt' at 'Properties.Role'", + "source": "CFN_LINT", + "entity": { + "logicalId": "IoTCertProviderframeworkonEvent8FF1476F", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 324, + "startColumn": 4, + "endLine": 324, + "endColumn": 14, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" + }, + { + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "VpcPublicSubnet1Subnet5C2D37C4", + "logicalId": "CfnLogGroup", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::Logs::LogGroup" }, - "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 32, - "startColumn": 5, - "endLine": 32, + "startLine": 516, + "startColumn": 3, + "endLine": 516, "endColumn": 15, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "VpcPublicSubnet1Subnet5C2D37C4", + "logicalId": "CfnLogGroup", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::Logs::LogGroup" }, - "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 48, - "startColumn": 5, - "endLine": 48, - "endColumn": 11, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'Vpc8378EB38'" - } + "startLine": 516, + "startColumn": 3, + "endLine": 516, + "endColumn": 15, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "message": "Property 'ThingName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "VpcPublicSubnet1RouteTable6C95E38E", + "logicalId": "MyCdkThing", "entityType": "Resource", - "resourceType": "AWS::EC2::RouteTable" + "resourceType": "AWS::IoT::Thing" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.ThingName", "category": "Best Practice", - "startLine": 65, + "startLine": 6, "startColumn": 5, - "endLine": 65, - "endColumn": 11, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", + "endLine": 6, + "endColumn": 15, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'Vpc8378EB38'" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "VpcPublicSubnet1RouteTableAssociation97140677", + "logicalId": "CertHandler220363A9", "entityType": "Resource", - "resourceType": "AWS::EC2::SubnetRouteTableAssociation" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.RouteTableId", + "propertyPath": "Properties.FunctionName", "category": "Best Practice", "startLine": 76, "startColumn": 5, "endLine": 76, "endColumn": 18, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'VpcPublicSubnet1RouteTable6C95E38E'", - "extra": { - "replacement_strategy": "delete_then_create" - } + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", + "message": "Property 'ServiceToken' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "VpcPublicSubnet1RouteTableAssociation97140677", + "logicalId": "IoTCertCustomResource", "entityType": "Resource", - "resourceType": "AWS::EC2::SubnetRouteTableAssociation" + "resourceType": "AWS::CloudFormation::CustomResource" }, - "propertyPath": "Properties.SubnetId", + "propertyPath": "Properties.ServiceToken", "category": "Best Practice", - "startLine": 79, + "startLine": 338, "startColumn": 5, - "endLine": 79, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 338, + "endColumn": 18, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "Ref to 'VpcPublicSubnet1Subnet5C2D37C4'", - "extra": { - "replacement_strategy": "delete_then_create" - } + "resolutionSource": "GetAtt IoTCertProviderframeworkonEvent8FF1476F.Arn" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'DestinationCidrBlock' is create-only; updating it will cause resource replacement", + "message": "Property 'PolicyName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "VpcPublicSubnet1DefaultRoute3DA9E72A", + "logicalId": "CfnPolicy", "entityType": "Resource", - "resourceType": "AWS::EC2::Route" + "resourceType": "AWS::IoT::Policy" }, - "propertyPath": "Properties.DestinationCidrBlock", + "propertyPath": "Properties.PolicyName", "category": "Best Practice", - "startLine": 90, + "startLine": 407, "startColumn": 5, - "endLine": 90, - "endColumn": 26, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", + "endLine": 407, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -2754,89 +2552,89 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", + "message": "Property 'PolicyName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "VpcPublicSubnet1DefaultRoute3DA9E72A", + "logicalId": "CdkThing001PolicyPrincipalAttachment", "entityType": "Resource", - "resourceType": "AWS::EC2::Route" + "resourceType": "AWS::IoT::PolicyPrincipalAttachment" }, - "propertyPath": "Properties.RouteTableId", + "propertyPath": "Properties.PolicyName", "category": "Best Practice", - "startLine": 94, + "startLine": 416, "startColumn": 5, - "endLine": 94, - "endColumn": 18, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", + "endLine": 416, + "endColumn": 16, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'VpcPublicSubnet1RouteTable6C95E38E'" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'AllocationId' is create-only; updating it will cause resource replacement", + "message": "Property 'Principal' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "VpcPublicSubnet1NATGateway4D7517AA", + "logicalId": "CdkThing001PolicyPrincipalAttachment", "entityType": "Resource", - "resourceType": "AWS::EC2::NatGateway" + "resourceType": "AWS::IoT::PolicyPrincipalAttachment" }, - "propertyPath": "Properties.AllocationId", + "propertyPath": "Properties.Principal", "category": "Best Practice", - "startLine": 123, + "startLine": 417, "startColumn": 5, - "endLine": 123, - "endColumn": 18, + "endLine": 417, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "GetAtt VpcPublicSubnet1EIPD7E02669.AllocationId" + "resolutionSource": "dynamic (Join:arn:aws:iot:us-east-1:123456789012:cert/{ref:IoTCertCustomResource})" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", + "message": "Property 'Principal' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "VpcPublicSubnet1NATGateway4D7517AA", + "logicalId": "CdkThing001ThingPrincipalAttachment", "entityType": "Resource", - "resourceType": "AWS::EC2::NatGateway" + "resourceType": "AWS::IoT::ThingPrincipalAttachment" }, - "propertyPath": "Properties.SubnetId", + "propertyPath": "Properties.Principal", "category": "Best Practice", - "startLine": 129, + "startLine": 447, "startColumn": 5, - "endLine": 129, - "endColumn": 14, + "endLine": 447, + "endColumn": 15, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "Ref to 'VpcPublicSubnet1Subnet5C2D37C4'" + "resolutionSource": "dynamic (Join:arn:aws:iot:us-east-1:123456789012:cert/{ref:IoTCertCustomResource})" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", + "message": "Property 'ThingName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "VpcPublicSubnet2Subnet691E08A3", + "logicalId": "CdkThing001ThingPrincipalAttachment", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::IoT::ThingPrincipalAttachment" }, - "propertyPath": "Properties.AvailabilityZone", + "propertyPath": "Properties.ThingName", "category": "Best Practice", - "startLine": 150, + "startLine": 469, "startColumn": 5, - "endLine": 150, - "endColumn": 22, + "endLine": 469, + "endColumn": 15, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -2846,19 +2644,20 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Property 'RoleName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "VpcPublicSubnet2Subnet691E08A3", + "logicalId": "CfnRole", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Properties.RoleName", "category": "Best Practice", - "startLine": 158, + "startLine": 510, "startColumn": 5, - "endLine": 158, - "endColumn": 15, + "endLine": 510, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -2868,359 +2667,326 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "message": "Property 'LogGroupName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "VpcPublicSubnet2Subnet691E08A3", + "logicalId": "CfnLogGroup", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::Logs::LogGroup" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.LogGroupName", "category": "Best Practice", - "startLine": 174, + "startLine": 519, "startColumn": 5, - "endLine": 174, - "endColumn": 11, + "endLine": 519, + "endColumn": 18, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-logs.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'Vpc8378EB38'" + "lifecycle": "create-only" } }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "message": "Resource 'CdkThing001LambdaRoleD7EE5CD3' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "VpcPublicSubnet2RouteTable94F7E489", + "logicalId": "CdkThing001LambdaRoleD7EE5CD3", "entityType": "Resource", - "resourceType": "AWS::EC2::RouteTable" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 191, - "startColumn": 5, - "endLine": 191, - "endColumn": 11, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'Vpc8378EB38'" - } + "startLine": 14, + "startColumn": 4, + "endLine": 14, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", + "message": "Resource 'CertHandler220363A9' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "VpcPublicSubnet2RouteTableAssociationDD5762D8", + "logicalId": "CertHandler220363A9", "entityType": "Resource", - "resourceType": "AWS::EC2::SubnetRouteTableAssociation" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.RouteTableId", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 202, - "startColumn": 5, - "endLine": 202, - "endColumn": 18, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'VpcPublicSubnet2RouteTable94F7E489'", - "extra": { - "replacement_strategy": "delete_then_create" - } - } + "startLine": 69, + "startColumn": 4, + "endLine": 69, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", + "message": "Resource 'LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aServiceRole9741ECFB' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "VpcPublicSubnet2RouteTableAssociationDD5762D8", + "logicalId": "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aServiceRole9741ECFB", "entityType": "Resource", - "resourceType": "AWS::EC2::SubnetRouteTableAssociation" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.SubnetId", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 205, - "startColumn": 5, - "endLine": 205, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'VpcPublicSubnet2Subnet691E08A3'", - "extra": { - "replacement_strategy": "delete_then_create" - } - } + "startLine": 126, + "startColumn": 4, + "endLine": 126, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'DestinationCidrBlock' is create-only; updating it will cause resource replacement", + "message": "Resource 'LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aFD4BFC8A' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "VpcPublicSubnet2DefaultRoute97F91067", + "logicalId": "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aFD4BFC8A", "entityType": "Resource", - "resourceType": "AWS::EC2::Route" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.DestinationCidrBlock", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 216, - "startColumn": 5, - "endLine": 216, - "endColumn": 26, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 187, + "startColumn": 4, + "endLine": 187, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", + "message": "Resource 'IoTCertProviderframeworkonEventServiceRole80DDBEA7' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "VpcPublicSubnet2DefaultRoute97F91067", + "logicalId": "IoTCertProviderframeworkonEventServiceRole80DDBEA7", "entityType": "Resource", - "resourceType": "AWS::EC2::Route" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.RouteTableId", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 220, - "startColumn": 5, - "endLine": 220, - "endColumn": 18, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'VpcPublicSubnet2RouteTable94F7E489'" - } + "startLine": 217, + "startColumn": 4, + "endLine": 217, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'AllocationId' is create-only; updating it will cause resource replacement", + "message": "Resource 'IoTCertProviderframeworkonEvent8FF1476F' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "VpcPublicSubnet2NATGateway9182C01D", + "logicalId": "IoTCertProviderframeworkonEvent8FF1476F", "entityType": "Resource", - "resourceType": "AWS::EC2::NatGateway" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.AllocationId", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 249, - "startColumn": 5, - "endLine": 249, - "endColumn": 18, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt VpcPublicSubnet2EIP3C605A87.AllocationId" - } + "startLine": 296, + "startColumn": 4, + "endLine": 296, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", + "message": "Resource 'CfnPolicy' of type 'AWS::IoT::Policy' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "VpcPublicSubnet2NATGateway9182C01D", + "logicalId": "CfnPolicy", "entityType": "Resource", - "resourceType": "AWS::EC2::NatGateway" + "resourceType": "AWS::IoT::Policy" }, - "propertyPath": "Properties.SubnetId", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 255, - "startColumn": 5, - "endLine": 255, - "endColumn": 14, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'VpcPublicSubnet2Subnet691E08A3'" - } + "startLine": 353, + "startColumn": 4, + "endLine": 353, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", + "message": "Resource 'CfnRole' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "VpcPrivateSubnet1Subnet536B997A", + "logicalId": "CfnRole", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.AvailabilityZone", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 276, - "startColumn": 5, - "endLine": 276, - "endColumn": 22, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 477, + "startColumn": 4, + "endLine": 477, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Resource 'CfnLogGroup' of type 'AWS::Logs::LogGroup' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "VpcPrivateSubnet1Subnet536B997A", + "logicalId": "CfnLogGroup", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::Logs::LogGroup" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 284, - "startColumn": 5, - "endLine": 284, + "startLine": 518, + "startColumn": 4, + "endLine": 518, "endColumn": 15, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "message": "Resource 'CdkIoTCoreRule' of type 'AWS::IoT::TopicRule' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "VpcPrivateSubnet1Subnet536B997A", + "logicalId": "CdkIoTCoreRule", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::IoT::TopicRule" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 300, - "startColumn": 5, - "endLine": 300, - "endColumn": 11, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'Vpc8378EB38'" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "startLine": 528, + "startColumn": 4, + "endLine": 528, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "cdk/py-lambda-cron--LambdaCronExample.template.json": { + "filePath": "cdk/py-lambda-cron--LambdaCronExample.template.json", + "status": "OK", + "metadata": { + "resourcesScanned": 5, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 1, + "informational": 7, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'SingletonServiceRoleDDD815CD' dependency already enforced by a 'GetAtt' at 'Properties.Role'", + "source": "CFN_LINT", "entity": { - "logicalId": "VpcPrivateSubnet1RouteTableB2C5B500", + "logicalId": "Singleton8C7B99F3", "entityType": "Resource", - "resourceType": "AWS::EC2::RouteTable" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", "category": "Best Practice", - "startLine": 317, - "startColumn": 5, - "endLine": 317, - "endColumn": 11, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'Vpc8378EB38'" - } + "startLine": 53, + "startColumn": 4, + "endLine": 53, + "endColumn": 14, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", + "message": "Property 'Action' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "VpcPrivateSubnet1RouteTableAssociation70C59FA6", + "logicalId": "RuleAllowEventRuleLambdaCronExampleSingleton4F1DF641E5122DD7", "entityType": "Resource", - "resourceType": "AWS::EC2::SubnetRouteTableAssociation" + "resourceType": "AWS::Lambda::Permission" }, - "propertyPath": "Properties.RouteTableId", + "propertyPath": "Properties.Action", "category": "Best Practice", - "startLine": 328, + "startLine": 84, "startColumn": 5, - "endLine": 328, - "endColumn": 18, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 84, + "endColumn": 12, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'VpcPrivateSubnet1RouteTableB2C5B500'", - "extra": { - "replacement_strategy": "delete_then_create" - } + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "VpcPrivateSubnet1RouteTableAssociation70C59FA6", + "logicalId": "RuleAllowEventRuleLambdaCronExampleSingleton4F1DF641E5122DD7", "entityType": "Resource", - "resourceType": "AWS::EC2::SubnetRouteTableAssociation" + "resourceType": "AWS::Lambda::Permission" }, - "propertyPath": "Properties.SubnetId", + "propertyPath": "Properties.FunctionName", "category": "Best Practice", - "startLine": 331, + "startLine": 85, "startColumn": 5, - "endLine": 331, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 85, + "endColumn": 18, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "Ref to 'VpcPrivateSubnet1Subnet536B997A'", - "extra": { - "replacement_strategy": "delete_then_create" - } + "resolutionSource": "GetAtt Singleton8C7B99F3.Arn" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'DestinationCidrBlock' is create-only; updating it will cause resource replacement", + "message": "Property 'Principal' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "VpcPrivateSubnet1DefaultRouteBE02A9ED", + "logicalId": "RuleAllowEventRuleLambdaCronExampleSingleton4F1DF641E5122DD7", "entityType": "Resource", - "resourceType": "AWS::EC2::Route" + "resourceType": "AWS::Lambda::Permission" }, - "propertyPath": "Properties.DestinationCidrBlock", + "propertyPath": "Properties.Principal", "category": "Best Practice", - "startLine": 342, + "startLine": 91, "startColumn": 5, - "endLine": 342, - "endColumn": 26, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", + "endLine": 91, + "endColumn": 15, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -3230,263 +2996,311 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", + "message": "Property 'SourceArn' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "VpcPrivateSubnet1DefaultRouteBE02A9ED", + "logicalId": "RuleAllowEventRuleLambdaCronExampleSingleton4F1DF641E5122DD7", "entityType": "Resource", - "resourceType": "AWS::EC2::Route" + "resourceType": "AWS::Lambda::Permission" }, - "propertyPath": "Properties.RouteTableId", + "propertyPath": "Properties.SourceArn", "category": "Best Practice", - "startLine": 346, + "startLine": 92, "startColumn": 5, - "endLine": 346, - "endColumn": 18, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", + "endLine": 92, + "endColumn": 15, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "Ref to 'VpcPrivateSubnet1RouteTableB2C5B500'" + "resolutionSource": "GetAtt Rule4C995B7F.Arn" } }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", + "message": "Resource 'SingletonServiceRoleDDD815CD' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "VpcPrivateSubnet2Subnet3788AAA1", + "logicalId": "SingletonServiceRoleDDD815CD", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.AvailabilityZone", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 357, - "startColumn": 5, - "endLine": 357, - "endColumn": 22, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 5, + "startColumn": 4, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Resource 'Singleton8C7B99F3' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "VpcPrivateSubnet2Subnet3788AAA1", + "logicalId": "Singleton8C7B99F3", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 365, - "startColumn": 5, - "endLine": 365, + "startLine": 39, + "startColumn": 4, + "endLine": 39, "endColumn": 15, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Rule4C995B7F' of type 'AWS::Events::Rule' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "Rule4C995B7F", + "entityType": "Resource", + "resourceType": "AWS::Events::Rule" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 62, + "startColumn": 4, + "endLine": 62, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "cdk/py-lambda-from-container--LambdaContainerFunctionStack.template.json": { + "filePath": "cdk/py-lambda-from-container--LambdaContainerFunctionStack.template.json", + "status": "OK", + "metadata": { + "resourcesScanned": 3, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 1, + "informational": 4, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'lambdaContainerFunctionServiceRole5E36DB3C' dependency already enforced by a 'GetAtt' at 'Properties.Role'", + "source": "CFN_LINT", + "entity": { + "logicalId": "lambdaContainerFunction5815FD88", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 63, + "startColumn": 4, + "endLine": 63, + "endColumn": 14, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "VpcPrivateSubnet2Subnet3788AAA1", + "logicalId": "lambdaContainerFunction5815FD88", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.FunctionName", "category": "Best Practice", - "startLine": 381, + "startLine": 51, "startColumn": 5, - "endLine": 381, - "endColumn": 11, + "endLine": 51, + "endColumn": 18, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'Vpc8378EB38'" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "message": "Property 'PackageType' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "VpcPrivateSubnet2RouteTableA678073B", + "logicalId": "lambdaContainerFunction5815FD88", "entityType": "Resource", - "resourceType": "AWS::EC2::RouteTable" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.PackageType", "category": "Best Practice", - "startLine": 398, + "startLine": 53, "startColumn": 5, - "endLine": 398, - "endColumn": 11, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", + "endLine": 53, + "endColumn": 17, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'Vpc8378EB38'" + "lifecycle": "create-only" } }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", + "message": "Resource 'lambdaContainerFunctionServiceRole5E36DB3C' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "VpcPrivateSubnet2RouteTableAssociationA89CAD56", + "logicalId": "lambdaContainerFunctionServiceRole5E36DB3C", "entityType": "Resource", - "resourceType": "AWS::EC2::SubnetRouteTableAssociation" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.RouteTableId", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 409, - "startColumn": 5, - "endLine": 409, - "endColumn": 18, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'VpcPrivateSubnet2RouteTableA678073B'", - "extra": { - "replacement_strategy": "delete_then_create" - } - } + "startLine": 5, + "startColumn": 4, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", + "message": "Resource 'lambdaContainerFunction5815FD88' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "VpcPrivateSubnet2RouteTableAssociationA89CAD56", + "logicalId": "lambdaContainerFunction5815FD88", "entityType": "Resource", - "resourceType": "AWS::EC2::SubnetRouteTableAssociation" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.SubnetId", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 412, - "startColumn": 5, - "endLine": 412, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'VpcPrivateSubnet2Subnet3788AAA1'", - "extra": { - "replacement_strategy": "delete_then_create" - } - } + "startLine": 39, + "startColumn": 4, + "endLine": 39, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "cdk/py-lambda-layer--LambdaLayerExample.template.json": { + "filePath": "cdk/py-lambda-layer--LambdaLayerExample.template.json", + "status": "OK", + "metadata": { + "resourcesScanned": 4, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 2, + "informational": 5, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'DestinationCidrBlock' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W2531", + "severity": "WARN", + "message": "Runtime 'python3.8' was deprecated on '2024-10-14'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'python3.14'", + "source": "CFN_LINT", "entity": { - "logicalId": "VpcPrivateSubnet2DefaultRoute060D2087", + "logicalId": "lambdafunction45C982D3", "entityType": "Resource", - "resourceType": "AWS::EC2::Route" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.DestinationCidrBlock", - "category": "Best Practice", - "startLine": 423, + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 83, "startColumn": 5, - "endLine": 423, - "endColumn": 26, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", - "ruleDescription": "Create-only property updated triggers resource replacement", + "endLine": 83, + "endColumn": 13, + "ruleDescription": "Check if EOL Lambda Function Runtimes are used", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "actualValue": "python3.8", + "lifecycle": "deprecated" } }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W3005", + "severity": "WARN", + "message": "'lambdafunctionServiceRole85538ADB' dependency already enforced by a 'GetAtt' at 'Properties.Role'", + "source": "CFN_LINT", "entity": { - "logicalId": "VpcPrivateSubnet2DefaultRoute060D2087", + "logicalId": "lambdafunction45C982D3", "entityType": "Resource", - "resourceType": "AWS::EC2::Route" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.RouteTableId", + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", "category": "Best Practice", - "startLine": 427, - "startColumn": 5, - "endLine": 427, - "endColumn": 18, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'VpcPrivateSubnet2RouteTableA678073B'" - } + "startLine": 85, + "startColumn": 4, + "endLine": 85, + "endColumn": 14, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "message": "Property 'CompatibleRuntimes' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "VpcVPCGWBF912B6E", + "logicalId": "helperlayerC2FA2F58", "entityType": "Resource", - "resourceType": "AWS::EC2::VPCGatewayAttachment" + "resourceType": "AWS::Lambda::LayerVersion" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.CompatibleRuntimes", "category": "Best Practice", - "startLine": 455, + "startLine": 6, "startColumn": 5, - "endLine": 455, - "endColumn": 11, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2-vpc-gateway-attachment.git", + "endLine": 6, + "endColumn": 24, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-lambda.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'Vpc8378EB38'", - "extra": { - "replacement_strategy": "delete_then_create" - } + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'LogGroupName' is create-only; updating it will cause resource replacement", + "message": "Property 'Content' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DNSFirewallLogGroupF0EEB7D4", + "logicalId": "helperlayerC2FA2F58", "entityType": "Resource", - "resourceType": "AWS::Logs::LogGroup" + "resourceType": "AWS::Lambda::LayerVersion" }, - "propertyPath": "Properties.LogGroupName", + "propertyPath": "Properties.Content", "category": "Best Practice", - "startLine": 466, + "startLine": 11, "startColumn": 5, - "endLine": 466, - "endColumn": 18, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-logs.git", + "endLine": 11, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-lambda.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -3496,222 +3310,207 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'DestinationArn' is create-only; updating it will cause resource replacement", + "message": "Property 'Description' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DNSLogsConfig", + "logicalId": "helperlayerC2FA2F58", "entityType": "Resource", - "resourceType": "AWS::Route53Resolver::ResolverQueryLoggingConfig" + "resourceType": "AWS::Lambda::LayerVersion" }, - "propertyPath": "Properties.DestinationArn", + "propertyPath": "Properties.Description", "category": "Best Practice", - "startLine": 478, + "startLine": 17, "startColumn": 5, - "endLine": 478, - "endColumn": 20, + "endLine": 17, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-lambda.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt DNSFirewallLogGroupF0EEB7D4.Arn" + "lifecycle": "create-only" } }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Name' is create-only; updating it will cause resource replacement", + "message": "Resource 'lambdafunctionServiceRole85538ADB' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "DNSLogsConfig", + "logicalId": "lambdafunctionServiceRole85538ADB", "entityType": "Resource", - "resourceType": "AWS::Route53Resolver::ResolverQueryLoggingConfig" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.Name", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 484, - "startColumn": 5, - "endLine": 484, - "endColumn": 10, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 30, + "startColumn": 4, + "endLine": 30, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'ResolverQueryLogConfigId' is create-only; updating it will cause resource replacement", + "message": "Resource 'lambdafunction45C982D3' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "DNSLogAssoc", + "logicalId": "lambdafunction45C982D3", "entityType": "Resource", - "resourceType": "AWS::Route53Resolver::ResolverQueryLoggingConfigAssociation" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.ResolverQueryLogConfigId", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 493, + "startLine": 64, + "startColumn": 4, + "endLine": 64, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "cdk/py-stepfunctions--aws-stepfunctions-integ.template.json": { + "filePath": "cdk/py-stepfunctions--aws-stepfunctions-integ.template.json", + "status": "OK", + "metadata": { + "resourcesScanned": 8, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 5, + "informational": 6, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "W2531", + "severity": "WARN", + "message": "Runtime 'python3.9' was deprecated on '2025-12-15'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'python3.14'", + "source": "CFN_LINT", + "entity": { + "logicalId": "submitLambda3C32AFD4", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 53, "startColumn": 5, - "endLine": 493, - "endColumn": 30, - "ruleDescription": "Create-only property updated triggers resource replacement", + "endLine": 53, + "endColumn": 13, + "ruleDescription": "Check if EOL Lambda Function Runtimes are used", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'DNSLogsConfig'" + "actualValue": "python3.9", + "lifecycle": "deprecated" } }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ResourceId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "DNSLogAssoc", - "entityType": "Resource", - "resourceType": "AWS::Route53Resolver::ResolverQueryLoggingConfigAssociation" - }, - "propertyPath": "Properties.ResourceId", - "category": "Best Practice", - "startLine": 496, - "startColumn": 5, - "endLine": 496, - "endColumn": 16, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'Vpc8378EB38'" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Name' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "AllowedDomainList", - "entityType": "Resource", - "resourceType": "AWS::Route53Resolver::FirewallDomainList" - }, - "propertyPath": "Properties.Name", - "category": "Best Practice", - "startLine": 510, - "startColumn": 5, - "endLine": 510, - "endColumn": 10, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Name' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W2531", + "severity": "WARN", + "message": "Runtime 'python3.9' was deprecated on '2025-12-15'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'python3.14'", + "source": "CFN_LINT", "entity": { - "logicalId": "BlockedDomainList", + "logicalId": "statusLambdaCF47B86D", "entityType": "Resource", - "resourceType": "AWS::Route53Resolver::FirewallDomainList" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.Name", - "category": "Best Practice", - "startLine": 523, + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 115, "startColumn": 5, - "endLine": 523, - "endColumn": 10, - "ruleDescription": "Create-only property updated triggers resource replacement", + "endLine": 115, + "endColumn": 13, + "ruleDescription": "Check if EOL Lambda Function Runtimes are used", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "actualValue": "python3.9", + "lifecycle": "deprecated" } }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Name' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W3005", + "severity": "WARN", + "message": "'submitLambdaServiceRole576DCA8F' dependency already enforced by a 'GetAtt' at 'Properties.Role'", + "source": "CFN_LINT", "entity": { - "logicalId": "DNSRuleGroup", + "logicalId": "submitLambda3C32AFD4", "entityType": "Resource", - "resourceType": "AWS::Route53Resolver::FirewallRuleGroup" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.Name", + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", "category": "Best Practice", - "startLine": 549, - "startColumn": 5, - "endLine": 549, - "endColumn": 10, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 55, + "startColumn": 4, + "endLine": 55, + "endColumn": 14, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'FirewallRuleGroupId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W3005", + "severity": "WARN", + "message": "'statusLambdaServiceRoleD1132168' dependency already enforced by a 'GetAtt' at 'Properties.Role'", + "source": "CFN_LINT", "entity": { - "logicalId": "FirewallRuleGroupAssociation", + "logicalId": "statusLambdaCF47B86D", "entityType": "Resource", - "resourceType": "AWS::Route53Resolver::FirewallRuleGroupAssociation" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.FirewallRuleGroupId", + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", "category": "Best Practice", - "startLine": 558, - "startColumn": 5, - "endLine": 558, - "endColumn": 25, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'DNSRuleGroup'" - } + "startLine": 117, + "startColumn": 4, + "endLine": 117, + "endColumn": 14, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W3005", + "severity": "WARN", + "message": "'StateMachineRoleB840431D' dependency already enforced by a 'GetAtt' at 'Properties.RoleArn'", + "source": "CFN_LINT", "entity": { - "logicalId": "FirewallRuleGroupAssociation", + "logicalId": "StateMachine2E01A3A5", "entityType": "Resource", - "resourceType": "AWS::Route53Resolver::FirewallRuleGroupAssociation" + "resourceType": "AWS::StepFunctions::StateMachine" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", "category": "Best Practice", - "startLine": 563, - "startColumn": 5, - "endLine": 563, - "endColumn": 11, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'Vpc8378EB38'" - } + "startLine": 258, + "startColumn": 4, + "endLine": 258, + "endColumn": 14, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'DNSFirewallLogGroupF0EEB7D4' of type 'AWS::Logs::LogGroup' supports Tags but none are configured", + "message": "Resource 'submitLambdaServiceRole576DCA8F' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "DNSFirewallLogGroupF0EEB7D4", + "logicalId": "submitLambdaServiceRole576DCA8F", "entityType": "Resource", - "resourceType": "AWS::Logs::LogGroup" + "resourceType": "AWS::IAM::Role" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 465, + "startLine": 5, "startColumn": 4, - "endLine": 465, + "endLine": 5, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -3719,19 +3518,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'DNSLogsConfig' of type 'AWS::Route53Resolver::ResolverQueryLoggingConfig' supports Tags but none are configured", + "message": "Resource 'submitLambda3C32AFD4' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "DNSLogsConfig", + "logicalId": "submitLambda3C32AFD4", "entityType": "Resource", - "resourceType": "AWS::Route53Resolver::ResolverQueryLoggingConfig" + "resourceType": "AWS::Lambda::Function" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 477, + "startLine": 39, "startColumn": 4, - "endLine": 477, + "endLine": 39, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -3739,19 +3538,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'AllowedDomainList' of type 'AWS::Route53Resolver::FirewallDomainList' supports Tags but none are configured", + "message": "Resource 'statusLambdaServiceRoleD1132168' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "AllowedDomainList", + "logicalId": "statusLambdaServiceRoleD1132168", "entityType": "Resource", - "resourceType": "AWS::Route53Resolver::FirewallDomainList" + "resourceType": "AWS::IAM::Role" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 506, + "startLine": 67, "startColumn": 4, - "endLine": 506, + "endLine": 67, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -3759,19 +3558,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'BlockedDomainList' of type 'AWS::Route53Resolver::FirewallDomainList' supports Tags but none are configured", + "message": "Resource 'statusLambdaCF47B86D' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "BlockedDomainList", + "logicalId": "statusLambdaCF47B86D", "entityType": "Resource", - "resourceType": "AWS::Route53Resolver::FirewallDomainList" + "resourceType": "AWS::Lambda::Function" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 518, + "startLine": 101, "startColumn": 4, - "endLine": 518, + "endLine": 101, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -3779,19 +3578,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'DNSRuleGroup' of type 'AWS::Route53Resolver::FirewallRuleGroup' supports Tags but none are configured", + "message": "Resource 'StateMachineRoleB840431D' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "DNSRuleGroup", + "logicalId": "StateMachineRoleB840431D", "entityType": "Resource", - "resourceType": "AWS::Route53Resolver::FirewallRuleGroup" + "resourceType": "AWS::IAM::Role" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 531, + "startLine": 129, "startColumn": 4, - "endLine": 531, + "endLine": 129, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -3799,35 +3598,35 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'FirewallRuleGroupAssociation' of type 'AWS::Route53Resolver::FirewallRuleGroupAssociation' supports Tags but none are configured", + "message": "Resource 'StateMachine2E01A3A5' of type 'AWS::StepFunctions::StateMachine' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "FirewallRuleGroupAssociation", + "logicalId": "StateMachine2E01A3A5", "entityType": "Resource", - "resourceType": "AWS::Route53Resolver::FirewallRuleGroupAssociation" + "resourceType": "AWS::StepFunctions::StateMachine" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 557, + "startLine": 220, "startColumn": 4, - "endLine": 557, + "endLine": 220, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "cdk/s3-object-lambda--S3ObjectLambdaStack.template.json": { - "filePath": "cdk/s3-object-lambda--S3ObjectLambdaStack.template.json", + "cdk/py-url-shortener--urlshort-app.template.json": { + "filePath": "cdk/py-url-shortener--urlshort-app.template.json", "status": "OK", "metadata": { - "resourcesScanned": 9, + "resourcesScanned": 20, "counts": { "fatal": 0, - "errors": 0, + "errors": 1, "warnings": 3, - "informational": 12, + "informational": 39, "debug": 0 }, "suppressed": 0, @@ -3836,155 +3635,172 @@ }, "diagnostics": [ { - "ruleId": "W2531", - "severity": "WARN", - "message": "Runtime 'nodejs20.x' was deprecated on '2026-04-30'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'nodejs24.x'", + "ruleId": "E2531", + "severity": "ERROR", + "message": "Runtime 'python3.7' was deprecated on '2023-12-04'. Creation was disabled on '2024-01-09', and updates will be disabled on '2027-03-03'. Please consider updating to 'python3.14'", "source": "CFN_LINT", "entity": { - "logicalId": "retrieveTransformedObjectLambdaD5D6532C", + "logicalId": "UrlShortenerFunctionB5E87AC1", "entityType": "Resource", "resourceType": "AWS::Lambda::Function" }, "propertyPath": "Properties.Runtime", "category": "Deprecation", - "startLine": 155, + "startLine": 141, "startColumn": 5, - "endLine": 155, + "endLine": 141, "endColumn": 13, - "ruleDescription": "Check if EOL Lambda Function Runtimes are used", + "ruleDescription": "Check if Lambda Function Runtimes are blocked for create", "phase": "SCHEMA", "context": { - "actualValue": "nodejs20.x", - "lifecycle": "deprecated" + "actualValue": "python3.7", + "lifecycle": "create-blocked" } }, { "ruleId": "W3005", "severity": "WARN", - "message": "'retrieveTransformedObjectLambdaServiceRole27FF342E' dependency already enforced by a 'GetAtt' at 'Properties.Role'", + "message": "'UrlShortenerFunctionServiceRole2FBF9CDA' dependency already enforced by a 'GetAtt' at 'Properties.Role'", "source": "CFN_LINT", "entity": { - "logicalId": "retrieveTransformedObjectLambdaD5D6532C", + "logicalId": "UrlShortenerFunctionB5E87AC1", "entityType": "Resource", "resourceType": "AWS::Lambda::Function" }, "propertyPath": "DependsOn", "suggestedFix": "Remove the DependsOn entry", "category": "Best Practice", - "startLine": 157, + "startLine": 144, "startColumn": 4, - "endLine": 157, + "endLine": 144, "endColumn": 14, "ruleDescription": "Check obsolete DependsOn configuration for Resources", "phase": "LINT" }, { - "ruleId": "W3045", + "ruleId": "W9002", "severity": "WARN", - "message": "AccessControl property is deprecated. Use bucket policies instead", - "source": "CFN_LINT", + "message": "Property 'RegionalCertificateArn' has a hardcoded ARN - use Ref, GetAtt, or a parameter instead", + "source": "ENGINE", "entity": { - "logicalId": "examplebucketC9DFA43E", + "logicalId": "UrlShortenerApiDomain85D0CE65", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::ApiGateway::DomainName" }, - "propertyPath": "Properties.AccessControl", - "suggestedFix": "Remove AccessControl and use an AWS::S3::BucketPolicy resource", - "category": "Deprecation", - "startLine": 6, + "propertyPath": "Properties.RegionalCertificateArn", + "category": "Best Practice", + "startLine": 499, "startColumn": 5, - "endLine": 6, - "endColumn": 19, - "ruleDescription": "Controlling access to an S3 bucket should be done with bucket policies", - "phase": "LINT", - "context": { - "actualValue": "BucketOwnerFullControl" - } + "endLine": 499, + "endColumn": 28, + "ruleDescription": "Hardcoded ARN property", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Bucket' is create-only; updating it will cause resource replacement", + "ruleId": "W9013", + "severity": "WARN", + "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", "source": "ENGINE", "entity": { - "logicalId": "examplebucketPolicyE09B485E", + "logicalId": "UrlShortenerApiDomain85D0CE65", "entityType": "Resource", - "resourceType": "AWS::S3::BucketPolicy" + "resourceType": "AWS::ApiGateway::DomainName" }, - "propertyPath": "Properties.Bucket", + "category": "Security", + "startLine": 490, + "startColumn": 3, + "endLine": 490, + "endColumn": 33, + "ruleDescription": "Hardcoded account ID in ARN", + "phase": "LINT" + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "TableCD117FA1", + "entityType": "Resource", + "resourceType": "AWS::DynamoDB::Table" + }, + "propertyPath": "Properties.KeySchema", "category": "Best Practice", - "startLine": 32, + "startLine": 12, "startColumn": 5, - "endLine": 32, - "endColumn": 12, + "endLine": 12, + "endColumn": 15, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'examplebucketC9DFA43E'" + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Action' is create-only; updating it will cause resource replacement", + "message": "Property 'RestApiId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "retrieveTransformedObjectLambdainvocationRestrictionD58B0218", + "logicalId": "UrlShortenerApiDeployment97FF782966d8a7a27285a49d048d420aab9f3106", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::ApiGateway::Deployment" }, - "propertyPath": "Properties.Action", + "propertyPath": "Properties.RestApiId", "category": "Best Practice", - "startLine": 171, + "startLine": 223, "startColumn": 5, - "endLine": 171, - "endColumn": 12, + "endLine": 223, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'UrlShortenerApi1FE619BE'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "message": "Property 'RestApiId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "retrieveTransformedObjectLambdainvocationRestrictionD58B0218", + "logicalId": "UrlShortenerApiDeploymentStageprod9A3CCA44", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::ApiGateway::Stage" }, - "propertyPath": "Properties.FunctionName", + "propertyPath": "Properties.RestApiId", "category": "Best Practice", - "startLine": 172, + "startLine": 243, "startColumn": 5, - "endLine": 172, - "endColumn": 18, + "endLine": 243, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "GetAtt retrieveTransformedObjectLambdaD5D6532C.Arn" + "resolutionSource": "Ref to 'UrlShortenerApi1FE619BE'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Principal' is create-only; updating it will cause resource replacement", + "message": "Property 'StageName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "retrieveTransformedObjectLambdainvocationRestrictionD58B0218", + "logicalId": "UrlShortenerApiDeploymentStageprod9A3CCA44", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::ApiGateway::Stage" }, - "propertyPath": "Properties.Principal", + "propertyPath": "Properties.StageName", "category": "Best Practice", - "startLine": 178, + "startLine": 246, "startColumn": 5, - "endLine": 178, + "endLine": 246, "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -3994,89 +3810,90 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'SourceAccount' is create-only; updating it will cause resource replacement", + "message": "Property 'ParentId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "retrieveTransformedObjectLambdainvocationRestrictionD58B0218", + "logicalId": "UrlShortenerApiproxy991A3B5C", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::ApiGateway::Resource" }, - "propertyPath": "Properties.SourceAccount", + "propertyPath": "Properties.ParentId", "category": "Best Practice", - "startLine": 181, + "startLine": 258, "startColumn": 5, - "endLine": 181, - "endColumn": 19, + "endLine": 258, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "GetAtt UrlShortenerApi1FE619BE.RootResourceId" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Bucket' is create-only; updating it will cause resource replacement", + "message": "Property 'PathPart' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "exampleBucketAP", + "logicalId": "UrlShortenerApiproxy991A3B5C", "entityType": "Resource", - "resourceType": "AWS::S3::AccessPoint" + "resourceType": "AWS::ApiGateway::Resource" }, - "propertyPath": "Properties.Bucket", + "propertyPath": "Properties.PathPart", "category": "Best Practice", - "startLine": 192, + "startLine": 264, "startColumn": 5, - "endLine": 192, - "endColumn": 12, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-s3", + "endLine": 264, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'examplebucketC9DFA43E'" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Name' is create-only; updating it will cause resource replacement", + "message": "Property 'RestApiId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "exampleBucketAP", + "logicalId": "UrlShortenerApiproxy991A3B5C", "entityType": "Resource", - "resourceType": "AWS::S3::AccessPoint" + "resourceType": "AWS::ApiGateway::Resource" }, - "propertyPath": "Properties.Name", + "propertyPath": "Properties.RestApiId", "category": "Best Practice", - "startLine": 195, + "startLine": 265, "startColumn": 5, - "endLine": 195, - "endColumn": 10, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-s3", + "endLine": 265, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'UrlShortenerApi1FE619BE'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Name' is create-only; updating it will cause resource replacement", + "message": "Property 'Action' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "s3ObjectLambdaAP", + "logicalId": "UrlShortenerApiproxyANYApiPermissionurlshortappUrlShortenerApiB1BAB0CDANYproxy8ED41C08", "entityType": "Resource", - "resourceType": "AWS::S3ObjectLambda::AccessPoint" + "resourceType": "AWS::Lambda::Permission" }, - "propertyPath": "Properties.Name", + "propertyPath": "Properties.Action", "category": "Best Practice", - "startLine": 238, + "startLine": 276, "startColumn": 5, - "endLine": 238, - "endColumn": 10, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "endLine": 276, + "endColumn": 12, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -4084,187 +3901,180 @@ } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'examplebucketC9DFA43E' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "examplebucketC9DFA43E", + "logicalId": "UrlShortenerApiproxyANYApiPermissionurlshortappUrlShortenerApiB1BAB0CDANYproxy8ED41C08", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::Lambda::Permission" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.FunctionName", "category": "Best Practice", - "startLine": 5, - "startColumn": 4, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 277, + "startColumn": 5, + "endLine": 277, + "endColumn": 18, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "GetAtt UrlShortenerFunctionB5E87AC1.Arn" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'retrieveTransformedObjectLambdaServiceRole27FF342E' of type 'AWS::IAM::Role' supports Tags but none are configured", + "message": "Property 'Principal' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "retrieveTransformedObjectLambdaServiceRole27FF342E", + "logicalId": "UrlShortenerApiproxyANYApiPermissionurlshortappUrlShortenerApiB1BAB0CDANYproxy8ED41C08", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::Lambda::Permission" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.Principal", "category": "Best Practice", - "startLine": 83, - "startColumn": 4, - "endLine": 83, + "startLine": 283, + "startColumn": 5, + "endLine": 283, "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'retrieveTransformedObjectLambdaD5D6532C' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "message": "Property 'SourceArn' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "retrieveTransformedObjectLambdaD5D6532C", + "logicalId": "UrlShortenerApiproxyANYApiPermissionurlshortappUrlShortenerApiB1BAB0CDANYproxy8ED41C08", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::Lambda::Permission" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.SourceArn", "category": "Best Practice", - "startLine": 141, - "startColumn": 4, - "endLine": 141, + "startLine": 284, + "startColumn": 5, + "endLine": 284, "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "dynamic (Join:arn:aws:execute-api:us-east-1:111111111111:{ref:UrlShortenerApi1FE619BE}/{ref:UrlShortenerApiDeploymentStageprod9A3CCA44}/*/*)" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'exampleBucketAP' of type 'AWS::S3::AccessPoint' supports Tags but none are configured", + "message": "Property 'Action' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "exampleBucketAP", + "logicalId": "UrlShortenerApiproxyANYApiPermissionTesturlshortappUrlShortenerApiB1BAB0CDANYproxy1B61094D", "entityType": "Resource", - "resourceType": "AWS::S3::AccessPoint" + "resourceType": "AWS::Lambda::Permission" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.Action", "category": "Best Practice", - "startLine": 191, - "startColumn": 4, - "endLine": 191, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "cdk/ssm-document-association--SsmDocumentAssociationStack.template.json": { - "filePath": "cdk/ssm-document-association--SsmDocumentAssociationStack.template.json", - "status": "OK", - "metadata": { - "resourcesScanned": 17, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 1, - "informational": 28, - "debug": 0 + "startLine": 312, + "startColumn": 5, + "endLine": 312, + "endColumn": 12, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "W3005", - "severity": "WARN", - "message": "'CustomVpcRestrictDefaultSGCustomResourceProviderRole26592FE0' dependency already enforced by a 'GetAtt' at 'Properties.Role'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "CustomVpcRestrictDefaultSGCustomResourceProviderHandlerDC833E5E", + "logicalId": "UrlShortenerApiproxyANYApiPermissionTesturlshortappUrlShortenerApiB1BAB0CDANYproxy1B61094D", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::Lambda::Permission" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", + "propertyPath": "Properties.FunctionName", "category": "Best Practice", - "startLine": 316, - "startColumn": 4, - "endLine": 316, - "endColumn": 14, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", - "phase": "LINT" + "startLine": 313, + "startColumn": 5, + "endLine": 313, + "endColumn": 18, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "GetAtt UrlShortenerFunctionB5E87AC1.Arn" + } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Content' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'Principal' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "TimeWriterDocument", + "logicalId": "UrlShortenerApiproxyANYApiPermissionTesturlshortappUrlShortenerApiB1BAB0CDANYproxy1B61094D", "entityType": "Resource", - "resourceType": "AWS::SSM::Document" + "resourceType": "AWS::Lambda::Permission" }, - "propertyPath": "Properties.Content", + "propertyPath": "Properties.Principal", "category": "Best Practice", - "startLine": 6, + "startLine": 319, "startColumn": 5, - "endLine": 6, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ssm", + "endLine": 319, + "endColumn": 15, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'DocumentType' is create-only; updating it will cause resource replacement", + "message": "Property 'SourceArn' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "TimeWriterDocument", + "logicalId": "UrlShortenerApiproxyANYApiPermissionTesturlshortappUrlShortenerApiB1BAB0CDANYproxy1B61094D", "entityType": "Resource", - "resourceType": "AWS::SSM::Document" + "resourceType": "AWS::Lambda::Permission" }, - "propertyPath": "Properties.DocumentType", + "propertyPath": "Properties.SourceArn", "category": "Best Practice", - "startLine": 36, + "startLine": 320, "startColumn": 5, - "endLine": 36, - "endColumn": 18, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ssm", + "endLine": 320, + "endColumn": 15, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "dynamic (Join:arn:aws:execute-api:us-east-1:111111111111:{ref:UrlShortenerApi1FE619BE}/test-invoke-stage/*/*)" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Name' is create-only; updating it will cause resource replacement", + "message": "Property 'HttpMethod' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "TimeWriterDocument", + "logicalId": "UrlShortenerApiproxyANY05B511A9", "entityType": "Resource", - "resourceType": "AWS::SSM::Document" + "resourceType": "AWS::ApiGateway::Method" }, - "propertyPath": "Properties.Name", + "propertyPath": "Properties.HttpMethod", "category": "Best Practice", - "startLine": 37, + "startLine": 345, "startColumn": 5, - "endLine": 37, - "endColumn": 10, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ssm", + "endLine": 345, + "endColumn": 16, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -4274,63 +4084,67 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Property 'ResourceId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SSMDocumentTestVpc2979FA29", + "logicalId": "UrlShortenerApiproxyANY05B511A9", "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" + "resourceType": "AWS::ApiGateway::Method" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Properties.ResourceId", "category": "Best Practice", - "startLine": 71, + "startLine": 369, "startColumn": 5, - "endLine": 71, - "endColumn": 15, + "endLine": 369, + "endColumn": 16, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'UrlShortenerApiproxy991A3B5C'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'InstanceTenancy' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'RestApiId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SSMDocumentTestVpc2979FA29", + "logicalId": "UrlShortenerApiproxyANY05B511A9", "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" + "resourceType": "AWS::ApiGateway::Method" }, - "propertyPath": "Properties.InstanceTenancy", + "propertyPath": "Properties.RestApiId", "category": "Best Practice", - "startLine": 74, + "startLine": 372, "startColumn": 5, - "endLine": 74, - "endColumn": 21, + "endLine": 372, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'UrlShortenerApi1FE619BE'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", + "message": "Property 'Action' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SSMDocumentTestVpcpublicSubnet1SubnetB0B3C43E", + "logicalId": "UrlShortenerApiANYApiPermissionurlshortappUrlShortenerApiB1BAB0CDANYB5D53F00", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::Lambda::Permission" }, - "propertyPath": "Properties.AvailabilityZone", + "propertyPath": "Properties.Action", "category": "Best Practice", - "startLine": 89, + "startLine": 383, "startColumn": 5, - "endLine": 89, - "endColumn": 22, + "endLine": 383, + "endColumn": 12, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -4340,143 +4154,132 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SSMDocumentTestVpcpublicSubnet1SubnetB0B3C43E", + "logicalId": "UrlShortenerApiANYApiPermissionurlshortappUrlShortenerApiB1BAB0CDANYB5D53F00", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::Lambda::Permission" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Properties.FunctionName", "category": "Best Practice", - "startLine": 97, + "startLine": 384, "startColumn": 5, - "endLine": 97, - "endColumn": 15, + "endLine": 384, + "endColumn": 18, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "GetAtt UrlShortenerFunctionB5E87AC1.Arn" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "message": "Property 'Principal' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SSMDocumentTestVpcpublicSubnet1SubnetB0B3C43E", + "logicalId": "UrlShortenerApiANYApiPermissionurlshortappUrlShortenerApiB1BAB0CDANYB5D53F00", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::Lambda::Permission" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.Principal", "category": "Best Practice", - "startLine": 113, + "startLine": 390, "startColumn": 5, - "endLine": 113, - "endColumn": 11, + "endLine": 390, + "endColumn": 15, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'SSMDocumentTestVpc2979FA29'" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "message": "Property 'SourceArn' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SSMDocumentTestVpcpublicSubnet1RouteTable4C0F352E", + "logicalId": "UrlShortenerApiANYApiPermissionurlshortappUrlShortenerApiB1BAB0CDANYB5D53F00", "entityType": "Resource", - "resourceType": "AWS::EC2::RouteTable" + "resourceType": "AWS::Lambda::Permission" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.SourceArn", "category": "Best Practice", - "startLine": 130, + "startLine": 391, "startColumn": 5, - "endLine": 130, - "endColumn": 11, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", + "endLine": 391, + "endColumn": 15, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "Ref to 'SSMDocumentTestVpc2979FA29'" + "resolutionSource": "dynamic (Join:arn:aws:execute-api:us-east-1:111111111111:{ref:UrlShortenerApi1FE619BE}/{ref:UrlShortenerApiDeploymentStageprod9A3CCA44}/*/)" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", + "message": "Property 'Action' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SSMDocumentTestVpcpublicSubnet1RouteTableAssociation3C51BE77", + "logicalId": "UrlShortenerApiANYApiPermissionTesturlshortappUrlShortenerApiB1BAB0CDANYD47A7EFF", "entityType": "Resource", - "resourceType": "AWS::EC2::SubnetRouteTableAssociation" + "resourceType": "AWS::Lambda::Permission" }, - "propertyPath": "Properties.RouteTableId", + "propertyPath": "Properties.Action", "category": "Best Practice", - "startLine": 141, + "startLine": 419, "startColumn": 5, - "endLine": 141, - "endColumn": 18, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 419, + "endColumn": 12, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'SSMDocumentTestVpcpublicSubnet1RouteTable4C0F352E'", - "extra": { - "replacement_strategy": "delete_then_create" - } + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SSMDocumentTestVpcpublicSubnet1RouteTableAssociation3C51BE77", + "logicalId": "UrlShortenerApiANYApiPermissionTesturlshortappUrlShortenerApiB1BAB0CDANYD47A7EFF", "entityType": "Resource", - "resourceType": "AWS::EC2::SubnetRouteTableAssociation" + "resourceType": "AWS::Lambda::Permission" }, - "propertyPath": "Properties.SubnetId", + "propertyPath": "Properties.FunctionName", "category": "Best Practice", - "startLine": 144, + "startLine": 420, "startColumn": 5, - "endLine": 144, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 420, + "endColumn": 18, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "Ref to 'SSMDocumentTestVpcpublicSubnet1SubnetB0B3C43E'", - "extra": { - "replacement_strategy": "delete_then_create" - } + "resolutionSource": "GetAtt UrlShortenerFunctionB5E87AC1.Arn" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'DestinationCidrBlock' is create-only; updating it will cause resource replacement", + "message": "Property 'Principal' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SSMDocumentTestVpcpublicSubnet1DefaultRouteE60C709F", + "logicalId": "UrlShortenerApiANYApiPermissionTesturlshortappUrlShortenerApiB1BAB0CDANYD47A7EFF", "entityType": "Resource", - "resourceType": "AWS::EC2::Route" + "resourceType": "AWS::Lambda::Permission" }, - "propertyPath": "Properties.DestinationCidrBlock", + "propertyPath": "Properties.Principal", "category": "Best Practice", - "startLine": 155, + "startLine": 426, "startColumn": 5, - "endLine": 155, - "endColumn": 26, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", + "endLine": 426, + "endColumn": 15, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -4486,116 +4289,114 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", + "message": "Property 'SourceArn' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SSMDocumentTestVpcpublicSubnet1DefaultRouteE60C709F", + "logicalId": "UrlShortenerApiANYApiPermissionTesturlshortappUrlShortenerApiB1BAB0CDANYD47A7EFF", "entityType": "Resource", - "resourceType": "AWS::EC2::Route" + "resourceType": "AWS::Lambda::Permission" }, - "propertyPath": "Properties.RouteTableId", + "propertyPath": "Properties.SourceArn", "category": "Best Practice", - "startLine": 159, + "startLine": 427, "startColumn": 5, - "endLine": 159, - "endColumn": 18, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", + "endLine": 427, + "endColumn": 15, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "Ref to 'SSMDocumentTestVpcpublicSubnet1RouteTable4C0F352E'" + "resolutionSource": "dynamic (Join:arn:aws:execute-api:us-east-1:111111111111:{ref:UrlShortenerApi1FE619BE}/test-invoke-stage/*/)" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "message": "Property 'HttpMethod' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SSMDocumentTestVpcVPCGW7C58FC59", + "logicalId": "UrlShortenerApiANY5994BD69", "entityType": "Resource", - "resourceType": "AWS::EC2::VPCGatewayAttachment" + "resourceType": "AWS::ApiGateway::Method" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.HttpMethod", "category": "Best Practice", - "startLine": 190, + "startLine": 452, "startColumn": 5, - "endLine": 190, - "endColumn": 11, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2-vpc-gateway-attachment.git", + "endLine": 452, + "endColumn": 16, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'SSMDocumentTestVpc2979FA29'", - "extra": { - "replacement_strategy": "delete_then_create" - } + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", + "message": "Property 'ResourceId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SSMTestInstanceInstanceSecurityGroup68B5BAFB", + "logicalId": "UrlShortenerApiANY5994BD69", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::ApiGateway::Method" }, - "propertyPath": "Properties.GroupDescription", + "propertyPath": "Properties.ResourceId", "category": "Best Practice", - "startLine": 362, + "startLine": 476, "startColumn": 5, - "endLine": 362, - "endColumn": 22, + "endLine": 476, + "endColumn": 16, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "GetAtt UrlShortenerApi1FE619BE.RootResourceId" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "message": "Property 'RestApiId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SSMTestInstanceInstanceSecurityGroup68B5BAFB", + "logicalId": "UrlShortenerApiANY5994BD69", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::ApiGateway::Method" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.RestApiId", "category": "Best Practice", - "startLine": 380, + "startLine": 482, "startColumn": 5, - "endLine": 380, - "endColumn": 11, + "endLine": 482, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "Ref to 'SSMDocumentTestVpc2979FA29'" + "resolutionSource": "Ref to 'UrlShortenerApi1FE619BE'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", + "message": "Property 'DomainName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SSMTestInstanceA55C9969", + "logicalId": "UrlShortenerApiDomain85D0CE65", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::ApiGateway::DomainName" }, - "propertyPath": "Properties.AvailabilityZone", + "propertyPath": "Properties.DomainName", "category": "Best Practice", - "startLine": 404, + "startLine": 493, "startColumn": 5, - "endLine": 404, - "endColumn": 22, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 493, + "endColumn": 16, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -4605,144 +4406,106 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "message": "Property 'DomainName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SSMTestInstanceA55C9969", + "logicalId": "UrlShortenerApiDomainMapurlshortappUrlShortenerApiB1BAB0CD7C6BCC1C", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::ApiGateway::BasePathMapping" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Properties.DomainName", "category": "Best Practice", - "startLine": 415, + "startLine": 508, "startColumn": 5, - "endLine": 415, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 508, + "endColumn": 16, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'UrlShortenerApiDomain85D0CE65'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'HostedZoneId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SSMTestInstanceA55C9969", + "logicalId": "UrlShortenerDomain9F16453F", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::Route53::RecordSet" }, - "propertyPath": "Properties.InstanceType", + "propertyPath": "Properties.HostedZoneId", "category": "Best Practice", - "startLine": 418, + "startLine": 539, "startColumn": 5, - "endLine": 418, + "endLine": 539, "endColumn": 18, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'SecurityGroupIds' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "SSMTestInstanceA55C9969", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.SecurityGroupIds", - "category": "Best Practice", - "startLine": 419, - "startColumn": 5, - "endLine": 419, - "endColumn": 22, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53-recordset", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only" } }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", + "message": "Resource 'TableCD117FA1' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "SSMTestInstanceA55C9969", + "logicalId": "TableCD117FA1", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.SubnetId", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 427, - "startColumn": 5, - "endLine": 427, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'SSMDocumentTestVpcpublicSubnet1SubnetB0B3C43E'" - } + "startLine": 5, + "startColumn": 4, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", + "message": "Resource 'UrlShortenerFunctionServiceRole2FBF9CDA' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "SSMTestInstanceA55C9969", + "logicalId": "UrlShortenerFunctionServiceRole2FBF9CDA", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.UserData", - "category": "Best Practice", - "startLine": 440, - "startColumn": 5, - "endLine": 440, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } - }, - { - "ruleId": "I9003", - "severity": "INFO", - "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", - "source": "ENGINE", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", + "startLine": 31, + "startColumn": 4, + "endLine": 31, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'TimeWriterDocument' of type 'AWS::SSM::Document' supports Tags but none are configured", + "message": "Resource 'UrlShortenerFunctionB5E87AC1' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "TimeWriterDocument", + "logicalId": "UrlShortenerFunctionB5E87AC1", "entityType": "Resource", - "resourceType": "AWS::SSM::Document" + "resourceType": "AWS::Lambda::Function" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 5, + "startLine": 122, "startColumn": 4, - "endLine": 5, + "endLine": 122, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -4750,19 +4513,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'DocumentAssociation' of type 'AWS::SSM::Association' supports Tags but none are configured", + "message": "Resource 'UrlShortenerApi1FE619BE' of type 'AWS::ApiGateway::RestApi' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "DocumentAssociation", + "logicalId": "UrlShortenerApi1FE619BE", "entityType": "Resource", - "resourceType": "AWS::SSM::Association" + "resourceType": "AWS::ApiGateway::RestApi" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 45, + "startLine": 157, "startColumn": 4, - "endLine": 45, + "endLine": 157, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -4770,19 +4533,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'CustomVpcRestrictDefaultSGCustomResourceProviderRole26592FE0' of type 'AWS::IAM::Role' supports Tags but none are configured", + "message": "Resource 'UrlShortenerApiCloudWatchRole28577D98' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "CustomVpcRestrictDefaultSGCustomResourceProviderRole26592FE0", + "logicalId": "UrlShortenerApiCloudWatchRole28577D98", "entityType": "Resource", "resourceType": "AWS::IAM::Role" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 225, + "startLine": 166, "startColumn": 4, - "endLine": 225, + "endLine": 166, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -4790,19 +4553,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'CustomVpcRestrictDefaultSGCustomResourceProviderHandlerDC833E5E' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "message": "Resource 'UrlShortenerApiDeploymentStageprod9A3CCA44' of type 'AWS::ApiGateway::Stage' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "CustomVpcRestrictDefaultSGCustomResourceProviderHandlerDC833E5E", + "logicalId": "UrlShortenerApiDeploymentStageprod9A3CCA44", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::ApiGateway::Stage" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 297, + "startLine": 239, "startColumn": 4, - "endLine": 297, + "endLine": 239, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -4810,35 +4573,35 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'EC2SSMRole1C0EBD7B' of type 'AWS::IAM::Role' supports Tags but none are configured", + "message": "Resource 'UrlShortenerApiDomain85D0CE65' of type 'AWS::ApiGateway::DomainName' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "EC2SSMRole1C0EBD7B", + "logicalId": "UrlShortenerApiDomain85D0CE65", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::ApiGateway::DomainName" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 327, + "startLine": 492, "startColumn": 4, - "endLine": 327, + "endLine": 492, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "cdk/static-site-basic--MyStaticSite.template.json": { - "filePath": "cdk/static-site-basic--MyStaticSite.template.json", + "cdk/py-url-shortener--urlshort-load-test.template.json": { + "filePath": "cdk/py-url-shortener--urlshort-load-test.template.json", "status": "OK", "metadata": { - "resourcesScanned": 11, + "resourcesScanned": 8, "counts": { "fatal": 0, "errors": 0, - "warnings": 2, - "informational": 7, + "warnings": 0, + "informational": 18, "debug": 0 }, "suppressed": 0, @@ -4847,108 +4610,92 @@ }, "diagnostics": [ { - "ruleId": "W3005", - "severity": "WARN", - "message": "'CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092' dependency already enforced by a 'GetAtt' at 'Properties.Role'", - "source": "CFN_LINT", - "entity": { - "logicalId": "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", - "category": "Best Practice", - "startLine": 235, - "startColumn": 4, - "endLine": 235, - "endColumn": 14, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", - "phase": "LINT" - }, - { - "ruleId": "W3005", - "severity": "WARN", - "message": "'CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756CServiceRole89A01265' dependency already enforced by a 'GetAtt' at 'Properties.Role'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C81C01536", + "logicalId": "generatorPingTask1D3C2E79", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", + "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 404, - "startColumn": 4, - "endLine": 404, - "endColumn": 14, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", - "phase": "LINT" + "startLine": 32, + "startColumn": 5, + "endLine": 32, + "endColumn": 26, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Bucket' is create-only; updating it will cause resource replacement", + "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "StaticSiteBasicWebsiteBucketPolicy8E799A1F", + "logicalId": "generatorPingTask1D3C2E79", "entityType": "Resource", - "resourceType": "AWS::S3::BucketPolicy" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Bucket", + "propertyPath": "Properties.Cpu", "category": "Best Practice", - "startLine": 35, + "startLine": 47, "startColumn": 5, - "endLine": 35, - "endColumn": 12, + "endLine": 47, + "endColumn": 9, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'StaticSiteBasicWebsiteBucket3BB70B77'" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Content' is create-only; updating it will cause resource replacement", + "message": "Property 'ExecutionRoleArn' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "StaticSiteBasicDeployWebsiteAwsCliLayer198D4134", + "logicalId": "generatorPingTask1D3C2E79", "entityType": "Resource", - "resourceType": "AWS::Lambda::LayerVersion" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Content", + "propertyPath": "Properties.ExecutionRoleArn", "category": "Best Practice", - "startLine": 133, + "startLine": 48, "startColumn": 5, - "endLine": 133, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-lambda.git", + "endLine": 48, + "endColumn": 22, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "GetAtt generatorPingTaskExecutionRoleA7BE7F8B.Arn" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Description' is create-only; updating it will cause resource replacement", + "message": "Property 'Family' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "StaticSiteBasicDeployWebsiteAwsCliLayer198D4134", + "logicalId": "generatorPingTask1D3C2E79", "entityType": "Resource", - "resourceType": "AWS::Lambda::LayerVersion" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Description", + "propertyPath": "Properties.Family", "category": "Best Practice", - "startLine": 139, + "startLine": 54, "startColumn": 5, - "endLine": 139, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-lambda.git", + "endLine": 54, + "endColumn": 12, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -4956,141 +4703,45 @@ } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092' of type 'AWS::IAM::Role' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", - "entityType": "Resource", - "resourceType": "AWS::IAM::Role" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 180, - "startColumn": 4, - "endLine": 180, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F' of type 'AWS::Lambda::Function' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 205, - "startColumn": 4, - "endLine": 205, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756CServiceRole89A01265' of type 'AWS::IAM::Role' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756CServiceRole89A01265", - "entityType": "Resource", - "resourceType": "AWS::IAM::Role" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 246, - "startColumn": 4, - "endLine": 246, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C81C01536' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "message": "Property 'Memory' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C81C01536", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 377, - "startColumn": 4, - "endLine": 377, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "cdk/stepfunction-external-definition--StepfunctionExternalDefinitionStack.template.json": { - "filePath": "cdk/stepfunction-external-definition--StepfunctionExternalDefinitionStack.template.json", - "status": "OK", - "metadata": { - "resourcesScanned": 12, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 1, - "informational": 17, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "W3005", - "severity": "WARN", - "message": "'MyStateMachineRoleD59FFEBC' dependency already enforced by a 'GetAtt' at 'Properties.RoleArn'", - "source": "CFN_LINT", - "entity": { - "logicalId": "MyStateMachine6C968CA5", + "logicalId": "generatorPingTask1D3C2E79", "entityType": "Resource", - "resourceType": "AWS::StepFunctions::StateMachine" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", + "propertyPath": "Properties.Memory", "category": "Best Practice", - "startLine": 109, - "startColumn": 4, - "endLine": 109, - "endColumn": 14, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", - "phase": "LINT" + "startLine": 55, + "startColumn": 5, + "endLine": 55, + "endColumn": 12, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'LogGroupName' is create-only; updating it will cause resource replacement", + "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MyStateMachineLogGroup9955D1FE", + "logicalId": "generatorPingTask1D3C2E79", "entityType": "Resource", - "resourceType": "AWS::Logs::LogGroup" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.LogGroupName", + "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 6, + "startLine": 56, "startColumn": 5, - "endLine": 6, - "endColumn": 18, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-logs.git", + "endLine": 56, + "endColumn": 17, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -5100,20 +4751,20 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'StateMachineType' is create-only; updating it will cause resource replacement", + "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MyStateMachine6C968CA5", + "logicalId": "generatorPingTask1D3C2E79", "entityType": "Resource", - "resourceType": "AWS::StepFunctions::StateMachine" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.StateMachineType", + "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 107, + "startLine": 57, "startColumn": 5, - "endLine": 107, - "endColumn": 22, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-stepfunctions.git", + "endLine": 57, + "endColumn": 29, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -5123,115 +4774,110 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'RestApiId' is create-only; updating it will cause resource replacement", + "message": "Property 'TaskRoleArn' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "StepFuncApiDeployment77C863276f473a57d5bd4cb772b382f83651c7a2", + "logicalId": "generatorPingTask1D3C2E79", "entityType": "Resource", - "resourceType": "AWS::ApiGateway::Deployment" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.RestApiId", + "propertyPath": "Properties.TaskRoleArn", "category": "Best Practice", - "startLine": 138, + "startLine": 60, "startColumn": 5, - "endLine": 138, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway", + "endLine": 60, + "endColumn": 17, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "Ref to 'StepFuncApiE896FCA7'" + "resolutionSource": "GetAtt generatorPingTaskTaskRoleA4886BE8.Arn" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'RestApiId' is create-only; updating it will cause resource replacement", + "message": "Property 'Cluster' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "StepFuncApiDeploymentStageprod5FF8FD8E", + "logicalId": "generatorserviceServiceA6AC5079", "entityType": "Resource", - "resourceType": "AWS::ApiGateway::Stage" + "resourceType": "AWS::ECS::Service" }, - "propertyPath": "Properties.RestApiId", + "propertyPath": "Properties.Cluster", "category": "Best Practice", - "startLine": 157, + "startLine": 138, "startColumn": 5, - "endLine": 157, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway", + "endLine": 138, + "endColumn": 13, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "Ref to 'StepFuncApiE896FCA7'" + "resolutionSource": "Ref to 'generatorcluster9804CB70'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'StageName' is create-only; updating it will cause resource replacement", + "message": "Property 'LaunchType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "StepFuncApiDeploymentStageprod5FF8FD8E", + "logicalId": "generatorserviceServiceA6AC5079", "entityType": "Resource", - "resourceType": "AWS::ApiGateway::Stage" + "resourceType": "AWS::ECS::Service" }, - "propertyPath": "Properties.StageName", + "propertyPath": "Properties.LaunchType", "category": "Best Practice", - "startLine": 160, + "startLine": 152, "startColumn": 5, - "endLine": 160, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway", + "endLine": 152, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ParentId' is create-only; updating it will cause resource replacement", + "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "StepFuncApiorders391C1FA5", + "logicalId": "generatorserviceSecurityGroup3D8BECF8", "entityType": "Resource", - "resourceType": "AWS::ApiGateway::Resource" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.ParentId", + "propertyPath": "Properties.GroupDescription", "category": "Best Practice", - "startLine": 169, + "startLine": 185, "startColumn": 5, - "endLine": 169, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway", + "endLine": 185, + "endColumn": 22, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt StepFuncApiE896FCA7.RootResourceId" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'PathPart' is create-only; updating it will cause resource replacement", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "StepFuncApiorders391C1FA5", + "logicalId": "generatorserviceSecurityGroup3D8BECF8", "entityType": "Resource", - "resourceType": "AWS::ApiGateway::Resource" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.PathPart", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 175, + "startLine": 193, "startColumn": 5, - "endLine": 175, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway", + "endLine": 193, + "endColumn": 11, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -5239,136 +4885,41 @@ } }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'RestApiId' is create-only; updating it will cause resource replacement", + "message": "Resource 'generatorcluster9804CB70' of type 'AWS::ECS::Cluster' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "StepFuncApiorders391C1FA5", + "logicalId": "generatorcluster9804CB70", "entityType": "Resource", - "resourceType": "AWS::ApiGateway::Resource" + "resourceType": "AWS::ECS::Cluster" }, - "propertyPath": "Properties.RestApiId", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 176, - "startColumn": 5, - "endLine": 176, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'StepFuncApiE896FCA7'" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'HttpMethod' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "StepFuncApiordersGET0318ABB9", - "entityType": "Resource", - "resourceType": "AWS::ApiGateway::Method" - }, - "propertyPath": "Properties.HttpMethod", - "category": "Best Practice", - "startLine": 234, - "startColumn": 5, - "endLine": 234, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ResourceId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "StepFuncApiordersGET0318ABB9", - "entityType": "Resource", - "resourceType": "AWS::ApiGateway::Method" - }, - "propertyPath": "Properties.ResourceId", - "category": "Best Practice", - "startLine": 318, - "startColumn": 5, - "endLine": 318, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'StepFuncApiorders391C1FA5'" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'RestApiId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "StepFuncApiordersGET0318ABB9", - "entityType": "Resource", - "resourceType": "AWS::ApiGateway::Method" - }, - "propertyPath": "Properties.RestApiId", - "category": "Best Practice", - "startLine": 321, - "startColumn": 5, - "endLine": 321, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'StepFuncApiE896FCA7'" - } - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'MyStateMachineLogGroup9955D1FE' of type 'AWS::Logs::LogGroup' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "MyStateMachineLogGroup9955D1FE", - "entityType": "Resource", - "resourceType": "AWS::Logs::LogGroup" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 5, - "startColumn": 4, - "endLine": 5, - "endColumn": 15, + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 28, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'MyStateMachineRoleD59FFEBC' of type 'AWS::IAM::Role' supports Tags but none are configured", + "message": "Resource 'generatorPingTaskTaskRoleA4886BE8' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "MyStateMachineRoleD59FFEBC", + "logicalId": "generatorPingTaskTaskRoleA4886BE8", "entityType": "Resource", "resourceType": "AWS::IAM::Role" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 17, + "startLine": 11, "startColumn": 4, - "endLine": 17, + "endLine": 11, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -5376,19 +4927,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'MyStateMachine6C968CA5' of type 'AWS::StepFunctions::StateMachine' supports Tags but none are configured", + "message": "Resource 'generatorPingTask1D3C2E79' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "MyStateMachine6C968CA5", + "logicalId": "generatorPingTask1D3C2E79", "entityType": "Resource", - "resourceType": "AWS::StepFunctions::StateMachine" + "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 83, + "startLine": 31, "startColumn": 4, - "endLine": 83, + "endLine": 31, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -5396,19 +4947,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'StepFuncApiE896FCA7' of type 'AWS::ApiGateway::RestApi' supports Tags but none are configured", + "message": "Resource 'generatorPingTaskExecutionRoleA7BE7F8B' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "StepFuncApiE896FCA7", + "logicalId": "generatorPingTaskExecutionRoleA7BE7F8B", "entityType": "Resource", - "resourceType": "AWS::ApiGateway::RestApi" + "resourceType": "AWS::IAM::Role" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 121, + "startLine": 73, "startColumn": 4, - "endLine": 121, + "endLine": 73, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -5416,19 +4967,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'StepFuncApiDeploymentStageprod5FF8FD8E' of type 'AWS::ApiGateway::Stage' supports Tags but none are configured", + "message": "Resource 'generatorserviceServiceA6AC5079' of type 'AWS::ECS::Service' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "StepFuncApiDeploymentStageprod5FF8FD8E", + "logicalId": "generatorserviceServiceA6AC5079", "entityType": "Resource", - "resourceType": "AWS::ApiGateway::Stage" + "resourceType": "AWS::ECS::Service" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 153, + "startLine": 137, "startColumn": 4, - "endLine": 153, + "endLine": 137, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -5436,35 +4987,35 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'StepFuncApiordersGETStartSyncExecutionRole90998151' of type 'AWS::IAM::Role' supports Tags but none are configured", + "message": "Resource 'generatorserviceSecurityGroup3D8BECF8' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "StepFuncApiordersGETStartSyncExecutionRole90998151", + "logicalId": "generatorserviceSecurityGroup3D8BECF8", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::EC2::SecurityGroup" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 186, + "startLine": 184, "startColumn": 4, - "endLine": 186, + "endLine": 184, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "cdk/stepfunctions-job-poller--aws-stepfunctions-integ.template.json": { - "filePath": "cdk/stepfunctions-job-poller--aws-stepfunctions-integ.template.json", + "cdk/r53-resolver--R53ResolverStack.template.json": { + "filePath": "cdk/r53-resolver--R53ResolverStack.template.json", "status": "OK", "metadata": { - "resourcesScanned": 11, + "resourcesScanned": 18, "counts": { "fatal": 0, "errors": 0, - "warnings": 5, - "informational": 8, + "warnings": 1, + "informational": 33, "debug": 0 }, "suppressed": 0, @@ -5473,522 +5024,467 @@ }, "diagnostics": [ { - "ruleId": "W2531", + "ruleId": "W3005", "severity": "WARN", - "message": "Runtime 'python3.9' was deprecated on '2025-12-15'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'python3.14'", + "message": "'CustomVpcRestrictDefaultSGCustomResourceProviderRole26592FE0' dependency already enforced by a 'GetAtt' at 'Properties.Role'", "source": "CFN_LINT", "entity": { - "logicalId": "CheckLambda9CBBF9BA", + "logicalId": "CustomVpcRestrictDefaultSGCustomResourceProviderHandlerDC833E5E", "entityType": "Resource", "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 50, - "startColumn": 5, - "endLine": 50, - "endColumn": 13, - "ruleDescription": "Check if EOL Lambda Function Runtimes are used", - "phase": "SCHEMA", - "context": { - "actualValue": "python3.9", - "lifecycle": "deprecated" - } + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 271, + "startColumn": 4, + "endLine": 271, + "endColumn": 14, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" }, { - "ruleId": "W2531", - "severity": "WARN", - "message": "Runtime 'python3.9' was deprecated on '2025-12-15'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'python3.14'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "SubmitLambda8054545E", + "logicalId": "R53ResolverTestVPC9B993306", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::EC2::VPC" }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 107, + "propertyPath": "Properties.CidrBlock", + "category": "Best Practice", + "startLine": 6, "startColumn": 5, - "endLine": 107, - "endColumn": 13, - "ruleDescription": "Check if EOL Lambda Function Runtimes are used", + "endLine": 6, + "endColumn": 15, + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "actualValue": "python3.9", - "lifecycle": "deprecated" + "lifecycle": "create-only" } }, { - "ruleId": "W3005", - "severity": "WARN", - "message": "'CheckLambdaServiceRole74B86E23' dependency already enforced by a 'GetAtt' at 'Properties.Role'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'InstanceTenancy' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "CheckLambda9CBBF9BA", + "logicalId": "R53ResolverTestVPC9B993306", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::EC2::VPC" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", + "propertyPath": "Properties.InstanceTenancy", "category": "Best Practice", - "startLine": 53, - "startColumn": 4, - "endLine": 53, - "endColumn": 14, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", - "phase": "LINT" + "startLine": 9, + "startColumn": 5, + "endLine": 9, + "endColumn": 21, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "W3005", - "severity": "WARN", - "message": "'SubmitLambdaServiceRole98C85C39' dependency already enforced by a 'GetAtt' at 'Properties.Role'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "SubmitLambda8054545E", + "logicalId": "R53ResolverTestVPCPrivateSubnet1Subnet5DBB6B2C", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", + "propertyPath": "Properties.AvailabilityZone", "category": "Best Practice", - "startLine": 110, - "startColumn": 4, - "endLine": 110, - "endColumn": 14, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", - "phase": "LINT" + "startLine": 24, + "startColumn": 5, + "endLine": 24, + "endColumn": 22, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W3005", - "severity": "WARN", - "message": "'CronStateMachineRoleFE85923B' dependency already enforced by a 'GetAtt' at 'Properties.RoleArn'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "CronStateMachine7E50955B", + "logicalId": "R53ResolverTestVPCPrivateSubnet1Subnet5DBB6B2C", "entityType": "Resource", - "resourceType": "AWS::StepFunctions::StateMachine" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 259, - "startColumn": 4, - "endLine": 259, - "endColumn": 14, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", - "phase": "LINT" + "startLine": 32, + "startColumn": 5, + "endLine": 32, + "endColumn": 15, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'CheckLambdaServiceRole74B86E23' of type 'AWS::IAM::Role' supports Tags but none are configured", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "CheckLambdaServiceRole74B86E23", + "logicalId": "R53ResolverTestVPCPrivateSubnet1Subnet5DBB6B2C", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 5, - "startColumn": 4, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 48, + "startColumn": 5, + "endLine": 48, + "endColumn": 11, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'R53ResolverTestVPC9B993306'" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'CheckLambda9CBBF9BA' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "CheckLambda9CBBF9BA", + "logicalId": "R53ResolverTestVPCPrivateSubnet1RouteTable6E169019", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::EC2::RouteTable" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 39, - "startColumn": 4, - "endLine": 39, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 65, + "startColumn": 5, + "endLine": 65, + "endColumn": 11, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'R53ResolverTestVPC9B993306'" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'SubmitLambdaServiceRole98C85C39' of type 'AWS::IAM::Role' supports Tags but none are configured", + "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SubmitLambdaServiceRole98C85C39", + "logicalId": "R53ResolverTestVPCPrivateSubnet1RouteTableAssociation41B46D9B", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::EC2::SubnetRouteTableAssociation" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.RouteTableId", "category": "Best Practice", - "startLine": 62, - "startColumn": 4, - "endLine": 62, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 76, + "startColumn": 5, + "endLine": 76, + "endColumn": 18, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'R53ResolverTestVPCPrivateSubnet1RouteTable6E169019'", + "extra": { + "replacement_strategy": "delete_then_create" + } + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'SubmitLambda8054545E' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SubmitLambda8054545E", + "logicalId": "R53ResolverTestVPCPrivateSubnet1RouteTableAssociation41B46D9B", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::EC2::SubnetRouteTableAssociation" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.SubnetId", "category": "Best Practice", - "startLine": 96, - "startColumn": 4, - "endLine": 96, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 79, + "startColumn": 5, + "endLine": 79, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'R53ResolverTestVPCPrivateSubnet1Subnet5DBB6B2C'", + "extra": { + "replacement_strategy": "delete_then_create" + } + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'CronStateMachineRoleFE85923B' of type 'AWS::IAM::Role' supports Tags but none are configured", + "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "CronStateMachineRoleFE85923B", + "logicalId": "R53ResolverTestVPCPrivateSubnet2Subnet495784E7", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.AvailabilityZone", "category": "Best Practice", - "startLine": 119, - "startColumn": 4, - "endLine": 119, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 90, + "startColumn": 5, + "endLine": 90, + "endColumn": 22, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'CronStateMachine7E50955B' of type 'AWS::StepFunctions::StateMachine' supports Tags but none are configured", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "CronStateMachine7E50955B", + "logicalId": "R53ResolverTestVPCPrivateSubnet2Subnet495784E7", "entityType": "Resource", - "resourceType": "AWS::StepFunctions::StateMachine" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 210, - "startColumn": 4, - "endLine": 210, + "startLine": 98, + "startColumn": 5, + "endLine": 98, "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'CronStateMachineEventsRoleA3F136B0' of type 'AWS::IAM::Role' supports Tags but none are configured", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "CronStateMachineEventsRoleA3F136B0", + "logicalId": "R53ResolverTestVPCPrivateSubnet2Subnet495784E7", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 271, - "startColumn": 4, - "endLine": 271, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 114, + "startColumn": 5, + "endLine": 114, + "endColumn": 11, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'R53ResolverTestVPC9B993306'" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'Rule4C995B7F' of type 'AWS::Events::Rule' supports Tags but none are configured", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Rule4C995B7F", + "logicalId": "R53ResolverTestVPCPrivateSubnet2RouteTable0899A697", "entityType": "Resource", - "resourceType": "AWS::Events::Rule" + "resourceType": "AWS::EC2::RouteTable" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 317, - "startColumn": 4, - "endLine": 317, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "empty.yaml": { - "filePath": "empty.yaml", - "status": "ERROR", - "metadata": { - "resourcesScanned": 0, - "counts": { - "fatal": 1, - "errors": 0, - "warnings": 0, - "informational": 0, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "F1101", - "severity": "FATAL", - "message": "Empty YAML document", - "source": "SCHEMA", - "category": "Structure", - "startLine": 1, - "startColumn": 1, - "endLine": 1, - "endColumn": 1, - "ruleDescription": "Invalid YAML/JSON syntax", - "phase": "PARSE" - } - ] - }, - "gh-issues/issue-144.yaml": { - "filePath": "gh-issues/issue-144.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 3, - "debug": 0 + "startLine": 131, + "startColumn": 5, + "endLine": 131, + "endColumn": 11, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'R53ResolverTestVPC9B993306'" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Name' is create-only; updating it will cause resource replacement", + "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Flow", + "logicalId": "R53ResolverTestVPCPrivateSubnet2RouteTableAssociation53E27A3B", "entityType": "Resource", - "resourceType": "AWS::MediaConnect::Flow" + "resourceType": "AWS::EC2::SubnetRouteTableAssociation" }, - "propertyPath": "Properties.Name", + "propertyPath": "Properties.RouteTableId", "category": "Best Practice", - "startLine": 11, - "startColumn": 7, - "endLine": 11, - "endColumn": 11, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-mediaconnect.git", + "startLine": 142, + "startColumn": 5, + "endLine": 142, + "endColumn": 18, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'R53ResolverTestVPCPrivateSubnet2RouteTable0899A697'", + "extra": { + "replacement_strategy": "delete_then_create" + } } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Source.Name' is create-only; updating it will cause resource replacement", + "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Flow", + "logicalId": "R53ResolverTestVPCPrivateSubnet2RouteTableAssociation53E27A3B", "entityType": "Resource", - "resourceType": "AWS::MediaConnect::Flow" + "resourceType": "AWS::EC2::SubnetRouteTableAssociation" }, - "propertyPath": "Properties.Source.Name", + "propertyPath": "Properties.SubnetId", "category": "Best Practice", - "startLine": 13, - "startColumn": 9, - "endLine": 13, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-mediaconnect.git", + "startLine": 145, + "startColumn": 5, + "endLine": 145, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'R53ResolverTestVPCPrivateSubnet2Subnet495784E7'", + "extra": { + "replacement_strategy": "delete_then_create" + } } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'Flow' of type 'AWS::MediaConnect::Flow' supports Tags but none are configured", + "message": "Property 'FirewallRuleGroupId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Flow", + "logicalId": "BlockListRuleGroupDirectBlockListRuleGroupAssociation40E90DB0", "entityType": "Resource", - "resourceType": "AWS::MediaConnect::Flow" + "resourceType": "AWS::Route53Resolver::FirewallRuleGroupAssociation" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.FirewallRuleGroupId", "category": "Best Practice", - "startLine": 10, + "startLine": 316, "startColumn": 5, - "endLine": 10, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "gh-issues/issue-183.yaml": { - "filePath": "gh-issues/issue-183.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 3, - "counts": { - "fatal": 1, - "errors": 0, - "warnings": 4, - "informational": 9, - "debug": 0 + "endLine": 316, + "endColumn": 25, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "GetAtt BlockListRuleGroup55F6B55D.Id" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "F3031", - "severity": "FATAL", - "message": "'arn:aws:sqs:us-east-1:1111111111:MyQueue' does not match pattern '^arn:(aws[a-zA-Z0-9-]*):([a-zA-Z0-9\\-])+:((eusc-)?[a-z]{2}((-gov)|(-iso([a-z]?)))?-[a-z]+-\\d{1})?:(\\d{12})?:(.*)$'", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "PermissionInvalidAccountId", + "logicalId": "BlockListRuleGroupDirectBlockListRuleGroupAssociation40E90DB0", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::Route53Resolver::FirewallRuleGroupAssociation" }, - "propertyPath": "Properties.SourceArn", - "category": "Schema", - "startLine": 35, - "startColumn": 7, - "endLine": 35, - "endColumn": 16, - "ruleDescription": "Value does not match pattern", + "propertyPath": "Properties.VpcId", + "category": "Best Practice", + "startLine": 323, + "startColumn": 5, + "endLine": 323, + "endColumn": 11, + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "actualValue": "arn:aws:sqs:us-east-1:1111111111:MyQueue", - "expectedConstraint": "^arn:(aws[a-zA-Z0-9-]*):([a-zA-Z0-9\\-])+:((eusc-)?[a-z]{2}((-gov)|(-iso([a-z]?)))?-[a-z]+-\\d{1})?:(\\d{12})?:(.*)$" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'R53ResolverTestVPC9B993306'" } }, { - "ruleId": "W3663", - "severity": "WARN", - "message": "Lambda Permission with a SourceArn that has no account id should also specify SourceAccount", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "PermissionInvalidAccountId", + "logicalId": "sgoutboundendpointEC0509A3", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties", - "suggestedFix": "Add SourceAccount property", - "category": "Security", - "startLine": 31, + "propertyPath": "Properties.GroupDescription", + "category": "Best Practice", + "startLine": 334, "startColumn": 5, - "endLine": 31, - "endColumn": 15, - "ruleDescription": "Validate SourceAccount is required property", - "phase": "LINT" + "endLine": 334, + "endColumn": 22, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W9002", - "severity": "WARN", - "message": "Property 'SourceArn' has a hardcoded ARN - use Ref, GetAtt, or a parameter instead", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "PermissionWithAccountId", + "logicalId": "sgoutboundendpointEC0509A3", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.SourceArn", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 25, - "startColumn": 7, - "endLine": 25, - "endColumn": 16, - "ruleDescription": "Hardcoded ARN property", - "phase": "LINT" + "startLine": 396, + "startColumn": 5, + "endLine": 396, + "endColumn": 11, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'R53ResolverTestVPC9B993306'" + } }, { - "ruleId": "W9002", - "severity": "WARN", - "message": "Property 'SourceArn' has a hardcoded ARN - use Ref, GetAtt, or a parameter instead", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Direction' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "PermissionInvalidAccountId", + "logicalId": "OutboundEndpoint", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::Route53Resolver::ResolverEndpoint" }, - "propertyPath": "Properties.SourceArn", + "propertyPath": "Properties.Direction", "category": "Best Practice", - "startLine": 35, - "startColumn": 7, - "endLine": 35, - "endColumn": 16, - "ruleDescription": "Hardcoded ARN property", - "phase": "LINT" - }, - { - "ruleId": "W9013", - "severity": "WARN", - "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", - "source": "ENGINE", - "entity": { - "logicalId": "PermissionWithAccountId", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" - }, - "category": "Security", - "startLine": 19, - "startColumn": 3, - "endLine": 19, - "endColumn": 26, - "ruleDescription": "Hardcoded account ID in ARN", - "phase": "LINT" - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Action' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "PermissionWithAccountId", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" - }, - "propertyPath": "Properties.Action", - "category": "Best Practice", - "startLine": 22, - "startColumn": 7, - "endLine": 22, - "endColumn": 13, + "startLine": 407, + "startColumn": 5, + "endLine": 407, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53resolver", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -5998,42 +5494,42 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "message": "Property 'SecurityGroupIds' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "PermissionWithAccountId", + "logicalId": "OutboundEndpoint", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::Route53Resolver::ResolverEndpoint" }, - "propertyPath": "Properties.FunctionName", + "propertyPath": "Properties.SecurityGroupIds", "category": "Best Practice", - "startLine": 23, - "startColumn": 7, - "endLine": 23, - "endColumn": 19, + "startLine": 420, + "startColumn": 5, + "endLine": 420, + "endColumn": 22, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53resolver", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt MyLambda.Arn" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Principal' is create-only; updating it will cause resource replacement", + "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "PermissionWithAccountId", + "logicalId": "sginboundendpoint32081788", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.Principal", + "propertyPath": "Properties.GroupDescription", "category": "Best Practice", - "startLine": 24, - "startColumn": 7, - "endLine": 24, - "endColumn": 16, + "startLine": 436, + "startColumn": 5, + "endLine": 436, + "endColumn": 22, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -6043,41 +5539,43 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'SourceArn' is create-only; updating it will cause resource replacement", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "PermissionWithAccountId", + "logicalId": "sginboundendpoint32081788", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.SourceArn", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 25, - "startColumn": 7, - "endLine": 25, - "endColumn": 16, + "startLine": 460, + "startColumn": 5, + "endLine": 460, + "endColumn": 11, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'R53ResolverTestVPC9B993306'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Action' is create-only; updating it will cause resource replacement", + "message": "Property 'Direction' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "PermissionInvalidAccountId", + "logicalId": "InboundEndpoint", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::Route53Resolver::ResolverEndpoint" }, - "propertyPath": "Properties.Action", + "propertyPath": "Properties.Direction", "category": "Best Practice", - "startLine": 32, - "startColumn": 7, - "endLine": 32, - "endColumn": 13, + "startLine": 471, + "startColumn": 5, + "endLine": 471, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53resolver", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -6087,246 +5585,218 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "message": "Property 'SecurityGroupIds' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "PermissionInvalidAccountId", + "logicalId": "InboundEndpoint", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::Route53Resolver::ResolverEndpoint" }, - "propertyPath": "Properties.FunctionName", + "propertyPath": "Properties.SecurityGroupIds", "category": "Best Practice", - "startLine": 33, - "startColumn": 7, - "endLine": 33, - "endColumn": 19, + "startLine": 484, + "startColumn": 5, + "endLine": 484, + "endColumn": 22, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53resolver", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt MyLambda.Arn" + "lifecycle": "create-only" } }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Principal' is create-only; updating it will cause resource replacement", + "message": "Resource 'CustomVpcRestrictDefaultSGCustomResourceProviderRole26592FE0' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "PermissionInvalidAccountId", + "logicalId": "CustomVpcRestrictDefaultSGCustomResourceProviderRole26592FE0", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.Principal", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 34, - "startColumn": 7, - "endLine": 34, - "endColumn": 16, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 180, + "startColumn": 4, + "endLine": 180, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'SourceArn' is create-only; updating it will cause resource replacement", + "message": "Resource 'CustomVpcRestrictDefaultSGCustomResourceProviderHandlerDC833E5E' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "PermissionInvalidAccountId", + "logicalId": "CustomVpcRestrictDefaultSGCustomResourceProviderHandlerDC833E5E", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.SourceArn", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 35, - "startColumn": 7, - "endLine": 35, - "endColumn": 16, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 252, + "startColumn": 4, + "endLine": 252, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'MyLambda' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "message": "Resource 'BlockListC03D0423' of type 'AWS::Route53Resolver::FirewallDomainList' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "MyLambda", + "logicalId": "BlockListC03D0423", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::Route53Resolver::FirewallDomainList" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 12, - "startColumn": 5, - "endLine": 12, + "startLine": 282, + "startColumn": 4, + "endLine": 282, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" - } - ] - }, - "gh-issues/issue-184.yaml": { - "filePath": "gh-issues/issue-184.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 0, - "informational": 5, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "E3025", - "severity": "ERROR", - "message": "'db.m5.large' is not one of ['db.r3.2xlarge', 'db.r3.4xlarge', 'db.r3.8xlarge', 'db.r3.large', 'db.r3.xlarge', 'db.r4.16xlarge', 'db.r4.2xlarge', 'db.r4.4xlarge', 'db.r4.8xlarge', 'db.r4.large', 'db.r4.xlarge', 'db.r5.12xlarge', 'db.r5.16xlarge', 'db.r5.24xlarge', 'db.r5.2xlarge', 'db.r5.4xlarge', 'db.r5.8xlarge', 'db.r5.large', 'db.r5.xlarge', 'db.r6g.12xlarge', 'db.r6g.16xlarge', 'db.r6g.2xlarge', 'db.r6g.4xlarge', 'db.r6g.8xlarge', 'db.r6g.large', 'db.r6g.xlarge', 'db.r6i.12xlarge', 'db.r6i.16xlarge', 'db.r6i.24xlarge', 'db.r6i.2xlarge', 'db.r6i.32xlarge', 'db.r6i.4xlarge', 'db.r6i.8xlarge', 'db.r6i.large', 'db.r6i.xlarge', 'db.r7g.12xlarge', 'db.r7g.16xlarge', 'db.r7g.2xlarge', 'db.r7g.4xlarge', 'db.r7g.8xlarge', 'db.r7g.large', 'db.r7g.xlarge', 'db.r7i.12xlarge', 'db.r7i.16xlarge', 'db.r7i.24xlarge', 'db.r7i.2xlarge', 'db.r7i.48xlarge', 'db.r7i.4xlarge', 'db.r7i.8xlarge', 'db.r7i.large', 'db.r7i.xlarge', 'db.r8g.12xlarge', 'db.r8g.16xlarge', 'db.r8g.24xlarge', 'db.r8g.2xlarge', 'db.r8g.48xlarge', 'db.r8g.4xlarge', 'db.r8g.8xlarge', 'db.r8g.large', 'db.r8g.xlarge', 'db.serverless', 'db.t2.medium', 'db.t2.small', 'db.t3.large', 'db.t3.medium', 'db.t3.small', 'db.t4g.large', 'db.t4g.medium', 'db.x2g.12xlarge', 'db.x2g.16xlarge', 'db.x2g.2xlarge', 'db.x2g.4xlarge', 'db.x2g.8xlarge', 'db.x2g.large', 'db.x2g.xlarge'] when Engine is 'aurora-mysql' in any region", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'BlockListRuleGroup55F6B55D' of type 'AWS::Route53Resolver::FirewallRuleGroup' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "AuroraInstance", + "logicalId": "BlockListRuleGroup55F6B55D", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Route53Resolver::FirewallRuleGroup" }, - "propertyPath": "Properties.DBInstanceClass", - "category": "Resource", - "startLine": 5, - "startColumn": 7, - "endLine": 5, - "endColumn": 22, - "ruleDescription": "Validates RDS DB Instance Class", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 294, + "startColumn": 4, + "endLine": 294, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "I3011", + "ruleId": "I9040", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Resource 'BlockListRuleGroupDirectBlockListRuleGroupAssociation40E90DB0' of type 'AWS::Route53Resolver::FirewallRuleGroupAssociation' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "AuroraInstance", + "logicalId": "BlockListRuleGroupDirectBlockListRuleGroupAssociation40E90DB0", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Route53Resolver::FirewallRuleGroupAssociation" }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 2, - "startColumn": 3, - "endLine": 2, - "endColumn": 17, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "startLine": 315, + "startColumn": 4, + "endLine": 315, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "I3011", + "ruleId": "I9040", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Resource 'sgoutboundendpointEC0509A3' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "AuroraInstance", + "logicalId": "sgoutboundendpointEC0509A3", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::SecurityGroup" }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 2, - "startColumn": 3, - "endLine": 2, - "endColumn": 17, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "startLine": 333, + "startColumn": 4, + "endLine": 333, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Resource 'OutboundEndpoint' of type 'AWS::Route53Resolver::ResolverEndpoint' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "AuroraInstance", + "logicalId": "OutboundEndpoint", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Route53Resolver::ResolverEndpoint" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 6, - "startColumn": 7, - "endLine": 6, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 406, + "startColumn": 4, + "endLine": 406, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9003", + "ruleId": "I9040", "severity": "INFO", - "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", + "message": "Resource 'sginboundendpoint32081788' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", "source": "ENGINE", + "entity": { + "logicalId": "sginboundendpoint32081788", + "entityType": "Resource", + "resourceType": "AWS::EC2::SecurityGroup" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", + "startLine": 435, + "startColumn": 4, + "endLine": 435, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'AuroraInstance' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "message": "Resource 'InboundEndpoint' of type 'AWS::Route53Resolver::ResolverEndpoint' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "AuroraInstance", + "logicalId": "InboundEndpoint", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Route53Resolver::ResolverEndpoint" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 4, - "startColumn": 5, - "endLine": 4, + "startLine": 470, + "startColumn": 4, + "endLine": 470, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "gh-issues/issue-185.yaml": { - "filePath": "gh-issues/issue-185.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 2, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 0, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [] - }, - "gh-issues/issue-186-clb.json": { - "filePath": "gh-issues/issue-186-clb.json", + "cdk/rekognition-lambda-s3-trigger--RekognitionLambdaS3TriggerStack.template.json": { + "filePath": "cdk/rekognition-lambda-s3-trigger--RekognitionLambdaS3TriggerStack.template.json", "status": "OK", "metadata": { - "resourcesScanned": 1, + "resourcesScanned": 15, "counts": { "fatal": 0, "errors": 0, - "warnings": 0, - "informational": 2, + "warnings": 4, + "informational": 14, "debug": 0 }, "suppressed": 0, @@ -6335,2891 +5805,3344 @@ }, "diagnostics": [ { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Scheme' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W2531", + "severity": "WARN", + "message": "Runtime 'nodejs20.x' was deprecated on '2026-04-30'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'nodejs24.x'", + "source": "CFN_LINT", "entity": { - "logicalId": "CLBA83A883E", + "logicalId": "RekFunction9837D13D", "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancing::LoadBalancer" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.Scheme", - "category": "Best Practice", - "startLine": 15, + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 310, "startColumn": 5, - "endLine": 15, - "endColumn": 12, - "documentationUrl": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb.html", - "ruleDescription": "Create-only property updated triggers resource replacement", + "endLine": 310, + "endColumn": 13, + "ruleDescription": "Check if EOL Lambda Function Runtimes are used", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "actualValue": "nodejs20.x", + "lifecycle": "deprecated" } }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Subnets' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W3005", + "severity": "WARN", + "message": "'RekFunctionServiceRole3947AEF4' dependency already enforced by a 'GetAtt' at 'Properties.Role'", + "source": "CFN_LINT", "entity": { - "logicalId": "CLBA83A883E", + "logicalId": "RekFunction9837D13D", "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancing::LoadBalancer" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.Subnets", + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", "category": "Best Practice", - "startLine": 19, - "startColumn": 5, - "endLine": 19, - "endColumn": 13, - "documentationUrl": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } - } - ] - }, - "gh-issues/issue-186-imagebuilder.json": { - "filePath": "gh-issues/issue-186-imagebuilder.json", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 1, - "informational": 1, - "debug": 0 + "startLine": 312, + "startColumn": 4, + "endLine": 312, + "endColumn": 14, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "W3030", + "ruleId": "W3005", "severity": "WARN", - "message": "'Abort' is not one of ['CONTINUE', 'ABORT']", + "message": "'BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleB6FB88EC' dependency already enforced by a 'GetAtt' at 'Properties.Role'", "source": "CFN_LINT", "entity": { - "logicalId": "ImagePipeline7DDDE57F", + "logicalId": "BucketNotificationsHandler050a0587b7544547bf325f094a3db8347ECC3691", "entityType": "Resource", - "resourceType": "AWS::ImageBuilder::ImagePipeline" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.Workflows.0.OnFailure", - "category": "Schema", - "startLine": 31, - "startColumn": 7, - "endLine": 31, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-imagebuilder.git", - "ruleDescription": "Value not in allowed enum", - "phase": "SCHEMA", - "context": { - "actualValue": "Abort" - } + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 428, + "startColumn": 4, + "endLine": 428, + "endColumn": 14, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" + }, + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aServiceRole9741ECFB' dependency already enforced by a 'GetAtt' at 'Properties.Role'", + "source": "CFN_LINT", + "entity": { + "logicalId": "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aFD4BFC8A", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 516, + "startColumn": 4, + "endLine": 516, + "endColumn": 14, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Name' is create-only; updating it will cause resource replacement", + "message": "Property 'Action' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ImagePipeline7DDDE57F", + "logicalId": "BucketAllowBucketNotificationsToRekognitionLambdaS3TriggerStackRekFunction8330C87915B3782A", "entityType": "Resource", - "resourceType": "AWS::ImageBuilder::ImagePipeline" + "resourceType": "AWS::Lambda::Permission" }, - "propertyPath": "Properties.Name", + "propertyPath": "Properties.Action", "category": "Best Practice", - "startLine": 24, + "startLine": 103, "startColumn": 5, - "endLine": 24, - "endColumn": 10, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-imagebuilder.git", + "endLine": 103, + "endColumn": 12, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only" } - } - ] - }, - "gh-issues/issue-194.json": { - "filePath": "gh-issues/issue-194.json", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 0, - "informational": 0, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "E2001", - "severity": "ERROR", - "message": "Parameter 'SomeParameter': Default must be a string", - "source": "CFN_LINT", - "entity": { - "logicalId": "SomeParameter", - "entityType": "Parameter" - }, - "propertyPath": "Parameters/SomeParameter/Default", - "category": "Parameter", - "startLine": 5, - "startColumn": 4, - "endLine": 5, - "endColumn": 12, - "ruleDescription": "Parameters have appropriate properties", - "phase": "PARSE" - } - ] - }, - "gh-issues/issue-201.json": { - "filePath": "gh-issues/issue-201.json", - "status": "OK", - "metadata": { - "resourcesScanned": 0, - "counts": { - "fatal": 2, - "errors": 0, - "warnings": 1, - "informational": 0, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "F0001", - "severity": "FATAL", - "message": "Resources section must exist and be non-empty", - "source": "SCHEMA", - "category": "Structure", - "ruleDescription": "Resources section must exist and be non-empty", - "phase": "SCHEMA" }, { - "ruleId": "F2002", - "severity": "FATAL", - "message": "Parameter 'MyParam' has invalid Type 'Blimp'", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "MyParam", - "entityType": "Parameter" + "logicalId": "BucketAllowBucketNotificationsToRekognitionLambdaS3TriggerStackRekFunction8330C87915B3782A", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" }, - "propertyPath": "Parameters/MyParam/Type", - "category": "Parameter", - "startLine": 4, - "startColumn": 7, - "endLine": 4, - "endColumn": 12, - "ruleDescription": "Parameter Type must be valid", - "phase": "SCHEMA" + "propertyPath": "Properties.FunctionName", + "category": "Best Practice", + "startLine": 104, + "startColumn": 5, + "endLine": 104, + "endColumn": 18, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "GetAtt RekFunction9837D13D.Arn" + } }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'MyParam' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Principal' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "MyParam", - "entityType": "Parameter" + "logicalId": "BucketAllowBucketNotificationsToRekognitionLambdaS3TriggerStackRekFunction8330C87915B3782A", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" }, - "propertyPath": "Parameters/MyParam", + "propertyPath": "Properties.Principal", "category": "Best Practice", - "startLine": 3, + "startLine": 110, "startColumn": 5, - "endLine": 3, - "endColumn": 13, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" - } - ] - }, - "gh-issues/issue-226.yaml": { - "filePath": "gh-issues/issue-226.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 2, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 0, - "informational": 4, - "debug": 0 + "endLine": 110, + "endColumn": 15, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "E9002", - "severity": "ERROR", - "message": "FromPort 443 is greater than ToPort 80", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'SourceAccount' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "InvertedRangeSecurityGroup", + "logicalId": "BucketAllowBucketNotificationsToRekognitionLambdaS3TriggerStackRekFunction8330C87915B3782A", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::Lambda::Permission" }, - "propertyPath": "Properties.SecurityGroupIngress.0", - "suggestedFix": "Set FromPort to a value less than or equal to ToPort", - "category": "Resource", - "startLine": 26, - "startColumn": 17, - "endLine": 26, - "endColumn": 18, - "ruleDescription": "SecurityGroup FromPort must be <= ToPort for the TCP and UDP protocols", - "phase": "LINT", + "propertyPath": "Properties.SourceAccount", + "category": "Best Practice", + "startLine": 111, + "startColumn": 5, + "endLine": 111, + "endColumn": 19, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", "context": { - "actualValue": [ - { - "CidrIp": "10.0.0.0/8", - "IpProtocol": "tcp", - "FromPort": 443, - "ToPort": 80 - } - ] + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", + "message": "Property 'SourceArn' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "PingSecurityGroup", + "logicalId": "BucketAllowBucketNotificationsToRekognitionLambdaS3TriggerStackRekFunction8330C87915B3782A", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::Lambda::Permission" }, - "propertyPath": "Properties.GroupDescription", + "propertyPath": "Properties.SourceArn", "category": "Best Practice", - "startLine": 11, - "startColumn": 7, - "endLine": 11, - "endColumn": 23, + "startLine": 114, + "startColumn": 5, + "endLine": 114, + "endColumn": 15, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "GetAtt Bucket83908E77.Arn" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", + "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "InvertedRangeSecurityGroup", + "logicalId": "Classifications0C921F6C", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.GroupDescription", + "propertyPath": "Properties.KeySchema", "category": "Best Practice", - "startLine": 24, - "startColumn": 7, - "endLine": 24, - "endColumn": 23, + "startLine": 134, + "startColumn": 5, + "endLine": 134, + "endColumn": 15, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'PingSecurityGroup' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", + "message": "Resource 'Bucket83908E77' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "PingSecurityGroup", + "logicalId": "Bucket83908E77", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::S3::Bucket" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 10, - "startColumn": 5, - "endLine": 10, - "endColumn": 15, + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 18, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'InvertedRangeSecurityGroup' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", + "message": "Resource 'Classifications0C921F6C' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "InvertedRangeSecurityGroup", + "logicalId": "Classifications0C921F6C", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::DynamoDB::Table" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 23, - "startColumn": 5, - "endLine": 23, + "startLine": 127, + "startColumn": 4, + "endLine": 127, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" - } - ] - }, - "gh-issues/issue-235.yaml": { - "filePath": "gh-issues/issue-235.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 38, - "counts": { - "fatal": 2, - "errors": 0, - "warnings": 20, - "informational": 208, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "F3003", - "severity": "FATAL", - "message": "'StorageEncrypted' is a required property (from extension)", - "source": "SCHEMA", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'RekFunctionServiceRole3947AEF4' of type 'AWS::IAM::Role' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "KmsKeyWithoutEncryption", + "logicalId": "RekFunctionServiceRole3947AEF4", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties", - "suggestedFix": "Add 'StorageEncrypted'", - "category": "Schema", - "startLine": 37, - "startColumn": 5, - "endLine": 37, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 153, + "startColumn": 4, + "endLine": 153, "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Required property missing", - "phase": "SCHEMA" + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "F3012", - "severity": "FATAL", - "message": "'invalid' is not of type 'boolean'", - "source": "SCHEMA", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'RekFunction9837D13D' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "InvalidEncryptionValue", + "logicalId": "RekFunction9837D13D", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.StorageEncrypted", - "category": "Schema", - "startLine": 128, - "startColumn": 7, - "endLine": 128, - "endColumn": 23, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Property type mismatch", - "phase": "SCHEMA", - "context": { - "actualValue": "invalid", - "expectedConstraint": "boolean" - } + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 286, + "startColumn": 4, + "endLine": 286, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "W9002", - "severity": "WARN", - "message": "Property 'SourceDBInstanceAutomatedBackupsArn' has a hardcoded ARN - use Ref, GetAtt, or a parameter instead", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleB6FB88EC' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "AutomatedBackupRestore", + "logicalId": "BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleB6FB88EC", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.SourceDBInstanceAutomatedBackupsArn", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 191, - "startColumn": 7, - "endLine": 191, - "endColumn": 42, - "ruleDescription": "Hardcoded ARN property", + "startLine": 350, + "startColumn": 4, + "endLine": 350, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "W9003", - "severity": "WARN", - "message": "'false' is not of type 'boolean' - automatically coerced (string to boolean)", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'BucketNotificationsHandler050a0587b7544547bf325f094a3db8347ECC3691' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "StringFalseEncryption", + "logicalId": "BucketNotificationsHandler050a0587b7544547bf325f094a3db8347ECC3691", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.StorageEncrypted", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 51, - "startColumn": 7, - "endLine": 51, - "endColumn": 23, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Property type coercion warning", - "phase": "SCHEMA" + "startLine": 413, + "startColumn": 4, + "endLine": 413, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "W9003", - "severity": "WARN", - "message": "'false' is not of type 'boolean' - automatically coerced (string to boolean)", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aServiceRole9741ECFB' of type 'AWS::IAM::Role' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "CustomStringFalseEncryption", + "logicalId": "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aServiceRole9741ECFB", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.StorageEncrypted", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 92, - "startColumn": 7, - "endLine": 92, - "endColumn": 23, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Property type coercion warning", - "phase": "SCHEMA" + "startLine": 438, + "startColumn": 4, + "endLine": 438, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "W9003", - "severity": "WARN", - "message": "'true' is not of type 'boolean' - automatically coerced (string to boolean)", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aFD4BFC8A' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "StringTrueEncryption", + "logicalId": "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aFD4BFC8A", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.StorageEncrypted", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 104, - "startColumn": 7, - "endLine": 104, - "endColumn": 23, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Property type coercion warning", - "phase": "SCHEMA" + "startLine": 499, + "startColumn": 4, + "endLine": 499, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "cdk/resource-overrides--resource-overrides.template.json": { + "filePath": "cdk/resource-overrides--resource-overrides.template.json", + "status": "OK", + "metadata": { + "resourcesScanned": 21, + "counts": { + "fatal": 2, + "errors": 2, + "warnings": 4, + "informational": 31, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "W9003", - "severity": "WARN", - "message": "Parameter type 'String' may not be compatible with expected type 'boolean'", - "source": "CFN_LINT", + "ruleId": "F3002", + "severity": "FATAL", + "message": "Additional properties are not allowed ('Foo' was unexpected)", + "source": "SCHEMA", "entity": { - "logicalId": "DynamicEncryptionValue", + "logicalId": "ASGLaunchConfigC00AF12B", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::AutoScaling::LaunchConfiguration" }, - "propertyPath": "Properties.StorageEncrypted", - "category": "Best Practice", - "startLine": 116, - "startColumn": 7, - "endLine": 116, - "endColumn": 23, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Property type coercion warning", + "propertyPath": "Properties.Foo", + "category": "Schema", + "startLine": 418, + "startColumn": 5, + "endLine": 418, + "endColumn": 9, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", + "ruleDescription": "Additional properties are not allowed", "phase": "SCHEMA", "context": { - "resolutionSource": "parameter 'DynamicEncryption' (type String)" + "property": "Foo", + "extra": { + "allowed_properties": [ + "AssociatePublicIpAddress", + "BlockDeviceMappings", + "ClassicLinkVPCId", + "ClassicLinkVPCSecurityGroups", + "EbsOptimized", + "IamInstanceProfile", + "ImageId", + "InstanceId", + "InstanceMonitoring", + "InstanceType", + "KernelId", + "KeyName", + "LaunchConfigurationName", + "MetadataOptions", + "PlacementTenancy", + "RamDiskId", + "SecurityGroups", + "SpotPrice", + "UserData" + ] + } } }, { - "ruleId": "W9003", - "severity": "WARN", - "message": "Parameter type 'String' may not be compatible with expected type 'boolean'", - "source": "CFN_LINT", + "ruleId": "F3006", + "severity": "FATAL", + "message": "Unknown resource type 'AWS::S3::Bucketeer'", + "source": "SCHEMA", "entity": { - "logicalId": "DynamicReferenceEncryption", + "logicalId": "MyBucketF68F3FF0", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::S3::Bucketeer" }, - "propertyPath": "Properties.StorageEncrypted", - "category": "Best Practice", - "startLine": 122, - "startColumn": 7, - "endLine": 122, - "endColumn": 23, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Property type coercion warning", + "category": "Schema", + "startLine": 11, + "startColumn": 3, + "endLine": 11, + "endColumn": 20, + "ruleDescription": "AWS resource type must be recognized and available in the configured region", "phase": "SCHEMA", "context": { - "resolutionSource": "dynamic (dynamic reference: {{resolve:ssm:/rds/storage-encrypted}})" + "extra": { + "resource_type": "AWS::S3::Bucketeer" + } } }, { - "ruleId": "W9008", - "severity": "WARN", - "message": "RDS instance should have StorageEncrypted set to true", - "source": "ENGINE", + "ruleId": "E3001", + "severity": "ERROR", + "message": "Resource 'MyBucketF68F3FF0' has invalid property 'Transform'. Valid resource attributes: Type, Properties, DependsOn, Condition, Metadata, DeletionPolicy, UpdateReplacePolicy, UpdatePolicy, CreationPolicy, Fn::Transform, Version", + "source": "CFN_LINT", "entity": { - "logicalId": "MissingEncryption", + "logicalId": "MyBucketF68F3FF0", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::S3::Bucketeer" }, - "propertyPath": "Properties.StorageEncrypted", - "suggestedFix": "Set StorageEncrypted to true", - "category": "Security", - "startLine": 32, - "startColumn": 5, - "endLine": 32, - "endColumn": 15, - "ruleDescription": "RDS instance should have StorageEncrypted", - "phase": "LINT" + "category": "Resource", + "startLine": 78, + "startColumn": 4, + "endLine": 78, + "endColumn": 14, + "ruleDescription": "Basic CloudFormation Resource Check", + "phase": "PARSE" }, { - "ruleId": "W9008", - "severity": "WARN", - "message": "RDS instance should have StorageEncrypted set to true", - "source": "ENGINE", + "ruleId": "E3016", + "severity": "ERROR", + "message": "UpdatePolicy is not supported on resource type 'AWS::S3::Bucketeer'", + "source": "CFN_LINT", "entity": { - "logicalId": "KmsKeyWithoutEncryption", + "logicalId": "MyBucketF68F3FF0", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::S3::Bucketeer" }, - "propertyPath": "Properties.StorageEncrypted", - "suggestedFix": "Set StorageEncrypted to true", - "category": "Security", - "startLine": 37, - "startColumn": 5, - "endLine": 37, - "endColumn": 15, - "ruleDescription": "RDS instance should have StorageEncrypted", + "propertyPath": "UpdatePolicy", + "suggestedFix": "Remove UpdatePolicy or change resource type to one of: AWS::AppStream::Fleet, AWS::AutoScaling::AutoScalingGroup, AWS::ElastiCache::ReplicationGroup, AWS::Elasticsearch::Domain, AWS::Lambda::Alias, AWS::OpenSearchService::Domain", + "category": "Resource", + "startLine": 71, + "startColumn": 4, + "endLine": 71, + "endColumn": 17, + "ruleDescription": "Check UpdatePolicy values for Resources", "phase": "LINT" }, { - "ruleId": "W9008", + "ruleId": "W3005", "severity": "WARN", - "message": "RDS instance should have StorageEncrypted set to true", - "source": "ENGINE", + "message": "'Other34654A52' dependency already enforced by a 'GetAtt' at 'Properties.AnalyticsConfigurations.0.StorageClassAnalysis.DataExport.Destination.BucketArn'", + "source": "CFN_LINT", "entity": { - "logicalId": "FalseEncryption", + "logicalId": "MyBucketF68F3FF0", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::S3::Bucketeer" }, - "propertyPath": "Properties.StorageEncrypted", - "suggestedFix": "Set StorageEncrypted to true", - "category": "Security", - "startLine": 45, - "startColumn": 7, - "endLine": 45, - "endColumn": 23, - "ruleDescription": "RDS instance should have StorageEncrypted", + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 68, + "startColumn": 4, + "endLine": 68, + "endColumn": 14, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", "phase": "LINT" }, { - "ruleId": "W9008", + "ruleId": "W3005", "severity": "WARN", - "message": "RDS instance should have StorageEncrypted set to true", - "source": "ENGINE", + "message": "'Other34654A52' dependency already enforced by a 'GetAtt' at 'Properties.Token'", + "source": "CFN_LINT", "entity": { - "logicalId": "StringFalseEncryption", + "logicalId": "MyBucketF68F3FF0", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::S3::Bucketeer" }, - "propertyPath": "Properties.StorageEncrypted", - "suggestedFix": "Set StorageEncrypted to true", - "category": "Security", - "startLine": 51, - "startColumn": 7, - "endLine": 51, - "endColumn": 23, - "ruleDescription": "RDS instance should have StorageEncrypted", + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 68, + "startColumn": 4, + "endLine": 68, + "endColumn": 14, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", "phase": "LINT" }, { - "ruleId": "W9008", + "ruleId": "W3005", "severity": "WARN", - "message": "RDS instance should have StorageEncrypted set to true", - "source": "ENGINE", + "message": "'Other34654A52' dependency already enforced by a 'Ref' at 'Properties.LoggingConfiguration.DestinationBucketName'", + "source": "CFN_LINT", "entity": { - "logicalId": "ConditionalFalseEncryption", + "logicalId": "MyBucketF68F3FF0", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::S3::Bucketeer" }, - "propertyPath": "Properties.StorageEncrypted", - "suggestedFix": "Set StorageEncrypted to true", - "category": "Security", - "startLine": 57, - "startColumn": 7, - "endLine": 57, - "endColumn": 23, - "ruleDescription": "RDS instance should have StorageEncrypted", + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 68, + "startColumn": 4, + "endLine": 68, + "endColumn": 14, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", "phase": "LINT" }, { - "ruleId": "W9008", + "ruleId": "W3697", "severity": "WARN", - "message": "RDS instance should have StorageEncrypted set to true", - "source": "ENGINE", + "message": "Resource type 'AWS::AutoScaling::LaunchConfiguration' is from a service in maintenance mode since 2024-10-01. Consider migrating to an alternative", + "source": "CFN_LINT", "entity": { - "logicalId": "ConditionalNoValueEncryption", + "logicalId": "ASGLaunchConfigC00AF12B", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::AutoScaling::LaunchConfiguration" }, - "propertyPath": "Properties.StorageEncrypted", - "suggestedFix": "Set StorageEncrypted to true", - "category": "Security", - "startLine": 63, - "startColumn": 7, - "endLine": 63, - "endColumn": 23, - "ruleDescription": "RDS instance should have StorageEncrypted", - "phase": "LINT" + "category": "Deprecation", + "startLine": 397, + "startColumn": 3, + "endLine": 397, + "endColumn": 27, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", + "ruleDescription": "Resource type is from a service in maintenance mode", + "phase": "SCHEMA" }, { - "ruleId": "W9008", - "severity": "WARN", - "message": "RDS instance should have StorageEncrypted set to true", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "AllowedValuesEncryption", + "logicalId": "VPCB9E5F0B4", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::VPC" }, - "propertyPath": "Properties.StorageEncrypted", - "suggestedFix": "Set StorageEncrypted to true", - "category": "Security", - "startLine": 69, - "startColumn": 7, - "endLine": 69, - "endColumn": 23, - "ruleDescription": "RDS instance should have StorageEncrypted", - "phase": "LINT" + "propertyPath": "Properties.CidrBlock", + "category": "Best Practice", + "startLine": 83, + "startColumn": 5, + "endLine": 83, + "endColumn": 15, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W9008", - "severity": "WARN", - "message": "RDS instance should have StorageEncrypted set to true", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'InstanceTenancy' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "EngineAllowedValuesMissingEncryption", + "logicalId": "VPCB9E5F0B4", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::VPC" }, - "propertyPath": "Properties.StorageEncrypted", - "suggestedFix": "Set StorageEncrypted to true", - "category": "Security", - "startLine": 73, + "propertyPath": "Properties.InstanceTenancy", + "category": "Best Practice", + "startLine": 86, "startColumn": 5, - "endLine": 73, - "endColumn": 15, - "ruleDescription": "RDS instance should have StorageEncrypted", - "phase": "LINT" + "endLine": 86, + "endColumn": 21, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "W9008", - "severity": "WARN", - "message": "RDS instance should have StorageEncrypted set to true", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConditionalClusterOrStandalone", + "logicalId": "VPCPublicSubnet1SubnetB4246D30", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.StorageEncrypted", - "suggestedFix": "Set StorageEncrypted to true", - "category": "Security", - "startLine": 78, + "propertyPath": "Properties.AvailabilityZone", + "category": "Best Practice", + "startLine": 101, "startColumn": 5, - "endLine": 78, - "endColumn": 15, - "ruleDescription": "RDS instance should have StorageEncrypted", - "phase": "LINT" - }, - { - "ruleId": "W9008", - "severity": "WARN", - "message": "RDS instance should have StorageEncrypted set to true", - "source": "ENGINE", - "entity": { - "logicalId": "CustomFalseEncryption", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" - }, - "propertyPath": "Properties.StorageEncrypted", - "suggestedFix": "Set StorageEncrypted to true", - "category": "Security", - "startLine": 86, - "startColumn": 7, - "endLine": 86, - "endColumn": 23, - "ruleDescription": "RDS instance should have StorageEncrypted", - "phase": "LINT" + "endLine": 101, + "endColumn": 22, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W9008", - "severity": "WARN", - "message": "RDS instance should have StorageEncrypted set to true", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "CustomStringFalseEncryption", + "logicalId": "VPCPublicSubnet1SubnetB4246D30", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.StorageEncrypted", - "suggestedFix": "Set StorageEncrypted to true", - "category": "Security", - "startLine": 92, - "startColumn": 7, - "endLine": 92, - "endColumn": 23, - "ruleDescription": "RDS instance should have StorageEncrypted", - "phase": "LINT" + "propertyPath": "Properties.CidrBlock", + "category": "Best Practice", + "startLine": 109, + "startColumn": 5, + "endLine": 109, + "endColumn": 15, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W9008", - "severity": "WARN", - "message": "RDS instance should have StorageEncrypted set to true", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "EmptySnapshotIdentifier", + "logicalId": "VPCPublicSubnet1SubnetB4246D30", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.StorageEncrypted", - "suggestedFix": "Set StorageEncrypted to true", - "category": "Security", - "startLine": 159, + "propertyPath": "Properties.VpcId", + "category": "Best Practice", + "startLine": 125, "startColumn": 5, - "endLine": 159, - "endColumn": 15, - "ruleDescription": "RDS instance should have StorageEncrypted", - "phase": "LINT" + "endLine": 125, + "endColumn": 11, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'VPCB9E5F0B4'" + } }, { - "ruleId": "W9008", - "severity": "WARN", - "message": "RDS instance should have StorageEncrypted set to true", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "WholePropertiesFalseEncryption", + "logicalId": "VPCPublicSubnet1RouteTableFEE4B781", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::RouteTable" }, - "propertyPath": "Properties.StorageEncrypted", - "suggestedFix": "Set StorageEncrypted to true", - "category": "Security", - "startLine": 241, + "propertyPath": "Properties.VpcId", + "category": "Best Practice", + "startLine": 142, "startColumn": 5, - "endLine": 241, - "endColumn": 15, - "ruleDescription": "RDS instance should have StorageEncrypted", - "phase": "LINT" + "endLine": 142, + "endColumn": 11, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'VPCB9E5F0B4'" + } }, { - "ruleId": "W9013", - "severity": "WARN", - "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "AutomatedBackupRestore", + "logicalId": "VPCPublicSubnet1RouteTableAssociation0B0896DC", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::SubnetRouteTableAssociation" }, - "category": "Security", - "startLine": 187, - "startColumn": 3, - "endLine": 187, - "endColumn": 25, - "ruleDescription": "Hardcoded account ID in ARN", - "phase": "LINT" + "propertyPath": "Properties.RouteTableId", + "category": "Best Practice", + "startLine": 153, + "startColumn": 5, + "endLine": 153, + "endColumn": 18, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'VPCPublicSubnet1RouteTableFEE4B781'", + "extra": { + "replacement_strategy": "delete_then_create" + } + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Cluster", + "logicalId": "VPCPublicSubnet1RouteTableAssociation0B0896DC", "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" + "resourceType": "AWS::EC2::SubnetRouteTableAssociation" }, + "propertyPath": "Properties.SubnetId", "category": "Best Practice", - "startLine": 24, - "startColumn": 3, - "endLine": 24, - "endColumn": 10, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 156, + "startColumn": 5, + "endLine": 156, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'VPCPublicSubnet1SubnetB4246D30'", + "extra": { + "replacement_strategy": "delete_then_create" + } + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'DestinationCidrBlock' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Cluster", + "logicalId": "VPCPublicSubnet1DefaultRoute91CEF279", "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" + "resourceType": "AWS::EC2::Route" }, + "propertyPath": "Properties.DestinationCidrBlock", "category": "Best Practice", - "startLine": 24, - "startColumn": 3, - "endLine": 24, - "endColumn": 10, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 167, + "startColumn": 5, + "endLine": 167, + "endColumn": 26, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "MissingEncryption", + "logicalId": "VPCPublicSubnet1DefaultRoute91CEF279", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Route" }, + "propertyPath": "Properties.RouteTableId", "category": "Best Practice", - "startLine": 30, - "startColumn": 3, - "endLine": 30, - "endColumn": 20, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 171, + "startColumn": 5, + "endLine": 171, + "endColumn": 18, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'VPCPublicSubnet1RouteTableFEE4B781'" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'AllocationId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "MissingEncryption", + "logicalId": "VPCPublicSubnet1NATGatewayE0556630", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::NatGateway" }, + "propertyPath": "Properties.AllocationId", "category": "Best Practice", - "startLine": 30, - "startColumn": 3, - "endLine": 30, - "endColumn": 20, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 200, + "startColumn": 5, + "endLine": 200, + "endColumn": 18, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "GetAtt VPCPublicSubnet1EIP6AD938E8.AllocationId" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "KmsKeyWithoutEncryption", + "logicalId": "VPCPublicSubnet1NATGatewayE0556630", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::NatGateway" }, + "propertyPath": "Properties.SubnetId", "category": "Best Practice", - "startLine": 35, - "startColumn": 3, - "endLine": 35, - "endColumn": 26, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 206, + "startColumn": 5, + "endLine": 206, + "endColumn": 14, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'VPCPublicSubnet1SubnetB4246D30'" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "KmsKeyWithoutEncryption", + "logicalId": "VPCPrivateSubnet1Subnet8BCA10E0", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Subnet" }, + "propertyPath": "Properties.AvailabilityZone", "category": "Best Practice", - "startLine": 35, - "startColumn": 3, - "endLine": 35, - "endColumn": 26, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 227, + "startColumn": 5, + "endLine": 227, + "endColumn": 22, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "FalseEncryption", + "logicalId": "VPCPrivateSubnet1Subnet8BCA10E0", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Subnet" }, + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 41, - "startColumn": 3, - "endLine": 41, - "endColumn": 18, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 235, + "startColumn": 5, + "endLine": 235, + "endColumn": 15, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "FalseEncryption", + "logicalId": "VPCPrivateSubnet1Subnet8BCA10E0", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Subnet" }, + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 41, - "startColumn": 3, - "endLine": 41, - "endColumn": 18, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 251, + "startColumn": 5, + "endLine": 251, + "endColumn": 11, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'VPCB9E5F0B4'" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "StringFalseEncryption", + "logicalId": "VPCPrivateSubnet1RouteTableBE8A6027", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::RouteTable" }, + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 47, - "startColumn": 3, - "endLine": 47, - "endColumn": 24, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 268, + "startColumn": 5, + "endLine": 268, + "endColumn": 11, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'VPCB9E5F0B4'" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "StringFalseEncryption", + "logicalId": "VPCPrivateSubnet1RouteTableAssociation347902D1", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::SubnetRouteTableAssociation" }, + "propertyPath": "Properties.RouteTableId", "category": "Best Practice", - "startLine": 47, - "startColumn": 3, - "endLine": 47, - "endColumn": 24, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 279, + "startColumn": 5, + "endLine": 279, + "endColumn": 18, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'VPCPrivateSubnet1RouteTableBE8A6027'", + "extra": { + "replacement_strategy": "delete_then_create" + } + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ConditionalFalseEncryption", + "logicalId": "VPCPrivateSubnet1RouteTableAssociation347902D1", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::SubnetRouteTableAssociation" }, + "propertyPath": "Properties.SubnetId", "category": "Best Practice", - "startLine": 53, - "startColumn": 3, - "endLine": 53, - "endColumn": 29, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 282, + "startColumn": 5, + "endLine": 282, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'VPCPrivateSubnet1Subnet8BCA10E0'", + "extra": { + "replacement_strategy": "delete_then_create" + } + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'DestinationCidrBlock' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ConditionalFalseEncryption", + "logicalId": "VPCPrivateSubnet1DefaultRouteAE1D6490", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Route" }, + "propertyPath": "Properties.DestinationCidrBlock", "category": "Best Practice", - "startLine": 53, - "startColumn": 3, - "endLine": 53, - "endColumn": 29, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 293, + "startColumn": 5, + "endLine": 293, + "endColumn": 26, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ConditionalNoValueEncryption", + "logicalId": "VPCPrivateSubnet1DefaultRouteAE1D6490", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Route" }, + "propertyPath": "Properties.RouteTableId", "category": "Best Practice", - "startLine": 59, - "startColumn": 3, - "endLine": 59, - "endColumn": 31, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 297, + "startColumn": 5, + "endLine": 297, + "endColumn": 18, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'VPCPrivateSubnet1RouteTableBE8A6027'" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ConditionalNoValueEncryption", + "logicalId": "VPCVPCGW99B986DC", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::VPCGatewayAttachment" }, + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 59, - "startColumn": 3, - "endLine": 59, - "endColumn": 31, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 325, + "startColumn": 5, + "endLine": 325, + "endColumn": 11, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2-vpc-gateway-attachment.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'VPCB9E5F0B4'", + "extra": { + "replacement_strategy": "delete_then_create" + } + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "AllowedValuesEncryption", + "logicalId": "ASGInstanceSecurityGroup0525485D", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::SecurityGroup" }, + "propertyPath": "Properties.GroupDescription", "category": "Best Practice", - "startLine": 65, - "startColumn": 3, - "endLine": 65, - "endColumn": 26, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 336, + "startColumn": 5, + "endLine": 336, + "endColumn": 22, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "AllowedValuesEncryption", + "logicalId": "ASGInstanceSecurityGroup0525485D", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::SecurityGroup" }, + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 65, - "startColumn": 3, - "endLine": 65, - "endColumn": 26, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 350, + "startColumn": 5, + "endLine": 350, + "endColumn": 11, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'VPCB9E5F0B4'" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'IamInstanceProfile' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "EngineAllowedValuesMissingEncryption", + "logicalId": "ASGLaunchConfigC00AF12B", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::AutoScaling::LaunchConfiguration" }, + "propertyPath": "Properties.IamInstanceProfile", "category": "Best Practice", - "startLine": 71, - "startColumn": 3, - "endLine": 71, - "endColumn": 39, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 400, + "startColumn": 5, + "endLine": 400, + "endColumn": 24, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'ASGInstanceProfile0A2834D7'" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "EngineAllowedValuesMissingEncryption", + "logicalId": "ASGLaunchConfigC00AF12B", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::AutoScaling::LaunchConfiguration" }, + "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 71, - "startColumn": 3, - "endLine": 71, - "endColumn": 39, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 403, + "startColumn": 5, + "endLine": 403, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'InstanceType' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ConditionalClusterOrStandalone", + "logicalId": "ASGLaunchConfigC00AF12B", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::AutoScaling::LaunchConfiguration" }, + "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 76, - "startColumn": 3, - "endLine": 76, - "endColumn": 33, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 406, + "startColumn": 5, + "endLine": 406, + "endColumn": 18, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'SecurityGroups' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ConditionalClusterOrStandalone", + "logicalId": "ASGLaunchConfigC00AF12B", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::AutoScaling::LaunchConfiguration" }, + "propertyPath": "Properties.SecurityGroups", "category": "Best Practice", - "startLine": 76, - "startColumn": 3, - "endLine": 76, - "endColumn": 33, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 407, + "startColumn": 5, + "endLine": 407, + "endColumn": 20, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'UserData' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "CustomFalseEncryption", + "logicalId": "ASGLaunchConfigC00AF12B", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::AutoScaling::LaunchConfiguration" }, + "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 82, - "startColumn": 3, - "endLine": 82, - "endColumn": 24, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 415, + "startColumn": 5, + "endLine": 415, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'LaunchConfigurationName' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "CustomFalseEncryption", + "logicalId": "ASG46ED3070", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::AutoScaling::AutoScalingGroup" }, + "propertyPath": "Properties.LaunchConfigurationName", "category": "Best Practice", - "startLine": 82, - "startColumn": 3, - "endLine": 82, - "endColumn": 24, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "CustomStringFalseEncryption", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" - }, - "category": "Best Practice", - "startLine": 88, - "startColumn": 3, - "endLine": 88, - "endColumn": 30, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 432, + "startColumn": 5, + "endLine": 432, + "endColumn": 29, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only", + "resolutionSource": "Ref to 'ASGLaunchConfigC00AF12B'" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'VPCZoneIdentifier' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "CustomStringFalseEncryption", + "logicalId": "ASG46ED3070", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::AutoScaling::AutoScalingGroup" }, + "propertyPath": "Properties.VPCZoneIdentifier", "category": "Best Practice", - "startLine": 88, - "startColumn": 3, - "endLine": 88, - "endColumn": 30, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 444, + "startColumn": 5, + "endLine": 444, + "endColumn": 23, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9040", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Resource 'Other34654A52' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "TrueEncryption", + "logicalId": "Other34654A52", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::S3::Bucket" }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 94, + "startLine": 3, "startColumn": 3, - "endLine": 94, + "endLine": 3, "endColumn": 17, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "cdk/route53-resolver-dns-firewall--Route53ResolverDnsFirewallStack.template.json": { + "filePath": "cdk/route53-resolver-dns-firewall--Route53ResolverDnsFirewallStack.template.json", + "status": "OK", + "metadata": { + "resourcesScanned": 31, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 55, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "TrueEncryption", + "logicalId": "Vpc8378EB38", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::VPC" }, + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 94, - "startColumn": 3, - "endLine": 94, - "endColumn": 17, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 6, + "startColumn": 5, + "endLine": 6, + "endColumn": 15, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'InstanceTenancy' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "StringTrueEncryption", + "logicalId": "Vpc8378EB38", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::VPC" }, + "propertyPath": "Properties.InstanceTenancy", "category": "Best Practice", - "startLine": 100, - "startColumn": 3, - "endLine": 100, - "endColumn": 23, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 9, + "startColumn": 5, + "endLine": 9, + "endColumn": 21, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "StringTrueEncryption", + "logicalId": "VpcPublicSubnet1Subnet5C2D37C4", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Subnet" }, + "propertyPath": "Properties.AvailabilityZone", "category": "Best Practice", - "startLine": 100, - "startColumn": 3, - "endLine": 100, - "endColumn": 23, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 24, + "startColumn": 5, + "endLine": 24, + "endColumn": 22, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ConditionalTrueEncryption", + "logicalId": "VpcPublicSubnet1Subnet5C2D37C4", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Subnet" }, + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 106, - "startColumn": 3, - "endLine": 106, - "endColumn": 28, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 32, + "startColumn": 5, + "endLine": 32, + "endColumn": 15, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ConditionalTrueEncryption", + "logicalId": "VpcPublicSubnet1Subnet5C2D37C4", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Subnet" }, + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 106, - "startColumn": 3, - "endLine": 106, - "endColumn": 28, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 48, + "startColumn": 5, + "endLine": 48, + "endColumn": 11, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'Vpc8378EB38'" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "DynamicEncryptionValue", + "logicalId": "VpcPublicSubnet1RouteTable6C95E38E", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::RouteTable" }, + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 112, - "startColumn": 3, - "endLine": 112, - "endColumn": 25, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 65, + "startColumn": 5, + "endLine": 65, + "endColumn": 11, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'Vpc8378EB38'" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "DynamicEncryptionValue", + "logicalId": "VpcPublicSubnet1RouteTableAssociation97140677", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::SubnetRouteTableAssociation" }, + "propertyPath": "Properties.RouteTableId", "category": "Best Practice", - "startLine": 112, - "startColumn": 3, - "endLine": 112, - "endColumn": 25, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 76, + "startColumn": 5, + "endLine": 76, + "endColumn": 18, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'VpcPublicSubnet1RouteTable6C95E38E'", + "extra": { + "replacement_strategy": "delete_then_create" + } + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "DynamicReferenceEncryption", + "logicalId": "VpcPublicSubnet1RouteTableAssociation97140677", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::SubnetRouteTableAssociation" }, + "propertyPath": "Properties.SubnetId", "category": "Best Practice", - "startLine": 118, - "startColumn": 3, - "endLine": 118, - "endColumn": 29, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 79, + "startColumn": 5, + "endLine": 79, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'VpcPublicSubnet1Subnet5C2D37C4'", + "extra": { + "replacement_strategy": "delete_then_create" + } + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'DestinationCidrBlock' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "DynamicReferenceEncryption", + "logicalId": "VpcPublicSubnet1DefaultRoute3DA9E72A", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Route" }, + "propertyPath": "Properties.DestinationCidrBlock", "category": "Best Practice", - "startLine": 118, - "startColumn": 3, - "endLine": 118, - "endColumn": 29, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 90, + "startColumn": 5, + "endLine": 90, + "endColumn": 26, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "InvalidEncryptionValue", + "logicalId": "VpcPublicSubnet1DefaultRoute3DA9E72A", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Route" }, + "propertyPath": "Properties.RouteTableId", "category": "Best Practice", - "startLine": 124, - "startColumn": 3, - "endLine": 124, - "endColumn": 25, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 94, + "startColumn": 5, + "endLine": 94, + "endColumn": 18, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'VpcPublicSubnet1RouteTable6C95E38E'" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'AllocationId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "InvalidEncryptionValue", + "logicalId": "VpcPublicSubnet1NATGateway4D7517AA", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::NatGateway" }, + "propertyPath": "Properties.AllocationId", "category": "Best Practice", - "startLine": 124, - "startColumn": 3, - "endLine": 124, - "endColumn": 25, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 123, + "startColumn": 5, + "endLine": 123, + "endColumn": 18, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "GetAtt VpcPublicSubnet1EIPD7E02669.AllocationId" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "DynamicEngineValue", + "logicalId": "VpcPublicSubnet1NATGateway4D7517AA", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::NatGateway" }, + "propertyPath": "Properties.SubnetId", "category": "Best Practice", - "startLine": 130, - "startColumn": 3, - "endLine": 130, - "endColumn": 21, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 129, + "startColumn": 5, + "endLine": 129, + "endColumn": 14, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'VpcPublicSubnet1Subnet5C2D37C4'" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "DynamicEngineValue", + "logicalId": "VpcPublicSubnet2Subnet691E08A3", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Subnet" }, + "propertyPath": "Properties.AvailabilityZone", "category": "Best Practice", - "startLine": 130, - "startColumn": 3, - "endLine": 130, - "endColumn": 21, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 150, + "startColumn": 5, + "endLine": 150, + "endColumn": 22, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "AuroraEngine", + "logicalId": "VpcPublicSubnet2Subnet691E08A3", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Subnet" }, + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 135, - "startColumn": 3, - "endLine": 135, + "startLine": 158, + "startColumn": 5, + "endLine": 158, "endColumn": 15, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "AuroraEngine", + "logicalId": "VpcPublicSubnet2Subnet691E08A3", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Subnet" }, + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 135, - "startColumn": 3, - "endLine": 135, - "endColumn": 15, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 174, + "startColumn": 5, + "endLine": 174, + "endColumn": 11, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'Vpc8378EB38'" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "AuroraAllowedValues", + "logicalId": "VpcPublicSubnet2RouteTable94F7E489", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::RouteTable" }, + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 140, - "startColumn": 3, - "endLine": 140, - "endColumn": 22, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "AuroraAllowedValues", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" - }, - "category": "Best Practice", - "startLine": 140, - "startColumn": 3, - "endLine": 140, - "endColumn": 22, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 191, + "startColumn": 5, + "endLine": 191, + "endColumn": 11, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'Vpc8378EB38'" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ClusterMember", + "logicalId": "VpcPublicSubnet2RouteTableAssociationDD5762D8", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::SubnetRouteTableAssociation" }, + "propertyPath": "Properties.RouteTableId", "category": "Best Practice", - "startLine": 145, - "startColumn": 3, - "endLine": 145, - "endColumn": 16, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 202, + "startColumn": 5, + "endLine": 202, + "endColumn": 18, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'VpcPublicSubnet2RouteTable94F7E489'", + "extra": { + "replacement_strategy": "delete_then_create" + } + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ClusterMember", + "logicalId": "VpcPublicSubnet2RouteTableAssociationDD5762D8", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::SubnetRouteTableAssociation" }, + "propertyPath": "Properties.SubnetId", "category": "Best Practice", - "startLine": 145, - "startColumn": 3, - "endLine": 145, - "endColumn": 16, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 205, + "startColumn": 5, + "endLine": 205, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'VpcPublicSubnet2Subnet691E08A3'", + "extra": { + "replacement_strategy": "delete_then_create" + } + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'DestinationCidrBlock' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "SnapshotRestore", + "logicalId": "VpcPublicSubnet2DefaultRoute97F91067", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Route" }, + "propertyPath": "Properties.DestinationCidrBlock", "category": "Best Practice", - "startLine": 151, - "startColumn": 3, - "endLine": 151, - "endColumn": 18, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 216, + "startColumn": 5, + "endLine": 216, + "endColumn": 26, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "SnapshotRestore", + "logicalId": "VpcPublicSubnet2DefaultRoute97F91067", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Route" }, + "propertyPath": "Properties.RouteTableId", "category": "Best Practice", - "startLine": 151, - "startColumn": 3, - "endLine": 151, + "startLine": 220, + "startColumn": 5, + "endLine": 220, "endColumn": 18, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'VpcPublicSubnet2RouteTable94F7E489'" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'AllocationId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "EmptySnapshotIdentifier", + "logicalId": "VpcPublicSubnet2NATGateway9182C01D", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::NatGateway" }, + "propertyPath": "Properties.AllocationId", "category": "Best Practice", - "startLine": 157, - "startColumn": 3, - "endLine": 157, - "endColumn": 26, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 249, + "startColumn": 5, + "endLine": 249, + "endColumn": 18, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "GetAtt VpcPublicSubnet2EIP3C605A87.AllocationId" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "EmptySnapshotIdentifier", + "logicalId": "VpcPublicSubnet2NATGateway9182C01D", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::NatGateway" }, + "propertyPath": "Properties.SubnetId", "category": "Best Practice", - "startLine": 157, - "startColumn": 3, - "endLine": 157, - "endColumn": 26, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 255, + "startColumn": 5, + "endLine": 255, + "endColumn": 14, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'VpcPublicSubnet2Subnet691E08A3'" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ClusterSnapshotRestore", + "logicalId": "VpcPrivateSubnet1Subnet536B997A", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Subnet" }, + "propertyPath": "Properties.AvailabilityZone", "category": "Best Practice", - "startLine": 163, - "startColumn": 3, - "endLine": 163, - "endColumn": 25, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 276, + "startColumn": 5, + "endLine": 276, + "endColumn": 22, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ClusterSnapshotRestore", + "logicalId": "VpcPrivateSubnet1Subnet536B997A", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Subnet" }, + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 163, - "startColumn": 3, - "endLine": 163, - "endColumn": 25, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 284, + "startColumn": 5, + "endLine": 284, + "endColumn": 15, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "EncryptedSource", + "logicalId": "VpcPrivateSubnet1Subnet536B997A", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Subnet" }, + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 169, - "startColumn": 3, - "endLine": 169, - "endColumn": 18, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 300, + "startColumn": 5, + "endLine": 300, + "endColumn": 11, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'Vpc8378EB38'" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "EncryptedSource", + "logicalId": "VpcPrivateSubnet1RouteTableB2C5B500", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::RouteTable" }, + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 169, - "startColumn": 3, - "endLine": 169, - "endColumn": 18, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 317, + "startColumn": 5, + "endLine": 317, + "endColumn": 11, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'Vpc8378EB38'" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "SourceInstanceReplica", + "logicalId": "VpcPrivateSubnet1RouteTableAssociation70C59FA6", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::SubnetRouteTableAssociation" }, + "propertyPath": "Properties.RouteTableId", "category": "Best Practice", - "startLine": 175, - "startColumn": 3, - "endLine": 175, - "endColumn": 24, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 328, + "startColumn": 5, + "endLine": 328, + "endColumn": 18, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'VpcPrivateSubnet1RouteTableB2C5B500'", + "extra": { + "replacement_strategy": "delete_then_create" + } + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "SourceInstanceReplica", + "logicalId": "VpcPrivateSubnet1RouteTableAssociation70C59FA6", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::SubnetRouteTableAssociation" }, + "propertyPath": "Properties.SubnetId", "category": "Best Practice", - "startLine": 175, - "startColumn": 3, - "endLine": 175, - "endColumn": 24, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 331, + "startColumn": 5, + "endLine": 331, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'VpcPrivateSubnet1Subnet536B997A'", + "extra": { + "replacement_strategy": "delete_then_create" + } + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'DestinationCidrBlock' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "SourceResourceRestore", + "logicalId": "VpcPrivateSubnet1DefaultRouteBE02A9ED", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Route" }, + "propertyPath": "Properties.DestinationCidrBlock", "category": "Best Practice", - "startLine": 181, - "startColumn": 3, - "endLine": 181, - "endColumn": 24, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 342, + "startColumn": 5, + "endLine": 342, + "endColumn": 26, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "SourceResourceRestore", + "logicalId": "VpcPrivateSubnet1DefaultRouteBE02A9ED", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Route" }, + "propertyPath": "Properties.RouteTableId", "category": "Best Practice", - "startLine": 181, - "startColumn": 3, - "endLine": 181, - "endColumn": 24, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 346, + "startColumn": 5, + "endLine": 346, + "endColumn": 18, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'VpcPrivateSubnet1RouteTableB2C5B500'" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "AutomatedBackupRestore", + "logicalId": "VpcPrivateSubnet2Subnet3788AAA1", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Subnet" }, + "propertyPath": "Properties.AvailabilityZone", "category": "Best Practice", - "startLine": 187, - "startColumn": 3, - "endLine": 187, - "endColumn": 25, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 357, + "startColumn": 5, + "endLine": 357, + "endColumn": 22, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "AutomatedBackupRestore", + "logicalId": "VpcPrivateSubnet2Subnet3788AAA1", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Subnet" }, + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 187, - "startColumn": 3, - "endLine": 187, - "endColumn": 25, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 365, + "startColumn": 5, + "endLine": 365, + "endColumn": 15, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "SourceClusterReplica", + "logicalId": "VpcPrivateSubnet2Subnet3788AAA1", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Subnet" }, + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 193, - "startColumn": 3, - "endLine": 193, - "endColumn": 23, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 381, + "startColumn": 5, + "endLine": 381, + "endColumn": 11, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'Vpc8378EB38'" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "SourceClusterReplica", + "logicalId": "VpcPrivateSubnet2RouteTableA678073B", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::RouteTable" }, + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 193, - "startColumn": 3, - "endLine": 193, - "endColumn": 23, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 398, + "startColumn": 5, + "endLine": 398, + "endColumn": 11, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'Vpc8378EB38'" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "CustomImplicitEncryption", + "logicalId": "VpcPrivateSubnet2RouteTableAssociationA89CAD56", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::SubnetRouteTableAssociation" }, + "propertyPath": "Properties.RouteTableId", "category": "Best Practice", - "startLine": 199, - "startColumn": 3, - "endLine": 199, - "endColumn": 27, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 409, + "startColumn": 5, + "endLine": 409, + "endColumn": 18, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'VpcPrivateSubnet2RouteTableA678073B'", + "extra": { + "replacement_strategy": "delete_then_create" + } + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "CustomImplicitEncryption", + "logicalId": "VpcPrivateSubnet2RouteTableAssociationA89CAD56", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::SubnetRouteTableAssociation" }, + "propertyPath": "Properties.SubnetId", "category": "Best Practice", - "startLine": 199, - "startColumn": 3, - "endLine": 199, - "endColumn": 27, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 412, + "startColumn": 5, + "endLine": 412, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'VpcPrivateSubnet2Subnet3788AAA1'", + "extra": { + "replacement_strategy": "delete_then_create" + } + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'DestinationCidrBlock' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "CustomTrueEncryption", + "logicalId": "VpcPrivateSubnet2DefaultRoute060D2087", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Route" }, + "propertyPath": "Properties.DestinationCidrBlock", "category": "Best Practice", - "startLine": 204, - "startColumn": 3, - "endLine": 204, - "endColumn": 23, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 423, + "startColumn": 5, + "endLine": 423, + "endColumn": 26, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "CustomTrueEncryption", + "logicalId": "VpcPrivateSubnet2DefaultRoute060D2087", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Route" }, + "propertyPath": "Properties.RouteTableId", "category": "Best Practice", - "startLine": 204, - "startColumn": 3, - "endLine": 204, - "endColumn": 23, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 427, + "startColumn": 5, + "endLine": 427, + "endColumn": 18, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'VpcPrivateSubnet2RouteTableA678073B'" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "LegacySecurityGroups", + "logicalId": "VpcVPCGWBF912B6E", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::VPCGatewayAttachment" }, + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 210, - "startColumn": 3, - "endLine": 210, - "endColumn": 23, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 455, + "startColumn": 5, + "endLine": 455, + "endColumn": 11, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2-vpc-gateway-attachment.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'Vpc8378EB38'", + "extra": { + "replacement_strategy": "delete_then_create" + } + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'LogGroupName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "LegacySecurityGroups", + "logicalId": "DNSFirewallLogGroupF0EEB7D4", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Logs::LogGroup" }, + "propertyPath": "Properties.LogGroupName", "category": "Best Practice", - "startLine": 210, - "startColumn": 3, - "endLine": 210, - "endColumn": 23, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 466, + "startColumn": 5, + "endLine": 466, + "endColumn": 18, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-logs.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'DestinationArn' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "CorrelatedClusterOrEncryptedStandalone", + "logicalId": "DNSLogsConfig", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Route53Resolver::ResolverQueryLoggingConfig" }, + "propertyPath": "Properties.DestinationArn", "category": "Best Practice", - "startLine": 216, - "startColumn": 3, - "endLine": 216, - "endColumn": 41, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 478, + "startColumn": 5, + "endLine": 478, + "endColumn": 20, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "GetAtt DNSFirewallLogGroupF0EEB7D4.Arn" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'Name' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "CorrelatedClusterOrEncryptedStandalone", + "logicalId": "DNSLogsConfig", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Route53Resolver::ResolverQueryLoggingConfig" }, + "propertyPath": "Properties.Name", "category": "Best Practice", - "startLine": 216, - "startColumn": 3, - "endLine": 216, - "endColumn": 41, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 484, + "startColumn": 5, + "endLine": 484, + "endColumn": 10, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'ResolverQueryLogConfigId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ConditionalSnapshotOrEncryptedStandalone", + "logicalId": "DNSLogAssoc", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Route53Resolver::ResolverQueryLoggingConfigAssociation" }, + "propertyPath": "Properties.ResolverQueryLogConfigId", "category": "Best Practice", - "startLine": 223, - "startColumn": 3, - "endLine": 223, - "endColumn": 43, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 493, + "startColumn": 5, + "endLine": 493, + "endColumn": 30, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'DNSLogsConfig'" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'ResourceId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ConditionalSnapshotOrEncryptedStandalone", + "logicalId": "DNSLogAssoc", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Route53Resolver::ResolverQueryLoggingConfigAssociation" }, + "propertyPath": "Properties.ResourceId", "category": "Best Practice", - "startLine": 223, - "startColumn": 3, - "endLine": 223, - "endColumn": 43, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 496, + "startColumn": 5, + "endLine": 496, + "endColumn": 16, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'Vpc8378EB38'" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'Name' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "WholePropertiesCorrelated", + "logicalId": "AllowedDomainList", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Route53Resolver::FirewallDomainList" }, + "propertyPath": "Properties.Name", "category": "Best Practice", - "startLine": 230, - "startColumn": 3, - "endLine": 230, - "endColumn": 28, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 510, + "startColumn": 5, + "endLine": 510, + "endColumn": 10, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'Name' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "WholePropertiesCorrelated", + "logicalId": "BlockedDomainList", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Route53Resolver::FirewallDomainList" }, + "propertyPath": "Properties.Name", "category": "Best Practice", - "startLine": 230, - "startColumn": 3, - "endLine": 230, - "endColumn": 28, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 523, + "startColumn": 5, + "endLine": 523, + "endColumn": 10, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'Name' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "WholePropertiesFalseEncryption", + "logicalId": "DNSRuleGroup", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Route53Resolver::FirewallRuleGroup" }, + "propertyPath": "Properties.Name", "category": "Best Practice", - "startLine": 239, - "startColumn": 3, - "endLine": 239, - "endColumn": 33, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 549, + "startColumn": 5, + "endLine": 549, + "endColumn": 10, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'FirewallRuleGroupId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "WholePropertiesFalseEncryption", + "logicalId": "FirewallRuleGroupAssociation", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Route53Resolver::FirewallRuleGroupAssociation" }, + "propertyPath": "Properties.FirewallRuleGroupId", "category": "Best Practice", - "startLine": 239, - "startColumn": 3, - "endLine": 239, - "endColumn": 33, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 558, + "startColumn": 5, + "endLine": 558, + "endColumn": 25, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'DNSRuleGroup'" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "DynamicProperties", + "logicalId": "FirewallRuleGroupAssociation", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Route53Resolver::FirewallRuleGroupAssociation" }, + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 248, - "startColumn": 3, - "endLine": 248, - "endColumn": 20, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 563, + "startColumn": 5, + "endLine": 563, + "endColumn": 11, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'Vpc8378EB38'" + } }, { - "ruleId": "I3011", + "ruleId": "I9040", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Resource 'DNSFirewallLogGroupF0EEB7D4' of type 'AWS::Logs::LogGroup' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "DynamicProperties", + "logicalId": "DNSFirewallLogGroupF0EEB7D4", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Logs::LogGroup" }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 248, - "startColumn": 3, - "endLine": 248, - "endColumn": 20, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "startLine": 465, + "startColumn": 4, + "endLine": 465, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "I3013", + "ruleId": "I9040", "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", + "message": "Resource 'DNSLogsConfig' of type 'AWS::Route53Resolver::ResolverQueryLoggingConfig' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Cluster", + "logicalId": "DNSLogsConfig", "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" + "resourceType": "AWS::Route53Resolver::ResolverQueryLoggingConfig" }, - "propertyPath": "Properties", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 26, - "startColumn": 5, - "endLine": 26, + "startLine": 477, + "startColumn": 4, + "endLine": 477, "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "I3013", + "ruleId": "I9040", "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", + "message": "Resource 'AllowedDomainList' of type 'AWS::Route53Resolver::FirewallDomainList' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "MissingEncryption", + "logicalId": "AllowedDomainList", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Route53Resolver::FirewallDomainList" }, - "propertyPath": "Properties", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 32, - "startColumn": 5, - "endLine": 32, + "startLine": 506, + "startColumn": 4, + "endLine": 506, "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "I3013", + "ruleId": "I9040", "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", + "message": "Resource 'BlockedDomainList' of type 'AWS::Route53Resolver::FirewallDomainList' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "KmsKeyWithoutEncryption", + "logicalId": "BlockedDomainList", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Route53Resolver::FirewallDomainList" }, - "propertyPath": "Properties", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 37, - "startColumn": 5, - "endLine": 37, + "startLine": 518, + "startColumn": 4, + "endLine": 518, "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "I3013", + "ruleId": "I9040", "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", + "message": "Resource 'DNSRuleGroup' of type 'AWS::Route53Resolver::FirewallRuleGroup' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "FalseEncryption", + "logicalId": "DNSRuleGroup", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Route53Resolver::FirewallRuleGroup" }, - "propertyPath": "Properties", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 43, - "startColumn": 5, - "endLine": 43, + "startLine": 531, + "startColumn": 4, + "endLine": 531, "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "I3013", + "ruleId": "I9040", "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", + "message": "Resource 'FirewallRuleGroupAssociation' of type 'AWS::Route53Resolver::FirewallRuleGroupAssociation' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "StringFalseEncryption", + "logicalId": "FirewallRuleGroupAssociation", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Route53Resolver::FirewallRuleGroupAssociation" }, - "propertyPath": "Properties", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 49, - "startColumn": 5, - "endLine": 49, + "startLine": 557, + "startColumn": 4, + "endLine": 557, "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "cdk/s3-object-lambda--S3ObjectLambdaStack.template.json": { + "filePath": "cdk/s3-object-lambda--S3ObjectLambdaStack.template.json", + "status": "OK", + "metadata": { + "resourcesScanned": 9, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 3, + "informational": 12, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I3013", - "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "ruleId": "W2531", + "severity": "WARN", + "message": "Runtime 'nodejs20.x' was deprecated on '2026-04-30'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'nodejs24.x'", "source": "CFN_LINT", "entity": { - "logicalId": "ConditionalFalseEncryption", + "logicalId": "retrieveTransformedObjectLambdaD5D6532C", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties", - "category": "Best Practice", - "startLine": 55, + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 155, "startColumn": 5, - "endLine": 55, - "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", - "phase": "LINT" + "endLine": 155, + "endColumn": 13, + "ruleDescription": "Check if EOL Lambda Function Runtimes are used", + "phase": "SCHEMA", + "context": { + "actualValue": "nodejs20.x", + "lifecycle": "deprecated" + } }, { - "ruleId": "I3013", - "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "ruleId": "W3005", + "severity": "WARN", + "message": "'retrieveTransformedObjectLambdaServiceRole27FF342E' dependency already enforced by a 'GetAtt' at 'Properties.Role'", "source": "CFN_LINT", "entity": { - "logicalId": "ConditionalNoValueEncryption", + "logicalId": "retrieveTransformedObjectLambdaD5D6532C", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties", + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", "category": "Best Practice", - "startLine": 61, - "startColumn": 5, - "endLine": 61, - "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "startLine": 157, + "startColumn": 4, + "endLine": 157, + "endColumn": 14, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", "phase": "LINT" }, { - "ruleId": "I3013", - "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "ruleId": "W3045", + "severity": "WARN", + "message": "AccessControl property is deprecated. Use bucket policies instead", "source": "CFN_LINT", "entity": { - "logicalId": "AllowedValuesEncryption", + "logicalId": "examplebucketC9DFA43E", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties", - "category": "Best Practice", - "startLine": 67, + "propertyPath": "Properties.AccessControl", + "suggestedFix": "Remove AccessControl and use an AWS::S3::BucketPolicy resource", + "category": "Deprecation", + "startLine": 6, "startColumn": 5, - "endLine": 67, - "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", - "phase": "LINT" + "endLine": 6, + "endColumn": 19, + "ruleDescription": "Controlling access to an S3 bucket should be done with bucket policies", + "phase": "LINT", + "context": { + "actualValue": "BucketOwnerFullControl" + } }, { - "ruleId": "I3013", + "ruleId": "I9001", "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", + "message": "Property 'Bucket' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ConditionalClusterOrStandalone", + "logicalId": "examplebucketPolicyE09B485E", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::S3::BucketPolicy" }, - "propertyPath": "Properties", + "propertyPath": "Properties.Bucket", "category": "Best Practice", - "startLine": 78, + "startLine": 32, "startColumn": 5, - "endLine": 78, - "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", - "phase": "LINT" + "endLine": 32, + "endColumn": 12, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'examplebucketC9DFA43E'" + } }, { - "ruleId": "I3013", + "ruleId": "I9001", "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", + "message": "Property 'Action' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "CustomFalseEncryption", + "logicalId": "retrieveTransformedObjectLambdainvocationRestrictionD58B0218", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Permission" }, - "propertyPath": "Properties", + "propertyPath": "Properties.Action", "category": "Best Practice", - "startLine": 84, + "startLine": 171, "startColumn": 5, - "endLine": 84, - "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", - "phase": "LINT" + "endLine": 171, + "endColumn": 12, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3013", + "ruleId": "I9001", "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "CustomStringFalseEncryption", + "logicalId": "retrieveTransformedObjectLambdainvocationRestrictionD58B0218", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Permission" }, - "propertyPath": "Properties", + "propertyPath": "Properties.FunctionName", "category": "Best Practice", - "startLine": 90, + "startLine": 172, "startColumn": 5, - "endLine": 90, - "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", - "phase": "LINT" + "endLine": 172, + "endColumn": 18, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "GetAtt retrieveTransformedObjectLambdaD5D6532C.Arn" + } }, { - "ruleId": "I3013", + "ruleId": "I9001", "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", + "message": "Property 'Principal' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "TrueEncryption", + "logicalId": "retrieveTransformedObjectLambdainvocationRestrictionD58B0218", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Permission" }, - "propertyPath": "Properties", + "propertyPath": "Properties.Principal", "category": "Best Practice", - "startLine": 96, + "startLine": 178, "startColumn": 5, - "endLine": 96, + "endLine": 178, "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", - "phase": "LINT" + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3013", + "ruleId": "I9001", "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", + "message": "Property 'SourceAccount' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "StringTrueEncryption", + "logicalId": "retrieveTransformedObjectLambdainvocationRestrictionD58B0218", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Permission" }, - "propertyPath": "Properties", + "propertyPath": "Properties.SourceAccount", "category": "Best Practice", - "startLine": 102, + "startLine": 181, "startColumn": 5, - "endLine": 102, - "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", - "phase": "LINT" + "endLine": 181, + "endColumn": 19, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3013", + "ruleId": "I9001", "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", + "message": "Property 'Bucket' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ConditionalTrueEncryption", + "logicalId": "exampleBucketAP", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::S3::AccessPoint" }, - "propertyPath": "Properties", + "propertyPath": "Properties.Bucket", "category": "Best Practice", - "startLine": 108, + "startLine": 192, "startColumn": 5, - "endLine": 108, - "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", - "phase": "LINT" + "endLine": 192, + "endColumn": 12, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-s3", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'examplebucketC9DFA43E'" + } }, { - "ruleId": "I3013", + "ruleId": "I9001", "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", + "message": "Property 'Name' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "DynamicEncryptionValue", + "logicalId": "exampleBucketAP", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::S3::AccessPoint" }, - "propertyPath": "Properties", + "propertyPath": "Properties.Name", "category": "Best Practice", - "startLine": 114, + "startLine": 195, "startColumn": 5, - "endLine": 114, - "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", - "phase": "LINT" + "endLine": 195, + "endColumn": 10, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-s3", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3013", + "ruleId": "I9001", "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", + "message": "Property 'Name' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "DynamicReferenceEncryption", + "logicalId": "s3ObjectLambdaAP", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::S3ObjectLambda::AccessPoint" }, - "propertyPath": "Properties", + "propertyPath": "Properties.Name", "category": "Best Practice", - "startLine": 120, + "startLine": 238, "startColumn": 5, - "endLine": 120, - "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", - "phase": "LINT" + "endLine": 238, + "endColumn": 10, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3013", + "ruleId": "I9040", "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", + "message": "Resource 'examplebucketC9DFA43E' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "InvalidEncryptionValue", + "logicalId": "examplebucketC9DFA43E", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 126, - "startColumn": 5, - "endLine": 126, + "startLine": 5, + "startColumn": 4, + "endLine": 5, "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "I3013", + "ruleId": "I9040", "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", + "message": "Resource 'retrieveTransformedObjectLambdaServiceRole27FF342E' of type 'AWS::IAM::Role' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "SnapshotRestore", + "logicalId": "retrieveTransformedObjectLambdaServiceRole27FF342E", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 153, - "startColumn": 5, - "endLine": 153, + "startLine": 83, + "startColumn": 4, + "endLine": 83, "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "I3013", + "ruleId": "I9040", "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", + "message": "Resource 'retrieveTransformedObjectLambdaD5D6532C' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "EmptySnapshotIdentifier", + "logicalId": "retrieveTransformedObjectLambdaD5D6532C", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 159, - "startColumn": 5, - "endLine": 159, + "startLine": 141, + "startColumn": 4, + "endLine": 141, "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "I3013", + "ruleId": "I9040", "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", + "message": "Resource 'exampleBucketAP' of type 'AWS::S3::AccessPoint' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "ClusterSnapshotRestore", + "logicalId": "exampleBucketAP", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::S3::AccessPoint" }, - "propertyPath": "Properties", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 165, - "startColumn": 5, - "endLine": 165, + "startLine": 191, + "startColumn": 4, + "endLine": 191, "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "cdk/ssm-document-association--SsmDocumentAssociationStack.template.json": { + "filePath": "cdk/ssm-document-association--SsmDocumentAssociationStack.template.json", + "status": "OK", + "metadata": { + "resourcesScanned": 17, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 1, + "informational": 28, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I3013", - "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "ruleId": "W3005", + "severity": "WARN", + "message": "'CustomVpcRestrictDefaultSGCustomResourceProviderRole26592FE0' dependency already enforced by a 'GetAtt' at 'Properties.Role'", "source": "CFN_LINT", "entity": { - "logicalId": "EncryptedSource", + "logicalId": "CustomVpcRestrictDefaultSGCustomResourceProviderHandlerDC833E5E", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties", + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", "category": "Best Practice", - "startLine": 171, - "startColumn": 5, - "endLine": 171, - "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "startLine": 316, + "startColumn": 4, + "endLine": 316, + "endColumn": 14, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", "phase": "LINT" }, { - "ruleId": "I3013", + "ruleId": "I9001", "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", + "message": "Property 'Content' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "SourceResourceRestore", + "logicalId": "TimeWriterDocument", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::SSM::Document" }, - "propertyPath": "Properties", + "propertyPath": "Properties.Content", "category": "Best Practice", - "startLine": 183, + "startLine": 6, "startColumn": 5, - "endLine": 183, - "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", - "phase": "LINT" + "endLine": 6, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ssm", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "I3013", + "ruleId": "I9001", "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", + "message": "Property 'DocumentType' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "AutomatedBackupRestore", + "logicalId": "TimeWriterDocument", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::SSM::Document" }, - "propertyPath": "Properties", + "propertyPath": "Properties.DocumentType", "category": "Best Practice", - "startLine": 189, + "startLine": 36, "startColumn": 5, - "endLine": 189, - "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", - "phase": "LINT" + "endLine": 36, + "endColumn": 18, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ssm", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3013", + "ruleId": "I9001", "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", + "message": "Property 'Name' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "SourceClusterReplica", + "logicalId": "TimeWriterDocument", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::SSM::Document" }, - "propertyPath": "Properties", + "propertyPath": "Properties.Name", "category": "Best Practice", - "startLine": 195, + "startLine": 37, "startColumn": 5, - "endLine": 195, - "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", - "phase": "LINT" + "endLine": 37, + "endColumn": 10, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ssm", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3013", + "ruleId": "I9001", "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "CustomImplicitEncryption", + "logicalId": "SSMDocumentTestVpc2979FA29", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::VPC" }, - "propertyPath": "Properties", + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 201, + "startLine": 71, "startColumn": 5, - "endLine": 201, + "endLine": 71, "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", - "phase": "LINT" + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3013", + "ruleId": "I9001", "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", + "message": "Property 'InstanceTenancy' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "CustomTrueEncryption", + "logicalId": "SSMDocumentTestVpc2979FA29", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::VPC" }, - "propertyPath": "Properties", + "propertyPath": "Properties.InstanceTenancy", "category": "Best Practice", - "startLine": 206, + "startLine": 74, "startColumn": 5, - "endLine": 206, - "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", - "phase": "LINT" + "endLine": 74, + "endColumn": 21, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "I3013", + "ruleId": "I9001", "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", + "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "LegacySecurityGroups", + "logicalId": "SSMDocumentTestVpcpublicSubnet1SubnetB0B3C43E", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties", + "propertyPath": "Properties.AvailabilityZone", "category": "Best Practice", - "startLine": 212, + "startLine": 89, "startColumn": 5, - "endLine": 212, - "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", - "phase": "LINT" + "endLine": 89, + "endColumn": 22, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3013", + "ruleId": "I9001", "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "CorrelatedClusterOrEncryptedStandalone", + "logicalId": "SSMDocumentTestVpcpublicSubnet1SubnetB0B3C43E", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties", + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 218, + "startLine": 97, "startColumn": 5, - "endLine": 218, + "endLine": 97, "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", - "phase": "LINT" + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3013", + "ruleId": "I9001", "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ConditionalSnapshotOrEncryptedStandalone", + "logicalId": "SSMDocumentTestVpcpublicSubnet1SubnetB0B3C43E", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 225, + "startLine": 113, "startColumn": 5, - "endLine": 225, - "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", - "phase": "LINT" + "endLine": 113, + "endColumn": 11, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'SSMDocumentTestVpc2979FA29'" + } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Cluster", + "logicalId": "SSMDocumentTestVpcpublicSubnet1RouteTable4C0F352E", "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" + "resourceType": "AWS::EC2::RouteTable" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 27, - "startColumn": 7, - "endLine": 27, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", + "startLine": 130, + "startColumn": 5, + "endLine": 130, + "endColumn": 11, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'SSMDocumentTestVpc2979FA29'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'StorageEncrypted' is create-only; updating it will cause resource replacement", + "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Cluster", + "logicalId": "SSMDocumentTestVpcpublicSubnet1RouteTableAssociation3C51BE77", "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" + "resourceType": "AWS::EC2::SubnetRouteTableAssociation" }, - "propertyPath": "Properties.StorageEncrypted", + "propertyPath": "Properties.RouteTableId", "category": "Best Practice", - "startLine": 28, - "startColumn": 7, - "endLine": 28, - "endColumn": 23, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", + "startLine": 141, + "startColumn": 5, + "endLine": 141, + "endColumn": 18, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'SSMDocumentTestVpcpublicSubnet1RouteTable4C0F352E'", + "extra": { + "replacement_strategy": "delete_then_create" + } } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MissingEncryption", + "logicalId": "SSMDocumentTestVpcpublicSubnet1RouteTableAssociation3C51BE77", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::SubnetRouteTableAssociation" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.SubnetId", "category": "Best Practice", - "startLine": 33, - "startColumn": 7, - "endLine": 33, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "startLine": 144, + "startColumn": 5, + "endLine": 144, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'SSMDocumentTestVpcpublicSubnet1SubnetB0B3C43E'", + "extra": { + "replacement_strategy": "delete_then_create" + } } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'DestinationCidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "KmsKeyWithoutEncryption", + "logicalId": "SSMDocumentTestVpcpublicSubnet1DefaultRouteE60C709F", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Route" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.DestinationCidrBlock", "category": "Best Practice", - "startLine": 38, - "startColumn": 7, - "endLine": 38, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "startLine": 155, + "startColumn": 5, + "endLine": 155, + "endColumn": 26, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'KmsKeyId' is create-only; updating it will cause resource replacement", + "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "KmsKeyWithoutEncryption", + "logicalId": "SSMDocumentTestVpcpublicSubnet1DefaultRouteE60C709F", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Route" }, - "propertyPath": "Properties.KmsKeyId", + "propertyPath": "Properties.RouteTableId", "category": "Best Practice", - "startLine": 39, - "startColumn": 7, - "endLine": 39, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "startLine": 159, + "startColumn": 5, + "endLine": 159, + "endColumn": 18, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'SSMDocumentTestVpcpublicSubnet1RouteTable4C0F352E'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FalseEncryption", + "logicalId": "SSMDocumentTestVpcVPCGW7C58FC59", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::VPCGatewayAttachment" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 44, - "startColumn": 7, - "endLine": 44, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "startLine": 190, + "startColumn": 5, + "endLine": 190, + "endColumn": 11, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2-vpc-gateway-attachment.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'SSMDocumentTestVpc2979FA29'", + "extra": { + "replacement_strategy": "delete_then_create" + } } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'StorageEncrypted' is create-only; updating it will cause resource replacement", + "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FalseEncryption", + "logicalId": "SSMTestInstanceInstanceSecurityGroup68B5BAFB", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.StorageEncrypted", + "propertyPath": "Properties.GroupDescription", "category": "Best Practice", - "startLine": 45, - "startColumn": 7, - "endLine": 45, - "endColumn": 23, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "startLine": 362, + "startColumn": 5, + "endLine": 362, + "endColumn": 22, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -9229,43 +9152,43 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "StringFalseEncryption", + "logicalId": "SSMTestInstanceInstanceSecurityGroup68B5BAFB", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 50, - "startColumn": 7, - "endLine": 50, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "startLine": 380, + "startColumn": 5, + "endLine": 380, + "endColumn": 11, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'SSMDocumentTestVpc2979FA29'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'StorageEncrypted' is create-only; updating it will cause resource replacement", + "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "StringFalseEncryption", + "logicalId": "SSMTestInstanceA55C9969", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.StorageEncrypted", + "propertyPath": "Properties.AvailabilityZone", "category": "Best Practice", - "startLine": 51, - "startColumn": 7, - "endLine": 51, - "endColumn": 23, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "startLine": 404, + "startColumn": 5, + "endLine": 404, + "endColumn": 22, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -9275,67 +9198,66 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConditionalFalseEncryption", + "logicalId": "SSMTestInstanceA55C9969", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 56, - "startColumn": 7, - "endLine": 56, + "startLine": 415, + "startColumn": 5, + "endLine": 415, "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'StorageEncrypted' is create-only; updating it will cause resource replacement", + "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConditionalFalseEncryption", + "logicalId": "SSMTestInstanceA55C9969", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.StorageEncrypted", + "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 57, - "startColumn": 7, - "endLine": 57, - "endColumn": 23, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "startLine": 418, + "startColumn": 5, + "endLine": 418, + "endColumn": 18, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Fn::If on condition 'UseClusterCondition'" + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'SecurityGroupIds' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConditionalNoValueEncryption", + "logicalId": "SSMTestInstanceA55C9969", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.SecurityGroupIds", "category": "Best Practice", - "startLine": 62, - "startColumn": 7, - "endLine": 62, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "startLine": 419, + "startColumn": 5, + "endLine": 419, + "endColumn": 22, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -9345,44 +9267,44 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'StorageEncrypted' is create-only; updating it will cause resource replacement", + "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConditionalNoValueEncryption", + "logicalId": "SSMTestInstanceA55C9969", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.StorageEncrypted", + "propertyPath": "Properties.SubnetId", "category": "Best Practice", - "startLine": 63, - "startColumn": 7, - "endLine": 63, - "endColumn": 23, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "startLine": 427, + "startColumn": 5, + "endLine": 427, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "Fn::If on condition 'UseClusterCondition'" + "resolutionSource": "Ref to 'SSMDocumentTestVpcpublicSubnet1SubnetB0B3C43E'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "AllowedValuesEncryption", + "logicalId": "SSMTestInstanceA55C9969", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 68, - "startColumn": 7, - "endLine": 68, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "startLine": 440, + "startColumn": 5, + "endLine": 440, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -9390,232 +9312,236 @@ } }, { - "ruleId": "I9001", + "ruleId": "I9003", "severity": "INFO", - "message": "Property 'StorageEncrypted' is create-only; updating it will cause resource replacement", + "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", "source": "ENGINE", - "entity": { - "logicalId": "AllowedValuesEncryption", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" - }, - "propertyPath": "Properties.StorageEncrypted", "category": "Best Practice", - "startLine": 69, - "startColumn": 7, - "endLine": 69, - "endColumn": 23, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter with AllowedValues" - } + "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Resource 'TimeWriterDocument' of type 'AWS::SSM::Document' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "EngineAllowedValuesMissingEncryption", + "logicalId": "TimeWriterDocument", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::SSM::Document" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 74, - "startColumn": 7, - "endLine": 74, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only", - "resolutionSource": "parameter with AllowedValues" - } + "startLine": 5, + "startColumn": 4, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Resource 'DocumentAssociation' of type 'AWS::SSM::Association' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ConditionalClusterOrStandalone", + "logicalId": "DocumentAssociation", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::SSM::Association" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 79, - "startColumn": 7, - "endLine": 79, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 45, + "startColumn": 4, + "endLine": 45, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'DBClusterIdentifier' is create-only; updating it will cause resource replacement", + "message": "Resource 'CustomVpcRestrictDefaultSGCustomResourceProviderRole26592FE0' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ConditionalClusterOrStandalone", + "logicalId": "CustomVpcRestrictDefaultSGCustomResourceProviderRole26592FE0", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.DBClusterIdentifier", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 80, - "startColumn": 7, - "endLine": 80, - "endColumn": 26, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Fn::If on condition 'UseClusterCondition'" - } + "startLine": 225, + "startColumn": 4, + "endLine": 225, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Resource 'CustomVpcRestrictDefaultSGCustomResourceProviderHandlerDC833E5E' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "CustomFalseEncryption", + "logicalId": "CustomVpcRestrictDefaultSGCustomResourceProviderHandlerDC833E5E", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 85, - "startColumn": 7, - "endLine": 85, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 297, + "startColumn": 4, + "endLine": 297, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'StorageEncrypted' is create-only; updating it will cause resource replacement", + "message": "Resource 'EC2SSMRole1C0EBD7B' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "CustomFalseEncryption", + "logicalId": "EC2SSMRole1C0EBD7B", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.StorageEncrypted", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 86, - "startColumn": 7, - "endLine": 86, - "endColumn": 23, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 327, + "startColumn": 4, + "endLine": 327, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "cdk/static-site-basic--MyStaticSite.template.json": { + "filePath": "cdk/static-site-basic--MyStaticSite.template.json", + "status": "OK", + "metadata": { + "resourcesScanned": 11, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 2, + "informational": 7, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W3005", + "severity": "WARN", + "message": "'CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092' dependency already enforced by a 'GetAtt' at 'Properties.Role'", + "source": "CFN_LINT", "entity": { - "logicalId": "CustomStringFalseEncryption", + "logicalId": "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.Engine", + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", "category": "Best Practice", - "startLine": 91, - "startColumn": 7, - "endLine": 91, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 235, + "startColumn": 4, + "endLine": 235, + "endColumn": 14, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" + }, + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756CServiceRole89A01265' dependency already enforced by a 'GetAtt' at 'Properties.Role'", + "source": "CFN_LINT", + "entity": { + "logicalId": "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C81C01536", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 404, + "startColumn": 4, + "endLine": 404, + "endColumn": 14, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'StorageEncrypted' is create-only; updating it will cause resource replacement", + "message": "Property 'Bucket' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "CustomStringFalseEncryption", + "logicalId": "StaticSiteBasicWebsiteBucketPolicy8E799A1F", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::S3::BucketPolicy" }, - "propertyPath": "Properties.StorageEncrypted", + "propertyPath": "Properties.Bucket", "category": "Best Practice", - "startLine": 92, - "startColumn": 7, - "endLine": 92, - "endColumn": 23, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "startLine": 35, + "startColumn": 5, + "endLine": 35, + "endColumn": 12, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'StaticSiteBasicWebsiteBucket3BB70B77'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'Content' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "TrueEncryption", + "logicalId": "StaticSiteBasicDeployWebsiteAwsCliLayer198D4134", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::LayerVersion" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.Content", "category": "Best Practice", - "startLine": 97, - "startColumn": 7, - "endLine": 97, + "startLine": 133, + "startColumn": 5, + "endLine": 133, "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-lambda.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'StorageEncrypted' is create-only; updating it will cause resource replacement", + "message": "Property 'Description' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "TrueEncryption", + "logicalId": "StaticSiteBasicDeployWebsiteAwsCliLayer198D4134", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::LayerVersion" }, - "propertyPath": "Properties.StorageEncrypted", + "propertyPath": "Properties.Description", "category": "Best Practice", - "startLine": 98, - "startColumn": 7, - "endLine": 98, - "endColumn": 23, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "startLine": 139, + "startColumn": 5, + "endLine": 139, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-lambda.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -9623,1249 +9549,5916 @@ } }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Resource 'CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "StringTrueEncryption", + "logicalId": "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 103, - "startColumn": 7, - "endLine": 103, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 180, + "startColumn": 4, + "endLine": 180, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'StorageEncrypted' is create-only; updating it will cause resource replacement", + "message": "Resource 'CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "StringTrueEncryption", + "logicalId": "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.StorageEncrypted", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 104, - "startColumn": 7, - "endLine": 104, - "endColumn": 23, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 205, + "startColumn": 4, + "endLine": 205, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Resource 'CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756CServiceRole89A01265' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ConditionalTrueEncryption", + "logicalId": "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756CServiceRole89A01265", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 109, - "startColumn": 7, - "endLine": 109, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 246, + "startColumn": 4, + "endLine": 246, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'StorageEncrypted' is create-only; updating it will cause resource replacement", + "message": "Resource 'CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C81C01536' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ConditionalTrueEncryption", + "logicalId": "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C81C01536", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.StorageEncrypted", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 110, - "startColumn": 7, - "endLine": 110, - "endColumn": 23, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Fn::If on condition 'UseClusterCondition'" - } + "startLine": 377, + "startColumn": 4, + "endLine": 377, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "cdk/stepfunction-external-definition--StepfunctionExternalDefinitionStack.template.json": { + "filePath": "cdk/stepfunction-external-definition--StepfunctionExternalDefinitionStack.template.json", + "status": "OK", + "metadata": { + "resourcesScanned": 12, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 1, + "informational": 17, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'MyStateMachineRoleD59FFEBC' dependency already enforced by a 'GetAtt' at 'Properties.RoleArn'", + "source": "CFN_LINT", + "entity": { + "logicalId": "MyStateMachine6C968CA5", + "entityType": "Resource", + "resourceType": "AWS::StepFunctions::StateMachine" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 109, + "startColumn": 4, + "endLine": 109, + "endColumn": 14, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'LogGroupName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DynamicEncryptionValue", + "logicalId": "MyStateMachineLogGroup9955D1FE", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Logs::LogGroup" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.LogGroupName", "category": "Best Practice", - "startLine": 115, - "startColumn": 7, - "endLine": 115, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "startLine": 6, + "startColumn": 5, + "endLine": 6, + "endColumn": 18, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-logs.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'StorageEncrypted' is create-only; updating it will cause resource replacement", + "message": "Property 'StateMachineType' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DynamicEncryptionValue", + "logicalId": "MyStateMachine6C968CA5", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::StepFunctions::StateMachine" }, - "propertyPath": "Properties.StorageEncrypted", + "propertyPath": "Properties.StateMachineType", "category": "Best Practice", - "startLine": 116, - "startColumn": 7, - "endLine": 116, - "endColumn": 23, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "startLine": 107, + "startColumn": 5, + "endLine": 107, + "endColumn": 22, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-stepfunctions.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter 'DynamicEncryption' (type String)" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'RestApiId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DynamicReferenceEncryption", + "logicalId": "StepFuncApiDeployment77C863276f473a57d5bd4cb772b382f83651c7a2", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::ApiGateway::Deployment" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.RestApiId", "category": "Best Practice", - "startLine": 121, - "startColumn": 7, - "endLine": 121, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "startLine": 138, + "startColumn": 5, + "endLine": 138, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'StepFuncApiE896FCA7'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'StorageEncrypted' is create-only; updating it will cause resource replacement", + "message": "Property 'RestApiId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DynamicReferenceEncryption", + "logicalId": "StepFuncApiDeploymentStageprod5FF8FD8E", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::ApiGateway::Stage" }, - "propertyPath": "Properties.StorageEncrypted", + "propertyPath": "Properties.RestApiId", "category": "Best Practice", - "startLine": 122, - "startColumn": 7, - "endLine": 122, - "endColumn": 23, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "startLine": 157, + "startColumn": 5, + "endLine": 157, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "dynamic (dynamic reference: {{resolve:ssm:/rds/storage-encrypted}})" + "resolutionSource": "Ref to 'StepFuncApiE896FCA7'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'StageName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "InvalidEncryptionValue", + "logicalId": "StepFuncApiDeploymentStageprod5FF8FD8E", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::ApiGateway::Stage" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.StageName", "category": "Best Practice", - "startLine": 127, - "startColumn": 7, - "endLine": 127, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "startLine": 160, + "startColumn": 5, + "endLine": 160, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'StorageEncrypted' is create-only; updating it will cause resource replacement", + "message": "Property 'ParentId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "InvalidEncryptionValue", + "logicalId": "StepFuncApiorders391C1FA5", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::ApiGateway::Resource" }, - "propertyPath": "Properties.StorageEncrypted", + "propertyPath": "Properties.ParentId", "category": "Best Practice", - "startLine": 128, - "startColumn": 7, - "endLine": 128, - "endColumn": 23, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "startLine": 169, + "startColumn": 5, + "endLine": 169, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "GetAtt StepFuncApiE896FCA7.RootResourceId" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'PathPart' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DynamicEngineValue", + "logicalId": "StepFuncApiorders391C1FA5", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::ApiGateway::Resource" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.PathPart", "category": "Best Practice", - "startLine": 133, - "startColumn": 7, - "endLine": 133, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "startLine": 175, + "startColumn": 5, + "endLine": 175, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only", - "resolutionSource": "parameter 'DynamicEngine' (type String)" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'RestApiId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "AuroraEngine", + "logicalId": "StepFuncApiorders391C1FA5", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::ApiGateway::Resource" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.RestApiId", "category": "Best Practice", - "startLine": 138, - "startColumn": 7, - "endLine": 138, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "startLine": 176, + "startColumn": 5, + "endLine": 176, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'StepFuncApiE896FCA7'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'HttpMethod' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "AuroraAllowedValues", + "logicalId": "StepFuncApiordersGET0318ABB9", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::ApiGateway::Method" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.HttpMethod", "category": "Best Practice", - "startLine": 143, - "startColumn": 7, - "endLine": 143, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "startLine": 234, + "startColumn": 5, + "endLine": 234, + "endColumn": 16, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only", - "resolutionSource": "parameter with AllowedValues" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'ResourceId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ClusterMember", + "logicalId": "StepFuncApiordersGET0318ABB9", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::ApiGateway::Method" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.ResourceId", "category": "Best Practice", - "startLine": 148, - "startColumn": 7, - "endLine": 148, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "startLine": 318, + "startColumn": 5, + "endLine": 318, + "endColumn": 16, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'StepFuncApiorders391C1FA5'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'DBClusterIdentifier' is create-only; updating it will cause resource replacement", + "message": "Property 'RestApiId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ClusterMember", + "logicalId": "StepFuncApiordersGET0318ABB9", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::ApiGateway::Method" }, - "propertyPath": "Properties.DBClusterIdentifier", + "propertyPath": "Properties.RestApiId", "category": "Best Practice", - "startLine": 149, - "startColumn": 7, - "endLine": 149, - "endColumn": 26, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "startLine": 321, + "startColumn": 5, + "endLine": 321, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "Ref to 'Cluster'" + "resolutionSource": "Ref to 'StepFuncApiE896FCA7'" } }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Resource 'MyStateMachineLogGroup9955D1FE' of type 'AWS::Logs::LogGroup' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "SnapshotRestore", + "logicalId": "MyStateMachineLogGroup9955D1FE", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Logs::LogGroup" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 154, - "startColumn": 7, - "endLine": 154, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 5, + "startColumn": 4, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'DBSnapshotIdentifier' is conditionally create-only; updating it may cause resource replacement", + "message": "Resource 'MyStateMachineRoleD59FFEBC' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "SnapshotRestore", + "logicalId": "MyStateMachineRoleD59FFEBC", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.DBSnapshotIdentifier", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 155, - "startColumn": 7, - "endLine": 155, - "endColumn": 27, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only", - "resolutionSource": "parameter 'SnapshotName' (type String)" - } + "startLine": 17, + "startColumn": 4, + "endLine": 17, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Resource 'MyStateMachine6C968CA5' of type 'AWS::StepFunctions::StateMachine' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "EmptySnapshotIdentifier", + "logicalId": "MyStateMachine6C968CA5", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::StepFunctions::StateMachine" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 160, - "startColumn": 7, - "endLine": 160, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 83, + "startColumn": 4, + "endLine": 83, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'DBSnapshotIdentifier' is conditionally create-only; updating it may cause resource replacement", + "message": "Resource 'StepFuncApiE896FCA7' of type 'AWS::ApiGateway::RestApi' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "EmptySnapshotIdentifier", + "logicalId": "StepFuncApiE896FCA7", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::ApiGateway::RestApi" }, - "propertyPath": "Properties.DBSnapshotIdentifier", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 161, - "startColumn": 7, - "endLine": 161, - "endColumn": 27, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 121, + "startColumn": 4, + "endLine": 121, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Resource 'StepFuncApiDeploymentStageprod5FF8FD8E' of type 'AWS::ApiGateway::Stage' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ClusterSnapshotRestore", + "logicalId": "StepFuncApiDeploymentStageprod5FF8FD8E", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::ApiGateway::Stage" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 166, - "startColumn": 7, - "endLine": 166, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 153, + "startColumn": 4, + "endLine": 153, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'DBClusterSnapshotIdentifier' is conditionally create-only; updating it may cause resource replacement", + "message": "Resource 'StepFuncApiordersGETStartSyncExecutionRole90998151' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ClusterSnapshotRestore", + "logicalId": "StepFuncApiordersGETStartSyncExecutionRole90998151", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.DBClusterSnapshotIdentifier", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 167, - "startColumn": 7, - "endLine": 167, - "endColumn": 34, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 186, + "startColumn": 4, + "endLine": 186, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "cdk/stepfunctions-job-poller--aws-stepfunctions-integ.template.json": { + "filePath": "cdk/stepfunctions-job-poller--aws-stepfunctions-integ.template.json", + "status": "OK", + "metadata": { + "resourcesScanned": 11, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 5, + "informational": 8, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W2531", + "severity": "WARN", + "message": "Runtime 'python3.9' was deprecated on '2025-12-15'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'python3.14'", + "source": "CFN_LINT", "entity": { - "logicalId": "EncryptedSource", + "logicalId": "CheckLambda9CBBF9BA", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.Engine", - "category": "Best Practice", - "startLine": 172, - "startColumn": 7, - "endLine": 172, + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 50, + "startColumn": 5, + "endLine": 50, "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", + "ruleDescription": "Check if EOL Lambda Function Runtimes are used", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "actualValue": "python3.9", + "lifecycle": "deprecated" } }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'StorageEncrypted' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W2531", + "severity": "WARN", + "message": "Runtime 'python3.9' was deprecated on '2025-12-15'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'python3.14'", + "source": "CFN_LINT", "entity": { - "logicalId": "EncryptedSource", + "logicalId": "SubmitLambda8054545E", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.StorageEncrypted", - "category": "Best Practice", - "startLine": 173, - "startColumn": 7, - "endLine": 173, - "endColumn": 23, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 107, + "startColumn": 5, + "endLine": 107, + "endColumn": 13, + "ruleDescription": "Check if EOL Lambda Function Runtimes are used", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "actualValue": "python3.9", + "lifecycle": "deprecated" } }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W3005", + "severity": "WARN", + "message": "'CheckLambdaServiceRole74B86E23' dependency already enforced by a 'GetAtt' at 'Properties.Role'", + "source": "CFN_LINT", "entity": { - "logicalId": "SourceInstanceReplica", + "logicalId": "CheckLambda9CBBF9BA", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.Engine", + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", "category": "Best Practice", - "startLine": 178, - "startColumn": 7, - "endLine": 178, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 53, + "startColumn": 4, + "endLine": 53, + "endColumn": 14, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'SourceDBInstanceIdentifier' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W3005", + "severity": "WARN", + "message": "'SubmitLambdaServiceRole98C85C39' dependency already enforced by a 'GetAtt' at 'Properties.Role'", + "source": "CFN_LINT", "entity": { - "logicalId": "SourceInstanceReplica", + "logicalId": "SubmitLambda8054545E", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.SourceDBInstanceIdentifier", + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", "category": "Best Practice", - "startLine": 179, - "startColumn": 7, - "endLine": 179, - "endColumn": 33, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only", - "resolutionSource": "Ref to 'EncryptedSource'" - } + "startLine": 110, + "startColumn": 4, + "endLine": 110, + "endColumn": 14, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W3005", + "severity": "WARN", + "message": "'CronStateMachineRoleFE85923B' dependency already enforced by a 'GetAtt' at 'Properties.RoleArn'", + "source": "CFN_LINT", "entity": { - "logicalId": "SourceResourceRestore", + "logicalId": "CronStateMachine7E50955B", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::StepFunctions::StateMachine" }, - "propertyPath": "Properties.Engine", + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", "category": "Best Practice", - "startLine": 184, - "startColumn": 7, - "endLine": 184, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 259, + "startColumn": 4, + "endLine": 259, + "endColumn": 14, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'SourceDbiResourceId' is conditionally create-only; updating it may cause resource replacement", + "message": "Resource 'CheckLambdaServiceRole74B86E23' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "SourceResourceRestore", + "logicalId": "CheckLambdaServiceRole74B86E23", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.SourceDbiResourceId", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 185, - "startColumn": 7, - "endLine": 185, - "endColumn": 26, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 5, + "startColumn": 4, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Resource 'CheckLambda9CBBF9BA' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "AutomatedBackupRestore", + "logicalId": "CheckLambda9CBBF9BA", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 190, - "startColumn": 7, - "endLine": 190, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 39, + "startColumn": 4, + "endLine": 39, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'SourceDBInstanceAutomatedBackupsArn' is conditionally create-only; updating it may cause resource replacement", + "message": "Resource 'SubmitLambdaServiceRole98C85C39' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "AutomatedBackupRestore", + "logicalId": "SubmitLambdaServiceRole98C85C39", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.SourceDBInstanceAutomatedBackupsArn", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 191, - "startColumn": 7, - "endLine": 191, - "endColumn": 42, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 62, + "startColumn": 4, + "endLine": 62, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Resource 'SubmitLambda8054545E' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "SourceClusterReplica", + "logicalId": "SubmitLambda8054545E", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 196, - "startColumn": 7, - "endLine": 196, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 96, + "startColumn": 4, + "endLine": 96, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'SourceDBClusterIdentifier' is conditionally create-only; updating it may cause resource replacement", + "message": "Resource 'CronStateMachineRoleFE85923B' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "SourceClusterReplica", + "logicalId": "CronStateMachineRoleFE85923B", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.SourceDBClusterIdentifier", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 197, - "startColumn": 7, - "endLine": 197, - "endColumn": 32, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only", - "resolutionSource": "Ref to 'Cluster'" - } + "startLine": 119, + "startColumn": 4, + "endLine": 119, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Resource 'CronStateMachine7E50955B' of type 'AWS::StepFunctions::StateMachine' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "CustomImplicitEncryption", + "logicalId": "CronStateMachine7E50955B", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::StepFunctions::StateMachine" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 202, - "startColumn": 7, - "endLine": 202, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 210, + "startColumn": 4, + "endLine": 210, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Resource 'CronStateMachineEventsRoleA3F136B0' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "CustomTrueEncryption", + "logicalId": "CronStateMachineEventsRoleA3F136B0", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 207, - "startColumn": 7, - "endLine": 207, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 271, + "startColumn": 4, + "endLine": 271, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'StorageEncrypted' is create-only; updating it will cause resource replacement", + "message": "Resource 'Rule4C995B7F' of type 'AWS::Events::Rule' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "CustomTrueEncryption", + "logicalId": "Rule4C995B7F", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Events::Rule" }, - "propertyPath": "Properties.StorageEncrypted", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 208, - "startColumn": 7, - "endLine": 208, - "endColumn": 23, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 317, + "startColumn": 4, + "endLine": 317, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "empty.yaml": { + "filePath": "empty.yaml", + "status": "ERROR", + "metadata": { + "resourcesScanned": 0, + "counts": { + "fatal": 1, + "errors": 0, + "warnings": 0, + "informational": 0, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "F1101", + "severity": "FATAL", + "message": "Empty YAML document", + "source": "SCHEMA", + "category": "Structure", + "startLine": 1, + "startColumn": 1, + "endLine": 1, + "endColumn": 1, + "ruleDescription": "Invalid YAML/JSON syntax", + "phase": "PARSE" + } + ] + }, + "gh-issues/issue-144.yaml": { + "filePath": "gh-issues/issue-144.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 3, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'Name' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "LegacySecurityGroups", + "logicalId": "Flow", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::MediaConnect::Flow" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.Name", "category": "Best Practice", - "startLine": 213, + "startLine": 11, "startColumn": 7, - "endLine": 213, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "endLine": 11, + "endColumn": 11, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-mediaconnect.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'Source.Name' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "CorrelatedClusterOrEncryptedStandalone", + "logicalId": "Flow", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::MediaConnect::Flow" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.Source.Name", "category": "Best Practice", - "startLine": 219, - "startColumn": 7, - "endLine": 219, + "startLine": 13, + "startColumn": 9, + "endLine": 13, "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-mediaconnect.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only" } }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'DBClusterIdentifier' is create-only; updating it will cause resource replacement", + "message": "Resource 'Flow' of type 'AWS::MediaConnect::Flow' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "CorrelatedClusterOrEncryptedStandalone", + "logicalId": "Flow", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::MediaConnect::Flow" }, - "propertyPath": "Properties.DBClusterIdentifier", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 220, - "startColumn": 7, - "endLine": 220, - "endColumn": 26, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Fn::If on condition 'UseClusterCondition'" - } + "startLine": 10, + "startColumn": 5, + "endLine": 10, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "gh-issues/issue-183.yaml": { + "filePath": "gh-issues/issue-183.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 3, + "counts": { + "fatal": 1, + "errors": 0, + "warnings": 4, + "informational": 9, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'StorageEncrypted' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "F3031", + "severity": "FATAL", + "message": "'arn:aws:sqs:us-east-1:1111111111:MyQueue' does not match pattern '^arn:(aws[a-zA-Z0-9-]*):([a-zA-Z0-9\\-])+:((eusc-)?[a-z]{2}((-gov)|(-iso([a-z]?)))?-[a-z]+-\\d{1})?:(\\d{12})?:(.*)$'", + "source": "SCHEMA", "entity": { - "logicalId": "CorrelatedClusterOrEncryptedStandalone", + "logicalId": "PermissionInvalidAccountId", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Permission" }, - "propertyPath": "Properties.StorageEncrypted", - "category": "Best Practice", - "startLine": 221, + "propertyPath": "Properties.SourceArn", + "category": "Schema", + "startLine": 35, "startColumn": 7, - "endLine": 221, - "endColumn": 23, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", + "endLine": 35, + "endColumn": 16, + "ruleDescription": "Value does not match pattern", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Fn::If on condition 'UseClusterCondition'" + "actualValue": "arn:aws:sqs:us-east-1:1111111111:MyQueue", + "expectedConstraint": "^arn:(aws[a-zA-Z0-9-]*):([a-zA-Z0-9\\-])+:((eusc-)?[a-z]{2}((-gov)|(-iso([a-z]?)))?-[a-z]+-\\d{1})?:(\\d{12})?:(.*)$" } }, + { + "ruleId": "W3663", + "severity": "WARN", + "message": "Lambda Permission with a SourceArn that has no account id should also specify SourceAccount", + "source": "CFN_LINT", + "entity": { + "logicalId": "PermissionInvalidAccountId", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties", + "suggestedFix": "Add SourceAccount property", + "category": "Security", + "startLine": 31, + "startColumn": 5, + "endLine": 31, + "endColumn": 15, + "ruleDescription": "Validate SourceAccount is required property", + "phase": "LINT" + }, + { + "ruleId": "W9002", + "severity": "WARN", + "message": "Property 'SourceArn' has a hardcoded ARN - use Ref, GetAtt, or a parameter instead", + "source": "ENGINE", + "entity": { + "logicalId": "PermissionWithAccountId", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties.SourceArn", + "category": "Best Practice", + "startLine": 25, + "startColumn": 7, + "endLine": 25, + "endColumn": 16, + "ruleDescription": "Hardcoded ARN property", + "phase": "LINT" + }, + { + "ruleId": "W9002", + "severity": "WARN", + "message": "Property 'SourceArn' has a hardcoded ARN - use Ref, GetAtt, or a parameter instead", + "source": "ENGINE", + "entity": { + "logicalId": "PermissionInvalidAccountId", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties.SourceArn", + "category": "Best Practice", + "startLine": 35, + "startColumn": 7, + "endLine": 35, + "endColumn": 16, + "ruleDescription": "Hardcoded ARN property", + "phase": "LINT" + }, + { + "ruleId": "W9013", + "severity": "WARN", + "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", + "source": "ENGINE", + "entity": { + "logicalId": "PermissionWithAccountId", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "category": "Security", + "startLine": 19, + "startColumn": 3, + "endLine": 19, + "endColumn": 26, + "ruleDescription": "Hardcoded account ID in ARN", + "phase": "LINT" + }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'Action' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConditionalSnapshotOrEncryptedStandalone", + "logicalId": "PermissionWithAccountId", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Permission" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.Action", "category": "Best Practice", - "startLine": 226, + "startLine": 22, "startColumn": 7, - "endLine": 226, + "endLine": 22, "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'DBSnapshotIdentifier' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConditionalSnapshotOrEncryptedStandalone", + "logicalId": "PermissionWithAccountId", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Permission" }, - "propertyPath": "Properties.DBSnapshotIdentifier", + "propertyPath": "Properties.FunctionName", "category": "Best Practice", - "startLine": 227, + "startLine": 23, "startColumn": 7, - "endLine": 227, - "endColumn": 27, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "endLine": 23, + "endColumn": 19, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only", - "resolutionSource": "Fn::If on condition 'UseClusterCondition'" + "lifecycle": "create-only", + "resolutionSource": "GetAtt MyLambda.Arn" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'StorageEncrypted' is create-only; updating it will cause resource replacement", + "message": "Property 'Principal' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConditionalSnapshotOrEncryptedStandalone", + "logicalId": "PermissionWithAccountId", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Permission" }, - "propertyPath": "Properties.StorageEncrypted", + "propertyPath": "Properties.Principal", "category": "Best Practice", - "startLine": 228, + "startLine": 24, "startColumn": 7, - "endLine": 228, - "endColumn": 23, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "endLine": 24, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Fn::If on condition 'UseClusterCondition'" + "lifecycle": "create-only" } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'Cluster' of type 'AWS::RDS::DBCluster' supports Tags but none are configured", + "message": "Property 'SourceArn' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Cluster", + "logicalId": "PermissionWithAccountId", "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" + "resourceType": "AWS::Lambda::Permission" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.SourceArn", "category": "Best Practice", - "startLine": 26, - "startColumn": 5, - "endLine": 26, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 25, + "startColumn": 7, + "endLine": 25, + "endColumn": 16, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'MissingEncryption' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "message": "Property 'Action' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MissingEncryption", + "logicalId": "PermissionInvalidAccountId", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Permission" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.Action", "category": "Best Practice", "startLine": 32, - "startColumn": 5, + "startColumn": 7, "endLine": 32, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "endColumn": 13, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'KmsKeyWithoutEncryption' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "KmsKeyWithoutEncryption", + "logicalId": "PermissionInvalidAccountId", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Permission" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.FunctionName", "category": "Best Practice", - "startLine": 37, - "startColumn": 5, - "endLine": 37, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 33, + "startColumn": 7, + "endLine": 33, + "endColumn": 19, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "GetAtt MyLambda.Arn" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'FalseEncryption' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "message": "Property 'Principal' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FalseEncryption", + "logicalId": "PermissionInvalidAccountId", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Permission" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.Principal", "category": "Best Practice", - "startLine": 43, - "startColumn": 5, - "endLine": 43, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 34, + "startColumn": 7, + "endLine": 34, + "endColumn": 16, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'StringFalseEncryption' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "message": "Property 'SourceArn' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "StringFalseEncryption", + "logicalId": "PermissionInvalidAccountId", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Permission" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.SourceArn", "category": "Best Practice", - "startLine": 49, - "startColumn": 5, - "endLine": 49, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 35, + "startColumn": 7, + "endLine": 35, + "endColumn": 16, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'ConditionalFalseEncryption' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "message": "Resource 'MyLambda' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ConditionalFalseEncryption", + "logicalId": "MyLambda", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Function" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 55, + "startLine": 12, "startColumn": 5, - "endLine": 55, + "endLine": 12, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "gh-issues/issue-184.yaml": { + "filePath": "gh-issues/issue-184.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 1, + "warnings": 0, + "informational": 5, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'ConditionalNoValueEncryption' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "E3025", + "severity": "ERROR", + "message": "'db.m5.large' is not one of ['db.r3.2xlarge', 'db.r3.4xlarge', 'db.r3.8xlarge', 'db.r3.large', 'db.r3.xlarge', 'db.r4.16xlarge', 'db.r4.2xlarge', 'db.r4.4xlarge', 'db.r4.8xlarge', 'db.r4.large', 'db.r4.xlarge', 'db.r5.12xlarge', 'db.r5.16xlarge', 'db.r5.24xlarge', 'db.r5.2xlarge', 'db.r5.4xlarge', 'db.r5.8xlarge', 'db.r5.large', 'db.r5.xlarge', 'db.r6g.12xlarge', 'db.r6g.16xlarge', 'db.r6g.2xlarge', 'db.r6g.4xlarge', 'db.r6g.8xlarge', 'db.r6g.large', 'db.r6g.xlarge', 'db.r6i.12xlarge', 'db.r6i.16xlarge', 'db.r6i.24xlarge', 'db.r6i.2xlarge', 'db.r6i.32xlarge', 'db.r6i.4xlarge', 'db.r6i.8xlarge', 'db.r6i.large', 'db.r6i.xlarge', 'db.r7g.12xlarge', 'db.r7g.16xlarge', 'db.r7g.2xlarge', 'db.r7g.4xlarge', 'db.r7g.8xlarge', 'db.r7g.large', 'db.r7g.xlarge', 'db.r7i.12xlarge', 'db.r7i.16xlarge', 'db.r7i.24xlarge', 'db.r7i.2xlarge', 'db.r7i.48xlarge', 'db.r7i.4xlarge', 'db.r7i.8xlarge', 'db.r7i.large', 'db.r7i.xlarge', 'db.r8g.12xlarge', 'db.r8g.16xlarge', 'db.r8g.24xlarge', 'db.r8g.2xlarge', 'db.r8g.48xlarge', 'db.r8g.4xlarge', 'db.r8g.8xlarge', 'db.r8g.large', 'db.r8g.xlarge', 'db.serverless', 'db.t2.medium', 'db.t2.small', 'db.t3.large', 'db.t3.medium', 'db.t3.small', 'db.t4g.large', 'db.t4g.medium', 'db.x2g.12xlarge', 'db.x2g.16xlarge', 'db.x2g.2xlarge', 'db.x2g.4xlarge', 'db.x2g.8xlarge', 'db.x2g.large', 'db.x2g.xlarge'] when Engine is 'aurora-mysql' in any region", + "source": "CFN_LINT", "entity": { - "logicalId": "ConditionalNoValueEncryption", + "logicalId": "AuroraInstance", "entityType": "Resource", "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 61, - "startColumn": 5, - "endLine": 61, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "propertyPath": "Properties.DBInstanceClass", + "category": "Resource", + "startLine": 5, + "startColumn": 7, + "endLine": 5, + "endColumn": 22, + "ruleDescription": "Validates RDS DB Instance Class", "phase": "LINT" }, { - "ruleId": "I9040", + "ruleId": "I3011", "severity": "INFO", - "message": "Resource 'AllowedValuesEncryption' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", - "source": "ENGINE", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "AllowedValuesEncryption", + "logicalId": "AuroraInstance", "entityType": "Resource", "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 67, - "startColumn": 5, - "endLine": 67, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "startLine": 2, + "startColumn": 3, + "endLine": 2, + "endColumn": 17, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "I9040", + "ruleId": "I3011", "severity": "INFO", - "message": "Resource 'EngineAllowedValuesMissingEncryption' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "EngineAllowedValuesMissingEncryption", + "logicalId": "AuroraInstance", "entityType": "Resource", "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 73, - "startColumn": 5, - "endLine": 73, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "startLine": 2, + "startColumn": 3, + "endLine": 2, + "endColumn": 17, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'ConditionalClusterOrStandalone' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConditionalClusterOrStandalone", + "logicalId": "AuroraInstance", "entityType": "Resource", "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.Engine", "category": "Best Practice", - "startLine": 78, - "startColumn": 5, - "endLine": 78, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 6, + "startColumn": 7, + "endLine": 6, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9003", "severity": "INFO", - "message": "Resource 'CustomFalseEncryption' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", "source": "ENGINE", - "entity": { - "logicalId": "CustomFalseEncryption", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 84, - "startColumn": 5, - "endLine": 84, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'CustomStringFalseEncryption' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "message": "Resource 'AuroraInstance' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "CustomStringFalseEncryption", + "logicalId": "AuroraInstance", "entityType": "Resource", "resourceType": "AWS::RDS::DBInstance" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 90, + "startLine": 4, "startColumn": 5, - "endLine": 90, + "endLine": 4, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "gh-issues/issue-185.yaml": { + "filePath": "gh-issues/issue-185.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 2, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 0, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [] + }, + "gh-issues/issue-186-clb.json": { + "filePath": "gh-issues/issue-186-clb.json", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 2, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'TrueEncryption' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "message": "Property 'Scheme' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "TrueEncryption", + "logicalId": "CLBA83A883E", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::ElasticLoadBalancing::LoadBalancer" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.Scheme", "category": "Best Practice", - "startLine": 96, + "startLine": 15, "startColumn": 5, - "endLine": 96, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "endLine": 15, + "endColumn": 12, + "documentationUrl": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'StringTrueEncryption' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "message": "Property 'Subnets' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "StringTrueEncryption", + "logicalId": "CLBA83A883E", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::ElasticLoadBalancing::LoadBalancer" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.Subnets", "category": "Best Practice", - "startLine": 102, + "startLine": 19, "startColumn": 5, - "endLine": 102, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'ConditionalTrueEncryption' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "ConditionalTrueEncryption", - "entityType": "Resource", + "endLine": 19, + "endColumn": 13, + "documentationUrl": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } + } + ] + }, + "gh-issues/issue-186-imagebuilder.json": { + "filePath": "gh-issues/issue-186-imagebuilder.json", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 1, + "informational": 1, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "W3030", + "severity": "WARN", + "message": "'Abort' is not one of ['CONTINUE', 'ABORT']", + "source": "CFN_LINT", + "entity": { + "logicalId": "ImagePipeline7DDDE57F", + "entityType": "Resource", + "resourceType": "AWS::ImageBuilder::ImagePipeline" + }, + "propertyPath": "Properties.Workflows.0.OnFailure", + "category": "Schema", + "startLine": 31, + "startColumn": 7, + "endLine": 31, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-imagebuilder.git", + "ruleDescription": "Value not in allowed enum", + "phase": "SCHEMA", + "context": { + "actualValue": "Abort" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Name' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ImagePipeline7DDDE57F", + "entityType": "Resource", + "resourceType": "AWS::ImageBuilder::ImagePipeline" + }, + "propertyPath": "Properties.Name", + "category": "Best Practice", + "startLine": 24, + "startColumn": 5, + "endLine": 24, + "endColumn": 10, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-imagebuilder.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + } + ] + }, + "gh-issues/issue-194.json": { + "filePath": "gh-issues/issue-194.json", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 1, + "warnings": 0, + "informational": 0, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "E2001", + "severity": "ERROR", + "message": "Parameter 'SomeParameter': Default must be a string", + "source": "CFN_LINT", + "entity": { + "logicalId": "SomeParameter", + "entityType": "Parameter" + }, + "propertyPath": "Parameters/SomeParameter/Default", + "category": "Parameter", + "startLine": 5, + "startColumn": 4, + "endLine": 5, + "endColumn": 12, + "ruleDescription": "Parameters have appropriate properties", + "phase": "PARSE" + } + ] + }, + "gh-issues/issue-201.json": { + "filePath": "gh-issues/issue-201.json", + "status": "OK", + "metadata": { + "resourcesScanned": 0, + "counts": { + "fatal": 2, + "errors": 0, + "warnings": 1, + "informational": 0, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "F0001", + "severity": "FATAL", + "message": "Resources section must exist and be non-empty", + "source": "SCHEMA", + "category": "Structure", + "ruleDescription": "Resources section must exist and be non-empty", + "phase": "SCHEMA" + }, + { + "ruleId": "F2002", + "severity": "FATAL", + "message": "Parameter 'MyParam' has invalid Type 'Blimp'", + "source": "SCHEMA", + "entity": { + "logicalId": "MyParam", + "entityType": "Parameter" + }, + "propertyPath": "Parameters/MyParam/Type", + "category": "Parameter", + "startLine": 4, + "startColumn": 7, + "endLine": 4, + "endColumn": 12, + "ruleDescription": "Parameter Type must be valid", + "phase": "SCHEMA" + }, + { + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'MyParam' is not referenced anywhere in the template", + "source": "CFN_LINT", + "entity": { + "logicalId": "MyParam", + "entityType": "Parameter" + }, + "propertyPath": "Parameters/MyParam", + "category": "Best Practice", + "startLine": 3, + "startColumn": 5, + "endLine": 3, + "endColumn": 13, + "ruleDescription": "Check if Parameters are Used", + "phase": "LINT" + } + ] + }, + "gh-issues/issue-226.yaml": { + "filePath": "gh-issues/issue-226.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 2, + "counts": { + "fatal": 0, + "errors": 1, + "warnings": 0, + "informational": 4, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "E9002", + "severity": "ERROR", + "message": "FromPort 443 is greater than ToPort 80", + "source": "ENGINE", + "entity": { + "logicalId": "InvertedRangeSecurityGroup", + "entityType": "Resource", + "resourceType": "AWS::EC2::SecurityGroup" + }, + "propertyPath": "Properties.SecurityGroupIngress.0", + "suggestedFix": "Set FromPort to a value less than or equal to ToPort", + "category": "Resource", + "startLine": 26, + "startColumn": 17, + "endLine": 26, + "endColumn": 18, + "ruleDescription": "SecurityGroup FromPort must be <= ToPort for the TCP and UDP protocols", + "phase": "LINT", + "context": { + "actualValue": [ + { + "CidrIp": "10.0.0.0/8", + "IpProtocol": "tcp", + "FromPort": 443, + "ToPort": 80 + } + ] + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "PingSecurityGroup", + "entityType": "Resource", + "resourceType": "AWS::EC2::SecurityGroup" + }, + "propertyPath": "Properties.GroupDescription", + "category": "Best Practice", + "startLine": 11, + "startColumn": 7, + "endLine": 11, + "endColumn": 23, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "InvertedRangeSecurityGroup", + "entityType": "Resource", + "resourceType": "AWS::EC2::SecurityGroup" + }, + "propertyPath": "Properties.GroupDescription", + "category": "Best Practice", + "startLine": 24, + "startColumn": 7, + "endLine": 24, + "endColumn": 23, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'PingSecurityGroup' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "PingSecurityGroup", + "entityType": "Resource", + "resourceType": "AWS::EC2::SecurityGroup" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 10, + "startColumn": 5, + "endLine": 10, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'InvertedRangeSecurityGroup' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "InvertedRangeSecurityGroup", + "entityType": "Resource", + "resourceType": "AWS::EC2::SecurityGroup" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 23, + "startColumn": 5, + "endLine": 23, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "gh-issues/issue-235.yaml": { + "filePath": "gh-issues/issue-235.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 38, + "counts": { + "fatal": 2, + "errors": 0, + "warnings": 20, + "informational": 208, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "F3003", + "severity": "FATAL", + "message": "'StorageEncrypted' is a required property (from extension)", + "source": "SCHEMA", + "entity": { + "logicalId": "KmsKeyWithoutEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties", + "suggestedFix": "Add 'StorageEncrypted'", + "category": "Schema", + "startLine": 37, + "startColumn": 5, + "endLine": 37, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Required property missing", + "phase": "SCHEMA" + }, + { + "ruleId": "F3012", + "severity": "FATAL", + "message": "'invalid' is not of type 'boolean'", + "source": "SCHEMA", + "entity": { + "logicalId": "InvalidEncryptionValue", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.StorageEncrypted", + "category": "Schema", + "startLine": 128, + "startColumn": 7, + "endLine": 128, + "endColumn": 23, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Property type mismatch", + "phase": "SCHEMA", + "context": { + "actualValue": "invalid", + "expectedConstraint": "boolean" + } + }, + { + "ruleId": "W9002", + "severity": "WARN", + "message": "Property 'SourceDBInstanceAutomatedBackupsArn' has a hardcoded ARN - use Ref, GetAtt, or a parameter instead", + "source": "ENGINE", + "entity": { + "logicalId": "AutomatedBackupRestore", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.SourceDBInstanceAutomatedBackupsArn", + "category": "Best Practice", + "startLine": 191, + "startColumn": 7, + "endLine": 191, + "endColumn": 42, + "ruleDescription": "Hardcoded ARN property", + "phase": "LINT" + }, + { + "ruleId": "W9003", + "severity": "WARN", + "message": "'false' is not of type 'boolean' - automatically coerced (string to boolean)", + "source": "CFN_LINT", + "entity": { + "logicalId": "StringFalseEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.StorageEncrypted", + "category": "Best Practice", + "startLine": 51, + "startColumn": 7, + "endLine": 51, + "endColumn": 23, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Property type coercion warning", + "phase": "SCHEMA" + }, + { + "ruleId": "W9003", + "severity": "WARN", + "message": "'false' is not of type 'boolean' - automatically coerced (string to boolean)", + "source": "CFN_LINT", + "entity": { + "logicalId": "CustomStringFalseEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.StorageEncrypted", + "category": "Best Practice", + "startLine": 92, + "startColumn": 7, + "endLine": 92, + "endColumn": 23, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Property type coercion warning", + "phase": "SCHEMA" + }, + { + "ruleId": "W9003", + "severity": "WARN", + "message": "'true' is not of type 'boolean' - automatically coerced (string to boolean)", + "source": "CFN_LINT", + "entity": { + "logicalId": "StringTrueEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.StorageEncrypted", + "category": "Best Practice", + "startLine": 104, + "startColumn": 7, + "endLine": 104, + "endColumn": 23, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Property type coercion warning", + "phase": "SCHEMA" + }, + { + "ruleId": "W9003", + "severity": "WARN", + "message": "Parameter type 'String' may not be compatible with expected type 'boolean'", + "source": "CFN_LINT", + "entity": { + "logicalId": "DynamicEncryptionValue", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.StorageEncrypted", + "category": "Best Practice", + "startLine": 116, + "startColumn": 7, + "endLine": 116, + "endColumn": 23, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Property type coercion warning", + "phase": "SCHEMA", + "context": { + "resolutionSource": "parameter 'DynamicEncryption' (type String)" + } + }, + { + "ruleId": "W9003", + "severity": "WARN", + "message": "Parameter type 'String' may not be compatible with expected type 'boolean'", + "source": "CFN_LINT", + "entity": { + "logicalId": "DynamicReferenceEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.StorageEncrypted", + "category": "Best Practice", + "startLine": 122, + "startColumn": 7, + "endLine": 122, + "endColumn": 23, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Property type coercion warning", + "phase": "SCHEMA", + "context": { + "resolutionSource": "dynamic (dynamic reference: {{resolve:ssm:/rds/storage-encrypted}})" + } + }, + { + "ruleId": "W9008", + "severity": "WARN", + "message": "RDS instance should have StorageEncrypted set to true", + "source": "ENGINE", + "entity": { + "logicalId": "MissingEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.StorageEncrypted", + "suggestedFix": "Set StorageEncrypted to true", + "category": "Security", + "startLine": 32, + "startColumn": 5, + "endLine": 32, + "endColumn": 15, + "ruleDescription": "RDS instance should have StorageEncrypted", + "phase": "LINT" + }, + { + "ruleId": "W9008", + "severity": "WARN", + "message": "RDS instance should have StorageEncrypted set to true", + "source": "ENGINE", + "entity": { + "logicalId": "KmsKeyWithoutEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.StorageEncrypted", + "suggestedFix": "Set StorageEncrypted to true", + "category": "Security", + "startLine": 37, + "startColumn": 5, + "endLine": 37, + "endColumn": 15, + "ruleDescription": "RDS instance should have StorageEncrypted", + "phase": "LINT" + }, + { + "ruleId": "W9008", + "severity": "WARN", + "message": "RDS instance should have StorageEncrypted set to true", + "source": "ENGINE", + "entity": { + "logicalId": "FalseEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.StorageEncrypted", + "suggestedFix": "Set StorageEncrypted to true", + "category": "Security", + "startLine": 45, + "startColumn": 7, + "endLine": 45, + "endColumn": 23, + "ruleDescription": "RDS instance should have StorageEncrypted", + "phase": "LINT" + }, + { + "ruleId": "W9008", + "severity": "WARN", + "message": "RDS instance should have StorageEncrypted set to true", + "source": "ENGINE", + "entity": { + "logicalId": "StringFalseEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.StorageEncrypted", + "suggestedFix": "Set StorageEncrypted to true", + "category": "Security", + "startLine": 51, + "startColumn": 7, + "endLine": 51, + "endColumn": 23, + "ruleDescription": "RDS instance should have StorageEncrypted", + "phase": "LINT" + }, + { + "ruleId": "W9008", + "severity": "WARN", + "message": "RDS instance should have StorageEncrypted set to true", + "source": "ENGINE", + "entity": { + "logicalId": "ConditionalFalseEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.StorageEncrypted", + "suggestedFix": "Set StorageEncrypted to true", + "category": "Security", + "startLine": 57, + "startColumn": 7, + "endLine": 57, + "endColumn": 23, + "ruleDescription": "RDS instance should have StorageEncrypted", + "phase": "LINT" + }, + { + "ruleId": "W9008", + "severity": "WARN", + "message": "RDS instance should have StorageEncrypted set to true", + "source": "ENGINE", + "entity": { + "logicalId": "ConditionalNoValueEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.StorageEncrypted", + "suggestedFix": "Set StorageEncrypted to true", + "category": "Security", + "startLine": 63, + "startColumn": 7, + "endLine": 63, + "endColumn": 23, + "ruleDescription": "RDS instance should have StorageEncrypted", + "phase": "LINT" + }, + { + "ruleId": "W9008", + "severity": "WARN", + "message": "RDS instance should have StorageEncrypted set to true", + "source": "ENGINE", + "entity": { + "logicalId": "AllowedValuesEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.StorageEncrypted", + "suggestedFix": "Set StorageEncrypted to true", + "category": "Security", + "startLine": 69, + "startColumn": 7, + "endLine": 69, + "endColumn": 23, + "ruleDescription": "RDS instance should have StorageEncrypted", + "phase": "LINT" + }, + { + "ruleId": "W9008", + "severity": "WARN", + "message": "RDS instance should have StorageEncrypted set to true", + "source": "ENGINE", + "entity": { + "logicalId": "EngineAllowedValuesMissingEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.StorageEncrypted", + "suggestedFix": "Set StorageEncrypted to true", + "category": "Security", + "startLine": 73, + "startColumn": 5, + "endLine": 73, + "endColumn": 15, + "ruleDescription": "RDS instance should have StorageEncrypted", + "phase": "LINT" + }, + { + "ruleId": "W9008", + "severity": "WARN", + "message": "RDS instance should have StorageEncrypted set to true", + "source": "ENGINE", + "entity": { + "logicalId": "ConditionalClusterOrStandalone", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.StorageEncrypted", + "suggestedFix": "Set StorageEncrypted to true", + "category": "Security", + "startLine": 78, + "startColumn": 5, + "endLine": 78, + "endColumn": 15, + "ruleDescription": "RDS instance should have StorageEncrypted", + "phase": "LINT" + }, + { + "ruleId": "W9008", + "severity": "WARN", + "message": "RDS instance should have StorageEncrypted set to true", + "source": "ENGINE", + "entity": { + "logicalId": "CustomFalseEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.StorageEncrypted", + "suggestedFix": "Set StorageEncrypted to true", + "category": "Security", + "startLine": 86, + "startColumn": 7, + "endLine": 86, + "endColumn": 23, + "ruleDescription": "RDS instance should have StorageEncrypted", + "phase": "LINT" + }, + { + "ruleId": "W9008", + "severity": "WARN", + "message": "RDS instance should have StorageEncrypted set to true", + "source": "ENGINE", + "entity": { + "logicalId": "CustomStringFalseEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.StorageEncrypted", + "suggestedFix": "Set StorageEncrypted to true", + "category": "Security", + "startLine": 92, + "startColumn": 7, + "endLine": 92, + "endColumn": 23, + "ruleDescription": "RDS instance should have StorageEncrypted", + "phase": "LINT" + }, + { + "ruleId": "W9008", + "severity": "WARN", + "message": "RDS instance should have StorageEncrypted set to true", + "source": "ENGINE", + "entity": { + "logicalId": "EmptySnapshotIdentifier", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.StorageEncrypted", + "suggestedFix": "Set StorageEncrypted to true", + "category": "Security", + "startLine": 159, + "startColumn": 5, + "endLine": 159, + "endColumn": 15, + "ruleDescription": "RDS instance should have StorageEncrypted", + "phase": "LINT" + }, + { + "ruleId": "W9008", + "severity": "WARN", + "message": "RDS instance should have StorageEncrypted set to true", + "source": "ENGINE", + "entity": { + "logicalId": "WholePropertiesFalseEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.StorageEncrypted", + "suggestedFix": "Set StorageEncrypted to true", + "category": "Security", + "startLine": 241, + "startColumn": 5, + "endLine": 241, + "endColumn": 15, + "ruleDescription": "RDS instance should have StorageEncrypted", + "phase": "LINT" + }, + { + "ruleId": "W9013", + "severity": "WARN", + "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", + "source": "ENGINE", + "entity": { + "logicalId": "AutomatedBackupRestore", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Security", + "startLine": 187, + "startColumn": 3, + "endLine": 187, + "endColumn": 25, + "ruleDescription": "Hardcoded account ID in ARN", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "Cluster", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBCluster" + }, + "category": "Best Practice", + "startLine": 24, + "startColumn": 3, + "endLine": 24, + "endColumn": 10, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "Cluster", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBCluster" + }, + "category": "Best Practice", + "startLine": 24, + "startColumn": 3, + "endLine": 24, + "endColumn": 10, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "MissingEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 30, + "startColumn": 3, + "endLine": 30, + "endColumn": 20, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "MissingEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 30, + "startColumn": 3, + "endLine": 30, + "endColumn": 20, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "KmsKeyWithoutEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 35, + "startColumn": 3, + "endLine": 35, + "endColumn": 26, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "KmsKeyWithoutEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 35, + "startColumn": 3, + "endLine": 35, + "endColumn": 26, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "FalseEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 41, + "startColumn": 3, + "endLine": 41, + "endColumn": 18, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "FalseEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 41, + "startColumn": 3, + "endLine": 41, + "endColumn": 18, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "StringFalseEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 47, + "startColumn": 3, + "endLine": 47, + "endColumn": 24, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "StringFalseEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 47, + "startColumn": 3, + "endLine": 47, + "endColumn": 24, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "ConditionalFalseEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 53, + "startColumn": 3, + "endLine": 53, + "endColumn": 29, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "ConditionalFalseEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 53, + "startColumn": 3, + "endLine": 53, + "endColumn": 29, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "ConditionalNoValueEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 59, + "startColumn": 3, + "endLine": 59, + "endColumn": 31, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "ConditionalNoValueEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 59, + "startColumn": 3, + "endLine": 59, + "endColumn": 31, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "AllowedValuesEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 65, + "startColumn": 3, + "endLine": 65, + "endColumn": 26, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "AllowedValuesEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 65, + "startColumn": 3, + "endLine": 65, + "endColumn": 26, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "EngineAllowedValuesMissingEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 71, + "startColumn": 3, + "endLine": 71, + "endColumn": 39, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "EngineAllowedValuesMissingEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 71, + "startColumn": 3, + "endLine": 71, + "endColumn": 39, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "ConditionalClusterOrStandalone", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 76, + "startColumn": 3, + "endLine": 76, + "endColumn": 33, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "ConditionalClusterOrStandalone", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 76, + "startColumn": 3, + "endLine": 76, + "endColumn": 33, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "CustomFalseEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 82, + "startColumn": 3, + "endLine": 82, + "endColumn": 24, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "CustomFalseEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 82, + "startColumn": 3, + "endLine": 82, + "endColumn": 24, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "CustomStringFalseEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 88, + "startColumn": 3, + "endLine": 88, + "endColumn": 30, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "CustomStringFalseEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 88, + "startColumn": 3, + "endLine": 88, + "endColumn": 30, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "TrueEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 94, + "startColumn": 3, + "endLine": 94, + "endColumn": 17, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "TrueEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 94, + "startColumn": 3, + "endLine": 94, + "endColumn": 17, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "StringTrueEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 100, + "startColumn": 3, + "endLine": 100, + "endColumn": 23, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "StringTrueEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 100, + "startColumn": 3, + "endLine": 100, + "endColumn": 23, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "ConditionalTrueEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 106, + "startColumn": 3, + "endLine": 106, + "endColumn": 28, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "ConditionalTrueEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 106, + "startColumn": 3, + "endLine": 106, + "endColumn": 28, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "DynamicEncryptionValue", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 112, + "startColumn": 3, + "endLine": 112, + "endColumn": 25, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "DynamicEncryptionValue", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 112, + "startColumn": 3, + "endLine": 112, + "endColumn": 25, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "DynamicReferenceEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 118, + "startColumn": 3, + "endLine": 118, + "endColumn": 29, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "DynamicReferenceEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 118, + "startColumn": 3, + "endLine": 118, + "endColumn": 29, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "InvalidEncryptionValue", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 124, + "startColumn": 3, + "endLine": 124, + "endColumn": 25, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "InvalidEncryptionValue", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 124, + "startColumn": 3, + "endLine": 124, + "endColumn": 25, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "DynamicEngineValue", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 130, + "startColumn": 3, + "endLine": 130, + "endColumn": 21, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "DynamicEngineValue", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 130, + "startColumn": 3, + "endLine": 130, + "endColumn": 21, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "AuroraEngine", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 135, + "startColumn": 3, + "endLine": 135, + "endColumn": 15, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "AuroraEngine", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 135, + "startColumn": 3, + "endLine": 135, + "endColumn": 15, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "AuroraAllowedValues", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 140, + "startColumn": 3, + "endLine": 140, + "endColumn": 22, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "AuroraAllowedValues", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 140, + "startColumn": 3, + "endLine": 140, + "endColumn": 22, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "ClusterMember", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 145, + "startColumn": 3, + "endLine": 145, + "endColumn": 16, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "ClusterMember", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 145, + "startColumn": 3, + "endLine": 145, + "endColumn": 16, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "SnapshotRestore", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 151, + "startColumn": 3, + "endLine": 151, + "endColumn": 18, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "SnapshotRestore", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 151, + "startColumn": 3, + "endLine": 151, + "endColumn": 18, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "EmptySnapshotIdentifier", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 157, + "startColumn": 3, + "endLine": 157, + "endColumn": 26, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "EmptySnapshotIdentifier", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 157, + "startColumn": 3, + "endLine": 157, + "endColumn": 26, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "ClusterSnapshotRestore", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 163, + "startColumn": 3, + "endLine": 163, + "endColumn": 25, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "ClusterSnapshotRestore", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 163, + "startColumn": 3, + "endLine": 163, + "endColumn": 25, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "EncryptedSource", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 169, + "startColumn": 3, + "endLine": 169, + "endColumn": 18, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "EncryptedSource", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 169, + "startColumn": 3, + "endLine": 169, + "endColumn": 18, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "SourceInstanceReplica", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 175, + "startColumn": 3, + "endLine": 175, + "endColumn": 24, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "SourceInstanceReplica", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 175, + "startColumn": 3, + "endLine": 175, + "endColumn": 24, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "SourceResourceRestore", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 181, + "startColumn": 3, + "endLine": 181, + "endColumn": 24, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "SourceResourceRestore", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 181, + "startColumn": 3, + "endLine": 181, + "endColumn": 24, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "AutomatedBackupRestore", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 187, + "startColumn": 3, + "endLine": 187, + "endColumn": 25, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "AutomatedBackupRestore", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 187, + "startColumn": 3, + "endLine": 187, + "endColumn": 25, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "SourceClusterReplica", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 193, + "startColumn": 3, + "endLine": 193, + "endColumn": 23, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "SourceClusterReplica", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 193, + "startColumn": 3, + "endLine": 193, + "endColumn": 23, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "CustomImplicitEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 199, + "startColumn": 3, + "endLine": 199, + "endColumn": 27, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "CustomImplicitEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 199, + "startColumn": 3, + "endLine": 199, + "endColumn": 27, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "CustomTrueEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 204, + "startColumn": 3, + "endLine": 204, + "endColumn": 23, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "CustomTrueEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 204, + "startColumn": 3, + "endLine": 204, + "endColumn": 23, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "LegacySecurityGroups", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 210, + "startColumn": 3, + "endLine": 210, + "endColumn": 23, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "LegacySecurityGroups", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 210, + "startColumn": 3, + "endLine": 210, + "endColumn": 23, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "CorrelatedClusterOrEncryptedStandalone", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 216, + "startColumn": 3, + "endLine": 216, + "endColumn": 41, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "CorrelatedClusterOrEncryptedStandalone", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 216, + "startColumn": 3, + "endLine": 216, + "endColumn": 41, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "ConditionalSnapshotOrEncryptedStandalone", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 223, + "startColumn": 3, + "endLine": 223, + "endColumn": 43, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "ConditionalSnapshotOrEncryptedStandalone", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 223, + "startColumn": 3, + "endLine": 223, + "endColumn": 43, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "WholePropertiesCorrelated", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 230, + "startColumn": 3, + "endLine": 230, + "endColumn": 28, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "WholePropertiesCorrelated", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 230, + "startColumn": 3, + "endLine": 230, + "endColumn": 28, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "WholePropertiesFalseEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 239, + "startColumn": 3, + "endLine": 239, + "endColumn": 33, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "WholePropertiesFalseEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 239, + "startColumn": 3, + "endLine": 239, + "endColumn": 33, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "DynamicProperties", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 248, + "startColumn": 3, + "endLine": 248, + "endColumn": 20, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "DynamicProperties", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 248, + "startColumn": 3, + "endLine": 248, + "endColumn": 20, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3013", + "severity": "INFO", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "Cluster", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBCluster" + }, + "propertyPath": "Properties", + "category": "Best Practice", + "startLine": 26, + "startColumn": 5, + "endLine": 26, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "phase": "LINT" + }, + { + "ruleId": "I3013", + "severity": "INFO", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "MissingEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties", + "category": "Best Practice", + "startLine": 32, + "startColumn": 5, + "endLine": 32, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "phase": "LINT" + }, + { + "ruleId": "I3013", + "severity": "INFO", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "KmsKeyWithoutEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties", + "category": "Best Practice", + "startLine": 37, + "startColumn": 5, + "endLine": 37, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "phase": "LINT" + }, + { + "ruleId": "I3013", + "severity": "INFO", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "FalseEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties", + "category": "Best Practice", + "startLine": 43, + "startColumn": 5, + "endLine": 43, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "phase": "LINT" + }, + { + "ruleId": "I3013", + "severity": "INFO", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "StringFalseEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties", + "category": "Best Practice", + "startLine": 49, + "startColumn": 5, + "endLine": 49, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "phase": "LINT" + }, + { + "ruleId": "I3013", + "severity": "INFO", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "ConditionalFalseEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties", + "category": "Best Practice", + "startLine": 55, + "startColumn": 5, + "endLine": 55, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "phase": "LINT" + }, + { + "ruleId": "I3013", + "severity": "INFO", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "ConditionalNoValueEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties", + "category": "Best Practice", + "startLine": 61, + "startColumn": 5, + "endLine": 61, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "phase": "LINT" + }, + { + "ruleId": "I3013", + "severity": "INFO", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "AllowedValuesEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties", + "category": "Best Practice", + "startLine": 67, + "startColumn": 5, + "endLine": 67, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "phase": "LINT" + }, + { + "ruleId": "I3013", + "severity": "INFO", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "ConditionalClusterOrStandalone", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties", + "category": "Best Practice", + "startLine": 78, + "startColumn": 5, + "endLine": 78, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "phase": "LINT" + }, + { + "ruleId": "I3013", + "severity": "INFO", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "CustomFalseEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties", + "category": "Best Practice", + "startLine": 84, + "startColumn": 5, + "endLine": 84, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "phase": "LINT" + }, + { + "ruleId": "I3013", + "severity": "INFO", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "CustomStringFalseEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties", + "category": "Best Practice", + "startLine": 90, + "startColumn": 5, + "endLine": 90, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "phase": "LINT" + }, + { + "ruleId": "I3013", + "severity": "INFO", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "TrueEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties", + "category": "Best Practice", + "startLine": 96, + "startColumn": 5, + "endLine": 96, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "phase": "LINT" + }, + { + "ruleId": "I3013", + "severity": "INFO", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "StringTrueEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties", + "category": "Best Practice", + "startLine": 102, + "startColumn": 5, + "endLine": 102, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "phase": "LINT" + }, + { + "ruleId": "I3013", + "severity": "INFO", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "ConditionalTrueEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties", + "category": "Best Practice", + "startLine": 108, + "startColumn": 5, + "endLine": 108, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "phase": "LINT" + }, + { + "ruleId": "I3013", + "severity": "INFO", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "DynamicEncryptionValue", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties", + "category": "Best Practice", + "startLine": 114, + "startColumn": 5, + "endLine": 114, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "phase": "LINT" + }, + { + "ruleId": "I3013", + "severity": "INFO", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "DynamicReferenceEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties", + "category": "Best Practice", + "startLine": 120, + "startColumn": 5, + "endLine": 120, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "phase": "LINT" + }, + { + "ruleId": "I3013", + "severity": "INFO", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "InvalidEncryptionValue", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties", + "category": "Best Practice", + "startLine": 126, + "startColumn": 5, + "endLine": 126, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "phase": "LINT" + }, + { + "ruleId": "I3013", + "severity": "INFO", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "SnapshotRestore", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties", + "category": "Best Practice", + "startLine": 153, + "startColumn": 5, + "endLine": 153, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "phase": "LINT" + }, + { + "ruleId": "I3013", + "severity": "INFO", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "EmptySnapshotIdentifier", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties", + "category": "Best Practice", + "startLine": 159, + "startColumn": 5, + "endLine": 159, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "phase": "LINT" + }, + { + "ruleId": "I3013", + "severity": "INFO", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "ClusterSnapshotRestore", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties", + "category": "Best Practice", + "startLine": 165, + "startColumn": 5, + "endLine": 165, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "phase": "LINT" + }, + { + "ruleId": "I3013", + "severity": "INFO", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "EncryptedSource", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties", + "category": "Best Practice", + "startLine": 171, + "startColumn": 5, + "endLine": 171, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "phase": "LINT" + }, + { + "ruleId": "I3013", + "severity": "INFO", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "SourceResourceRestore", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties", + "category": "Best Practice", + "startLine": 183, + "startColumn": 5, + "endLine": 183, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "phase": "LINT" + }, + { + "ruleId": "I3013", + "severity": "INFO", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "AutomatedBackupRestore", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties", + "category": "Best Practice", + "startLine": 189, + "startColumn": 5, + "endLine": 189, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "phase": "LINT" + }, + { + "ruleId": "I3013", + "severity": "INFO", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "SourceClusterReplica", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties", + "category": "Best Practice", + "startLine": 195, + "startColumn": 5, + "endLine": 195, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "phase": "LINT" + }, + { + "ruleId": "I3013", + "severity": "INFO", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "CustomImplicitEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties", + "category": "Best Practice", + "startLine": 201, + "startColumn": 5, + "endLine": 201, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "phase": "LINT" + }, + { + "ruleId": "I3013", + "severity": "INFO", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "CustomTrueEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties", + "category": "Best Practice", + "startLine": 206, + "startColumn": 5, + "endLine": 206, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "phase": "LINT" + }, + { + "ruleId": "I3013", + "severity": "INFO", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "LegacySecurityGroups", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties", + "category": "Best Practice", + "startLine": 212, + "startColumn": 5, + "endLine": 212, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "phase": "LINT" + }, + { + "ruleId": "I3013", + "severity": "INFO", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "CorrelatedClusterOrEncryptedStandalone", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties", + "category": "Best Practice", + "startLine": 218, + "startColumn": 5, + "endLine": 218, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "phase": "LINT" + }, + { + "ruleId": "I3013", + "severity": "INFO", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "ConditionalSnapshotOrEncryptedStandalone", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties", + "category": "Best Practice", + "startLine": 225, + "startColumn": 5, + "endLine": 225, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "phase": "LINT" + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "Cluster", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBCluster" + }, + "propertyPath": "Properties.Engine", + "category": "Best Practice", + "startLine": 27, + "startColumn": 7, + "endLine": 27, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'StorageEncrypted' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "Cluster", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBCluster" + }, + "propertyPath": "Properties.StorageEncrypted", + "category": "Best Practice", + "startLine": 28, + "startColumn": 7, + "endLine": 28, + "endColumn": 23, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "MissingEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.Engine", + "category": "Best Practice", + "startLine": 33, + "startColumn": 7, + "endLine": 33, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "KmsKeyWithoutEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.Engine", + "category": "Best Practice", + "startLine": 38, + "startColumn": 7, + "endLine": 38, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'KmsKeyId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "KmsKeyWithoutEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.KmsKeyId", + "category": "Best Practice", + "startLine": 39, + "startColumn": 7, + "endLine": 39, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "FalseEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.Engine", + "category": "Best Practice", + "startLine": 44, + "startColumn": 7, + "endLine": 44, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'StorageEncrypted' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "FalseEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.StorageEncrypted", + "category": "Best Practice", + "startLine": 45, + "startColumn": 7, + "endLine": 45, + "endColumn": 23, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "StringFalseEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.Engine", + "category": "Best Practice", + "startLine": 50, + "startColumn": 7, + "endLine": 50, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'StorageEncrypted' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "StringFalseEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.StorageEncrypted", + "category": "Best Practice", + "startLine": 51, + "startColumn": 7, + "endLine": 51, + "endColumn": 23, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConditionalFalseEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.Engine", + "category": "Best Practice", + "startLine": 56, + "startColumn": 7, + "endLine": 56, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'StorageEncrypted' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConditionalFalseEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.StorageEncrypted", + "category": "Best Practice", + "startLine": 57, + "startColumn": 7, + "endLine": 57, + "endColumn": 23, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Fn::If on condition 'UseClusterCondition'" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConditionalNoValueEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.Engine", + "category": "Best Practice", + "startLine": 62, + "startColumn": 7, + "endLine": 62, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'StorageEncrypted' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConditionalNoValueEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.StorageEncrypted", + "category": "Best Practice", + "startLine": 63, + "startColumn": 7, + "endLine": 63, + "endColumn": 23, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Fn::If on condition 'UseClusterCondition'" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "AllowedValuesEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.Engine", + "category": "Best Practice", + "startLine": 68, + "startColumn": 7, + "endLine": 68, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'StorageEncrypted' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "AllowedValuesEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.StorageEncrypted", + "category": "Best Practice", + "startLine": 69, + "startColumn": 7, + "endLine": 69, + "endColumn": 23, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "parameter with AllowedValues" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "EngineAllowedValuesMissingEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.Engine", + "category": "Best Practice", + "startLine": 74, + "startColumn": 7, + "endLine": 74, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only", + "resolutionSource": "parameter with AllowedValues" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConditionalClusterOrStandalone", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.Engine", + "category": "Best Practice", + "startLine": 79, + "startColumn": 7, + "endLine": 79, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'DBClusterIdentifier' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConditionalClusterOrStandalone", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.DBClusterIdentifier", + "category": "Best Practice", + "startLine": 80, + "startColumn": 7, + "endLine": 80, + "endColumn": 26, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Fn::If on condition 'UseClusterCondition'" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "CustomFalseEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.Engine", + "category": "Best Practice", + "startLine": 85, + "startColumn": 7, + "endLine": 85, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'StorageEncrypted' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "CustomFalseEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.StorageEncrypted", + "category": "Best Practice", + "startLine": 86, + "startColumn": 7, + "endLine": 86, + "endColumn": 23, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "CustomStringFalseEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.Engine", + "category": "Best Practice", + "startLine": 91, + "startColumn": 7, + "endLine": 91, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'StorageEncrypted' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "CustomStringFalseEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.StorageEncrypted", + "category": "Best Practice", + "startLine": 92, + "startColumn": 7, + "endLine": 92, + "endColumn": 23, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "TrueEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.Engine", + "category": "Best Practice", + "startLine": 97, + "startColumn": 7, + "endLine": 97, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'StorageEncrypted' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "TrueEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.StorageEncrypted", + "category": "Best Practice", + "startLine": 98, + "startColumn": 7, + "endLine": 98, + "endColumn": 23, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "StringTrueEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.Engine", + "category": "Best Practice", + "startLine": 103, + "startColumn": 7, + "endLine": 103, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'StorageEncrypted' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "StringTrueEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.StorageEncrypted", + "category": "Best Practice", + "startLine": 104, + "startColumn": 7, + "endLine": 104, + "endColumn": 23, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConditionalTrueEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.Engine", + "category": "Best Practice", + "startLine": 109, + "startColumn": 7, + "endLine": 109, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'StorageEncrypted' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConditionalTrueEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.StorageEncrypted", + "category": "Best Practice", + "startLine": 110, + "startColumn": 7, + "endLine": 110, + "endColumn": 23, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Fn::If on condition 'UseClusterCondition'" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "DynamicEncryptionValue", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.Engine", + "category": "Best Practice", + "startLine": 115, + "startColumn": 7, + "endLine": 115, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'StorageEncrypted' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "DynamicEncryptionValue", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.StorageEncrypted", + "category": "Best Practice", + "startLine": 116, + "startColumn": 7, + "endLine": 116, + "endColumn": 23, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "parameter 'DynamicEncryption' (type String)" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "DynamicReferenceEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.Engine", + "category": "Best Practice", + "startLine": 121, + "startColumn": 7, + "endLine": 121, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'StorageEncrypted' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "DynamicReferenceEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.StorageEncrypted", + "category": "Best Practice", + "startLine": 122, + "startColumn": 7, + "endLine": 122, + "endColumn": 23, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "dynamic (dynamic reference: {{resolve:ssm:/rds/storage-encrypted}})" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "InvalidEncryptionValue", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.Engine", + "category": "Best Practice", + "startLine": 127, + "startColumn": 7, + "endLine": 127, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'StorageEncrypted' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "InvalidEncryptionValue", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.StorageEncrypted", + "category": "Best Practice", + "startLine": 128, + "startColumn": 7, + "endLine": 128, + "endColumn": 23, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "DynamicEngineValue", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.Engine", + "category": "Best Practice", + "startLine": 133, + "startColumn": 7, + "endLine": 133, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only", + "resolutionSource": "parameter 'DynamicEngine' (type String)" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "AuroraEngine", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.Engine", + "category": "Best Practice", + "startLine": 138, + "startColumn": 7, + "endLine": 138, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "AuroraAllowedValues", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.Engine", + "category": "Best Practice", + "startLine": 143, + "startColumn": 7, + "endLine": 143, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only", + "resolutionSource": "parameter with AllowedValues" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ClusterMember", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.Engine", + "category": "Best Practice", + "startLine": 148, + "startColumn": 7, + "endLine": 148, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'DBClusterIdentifier' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ClusterMember", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.DBClusterIdentifier", + "category": "Best Practice", + "startLine": 149, + "startColumn": 7, + "endLine": 149, + "endColumn": 26, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'Cluster'" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "SnapshotRestore", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.Engine", + "category": "Best Practice", + "startLine": 154, + "startColumn": 7, + "endLine": 154, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'DBSnapshotIdentifier' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "SnapshotRestore", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.DBSnapshotIdentifier", + "category": "Best Practice", + "startLine": 155, + "startColumn": 7, + "endLine": 155, + "endColumn": 27, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only", + "resolutionSource": "parameter 'SnapshotName' (type String)" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "EmptySnapshotIdentifier", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.Engine", + "category": "Best Practice", + "startLine": 160, + "startColumn": 7, + "endLine": 160, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'DBSnapshotIdentifier' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "EmptySnapshotIdentifier", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.DBSnapshotIdentifier", + "category": "Best Practice", + "startLine": 161, + "startColumn": 7, + "endLine": 161, + "endColumn": 27, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ClusterSnapshotRestore", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.Engine", + "category": "Best Practice", + "startLine": 166, + "startColumn": 7, + "endLine": 166, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'DBClusterSnapshotIdentifier' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ClusterSnapshotRestore", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.DBClusterSnapshotIdentifier", + "category": "Best Practice", + "startLine": 167, + "startColumn": 7, + "endLine": 167, + "endColumn": 34, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "EncryptedSource", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.Engine", + "category": "Best Practice", + "startLine": 172, + "startColumn": 7, + "endLine": 172, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'StorageEncrypted' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "EncryptedSource", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.StorageEncrypted", + "category": "Best Practice", + "startLine": 173, + "startColumn": 7, + "endLine": 173, + "endColumn": 23, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "SourceInstanceReplica", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.Engine", + "category": "Best Practice", + "startLine": 178, + "startColumn": 7, + "endLine": 178, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'SourceDBInstanceIdentifier' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "SourceInstanceReplica", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.SourceDBInstanceIdentifier", + "category": "Best Practice", + "startLine": 179, + "startColumn": 7, + "endLine": 179, + "endColumn": 33, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only", + "resolutionSource": "Ref to 'EncryptedSource'" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "SourceResourceRestore", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.Engine", + "category": "Best Practice", + "startLine": 184, + "startColumn": 7, + "endLine": 184, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'SourceDbiResourceId' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "SourceResourceRestore", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.SourceDbiResourceId", + "category": "Best Practice", + "startLine": 185, + "startColumn": 7, + "endLine": 185, + "endColumn": 26, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "AutomatedBackupRestore", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.Engine", + "category": "Best Practice", + "startLine": 190, + "startColumn": 7, + "endLine": 190, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'SourceDBInstanceAutomatedBackupsArn' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "AutomatedBackupRestore", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.SourceDBInstanceAutomatedBackupsArn", + "category": "Best Practice", + "startLine": 191, + "startColumn": 7, + "endLine": 191, + "endColumn": 42, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "SourceClusterReplica", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.Engine", + "category": "Best Practice", + "startLine": 196, + "startColumn": 7, + "endLine": 196, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'SourceDBClusterIdentifier' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "SourceClusterReplica", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.SourceDBClusterIdentifier", + "category": "Best Practice", + "startLine": 197, + "startColumn": 7, + "endLine": 197, + "endColumn": 32, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only", + "resolutionSource": "Ref to 'Cluster'" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "CustomImplicitEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.Engine", + "category": "Best Practice", + "startLine": 202, + "startColumn": 7, + "endLine": 202, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "CustomTrueEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.Engine", + "category": "Best Practice", + "startLine": 207, + "startColumn": 7, + "endLine": 207, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'StorageEncrypted' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "CustomTrueEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.StorageEncrypted", + "category": "Best Practice", + "startLine": 208, + "startColumn": 7, + "endLine": 208, + "endColumn": 23, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "LegacySecurityGroups", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.Engine", + "category": "Best Practice", + "startLine": 213, + "startColumn": 7, + "endLine": 213, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "CorrelatedClusterOrEncryptedStandalone", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.Engine", + "category": "Best Practice", + "startLine": 219, + "startColumn": 7, + "endLine": 219, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'DBClusterIdentifier' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "CorrelatedClusterOrEncryptedStandalone", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.DBClusterIdentifier", + "category": "Best Practice", + "startLine": 220, + "startColumn": 7, + "endLine": 220, + "endColumn": 26, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Fn::If on condition 'UseClusterCondition'" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'StorageEncrypted' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "CorrelatedClusterOrEncryptedStandalone", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.StorageEncrypted", + "category": "Best Practice", + "startLine": 221, + "startColumn": 7, + "endLine": 221, + "endColumn": 23, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Fn::If on condition 'UseClusterCondition'" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConditionalSnapshotOrEncryptedStandalone", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.Engine", + "category": "Best Practice", + "startLine": 226, + "startColumn": 7, + "endLine": 226, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'DBSnapshotIdentifier' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConditionalSnapshotOrEncryptedStandalone", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.DBSnapshotIdentifier", + "category": "Best Practice", + "startLine": 227, + "startColumn": 7, + "endLine": 227, + "endColumn": 27, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only", + "resolutionSource": "Fn::If on condition 'UseClusterCondition'" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'StorageEncrypted' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConditionalSnapshotOrEncryptedStandalone", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.StorageEncrypted", + "category": "Best Practice", + "startLine": 228, + "startColumn": 7, + "endLine": 228, + "endColumn": 23, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Fn::If on condition 'UseClusterCondition'" + } + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Cluster' of type 'AWS::RDS::DBCluster' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "Cluster", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBCluster" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 26, + "startColumn": 5, + "endLine": 26, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'MissingEncryption' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "MissingEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 32, + "startColumn": 5, + "endLine": 32, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'KmsKeyWithoutEncryption' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "KmsKeyWithoutEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 37, + "startColumn": 5, + "endLine": 37, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'FalseEncryption' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "FalseEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 43, + "startColumn": 5, + "endLine": 43, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'StringFalseEncryption' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "StringFalseEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 49, + "startColumn": 5, + "endLine": 49, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'ConditionalFalseEncryption' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "ConditionalFalseEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 55, + "startColumn": 5, + "endLine": 55, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'ConditionalNoValueEncryption' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "ConditionalNoValueEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 61, + "startColumn": 5, + "endLine": 61, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'AllowedValuesEncryption' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "AllowedValuesEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 67, + "startColumn": 5, + "endLine": 67, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'EngineAllowedValuesMissingEncryption' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "EngineAllowedValuesMissingEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 73, + "startColumn": 5, + "endLine": 73, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'ConditionalClusterOrStandalone' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "ConditionalClusterOrStandalone", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 78, + "startColumn": 5, + "endLine": 78, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'CustomFalseEncryption' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "CustomFalseEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 84, + "startColumn": 5, + "endLine": 84, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'CustomStringFalseEncryption' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "CustomStringFalseEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 90, + "startColumn": 5, + "endLine": 90, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'TrueEncryption' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "TrueEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 96, + "startColumn": 5, + "endLine": 96, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'StringTrueEncryption' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "StringTrueEncryption", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 102, + "startColumn": 5, + "endLine": 102, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'ConditionalTrueEncryption' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "ConditionalTrueEncryption", + "entityType": "Resource", "resourceType": "AWS::RDS::DBInstance" }, "propertyPath": "Properties.Tags", @@ -16113,200 +20706,60 @@ "logicalId": "ClusterNodegroupDefaultCapacityDA0920A3", "entityType": "Resource", "resourceType": "AWS::EKS::Nodegroup" - }, - "propertyPath": "Properties.NodeRole", - "category": "Best Practice", - "startLine": 965, - "startColumn": 5, - "endLine": 965, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt ClusterNodegroupDefaultCapacityNodeGroupRole55953B04.Arn" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Subnets' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "ClusterNodegroupDefaultCapacityDA0920A3", - "entityType": "Resource", - "resourceType": "AWS::EKS::Nodegroup" - }, - "propertyPath": "Properties.Subnets", - "category": "Best Practice", - "startLine": 976, - "startColumn": 5, - "endLine": 976, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'UserRoleB7C3739B' of type 'AWS::IAM::Role' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "UserRoleB7C3739B", - "entityType": "Resource", - "resourceType": "AWS::IAM::Role" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 444, - "startColumn": 4, - "endLine": 444, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'ClusterKubectlHandlerRole94549F93' of type 'AWS::IAM::Role' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "ClusterKubectlHandlerRole94549F93", - "entityType": "Resource", - "resourceType": "AWS::IAM::Role" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 474, - "startColumn": 4, - "endLine": 474, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'ClusterControlPlaneSecurityGroupD274242C' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "ClusterControlPlaneSecurityGroupD274242C", - "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 595, - "startColumn": 4, - "endLine": 595, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'ClusterCreationRole360249B6' of type 'AWS::IAM::Role' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "ClusterCreationRole360249B6", - "entityType": "Resource", - "resourceType": "AWS::IAM::Role" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 616, - "startColumn": 4, - "endLine": 616, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'ClusterKubectlReadyBarrier200052AF' of type 'AWS::SSM::Parameter' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "ClusterKubectlReadyBarrier200052AF", - "entityType": "Resource", - "resourceType": "AWS::SSM::Parameter" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 882, - "startColumn": 4, - "endLine": 882, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'ClusterNodegroupDefaultCapacityNodeGroupRole55953B04' of type 'AWS::IAM::Role' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "ClusterNodegroupDefaultCapacityNodeGroupRole55953B04", - "entityType": "Resource", - "resourceType": "AWS::IAM::Role" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + }, + "propertyPath": "Properties.NodeRole", "category": "Best Practice", - "startLine": 896, - "startColumn": 4, - "endLine": 896, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 965, + "startColumn": 5, + "endLine": 965, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "GetAtt ClusterNodegroupDefaultCapacityNodeGroupRole55953B04.Arn" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'ClusterNodegroupDefaultCapacityDA0920A3' of type 'AWS::EKS::Nodegroup' supports Tags but none are configured", + "message": "Property 'Subnets' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { "logicalId": "ClusterNodegroupDefaultCapacityDA0920A3", "entityType": "Resource", "resourceType": "AWS::EKS::Nodegroup" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.Subnets", "category": "Best Practice", - "startLine": 956, - "startColumn": 4, - "endLine": 956, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 976, + "startColumn": 5, + "endLine": 976, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'awscdkawseksClusterResourceProviderNestedStackawscdkawseksClusterResourceProviderNestedStackResource9827C454' of type 'AWS::CloudFormation::Stack' supports Tags but none are configured", + "message": "Resource 'UserRoleB7C3739B' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "awscdkawseksClusterResourceProviderNestedStackawscdkawseksClusterResourceProviderNestedStackResource9827C454", + "logicalId": "UserRoleB7C3739B", "entityType": "Resource", - "resourceType": "AWS::CloudFormation::Stack" + "resourceType": "AWS::IAM::Role" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1035, + "startLine": 444, "startColumn": 4, - "endLine": 1035, + "endLine": 444, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -16314,359 +20767,175 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'awscdkawseksKubectlProviderNestedStackawscdkawseksKubectlProviderNestedStackResourceA7AEBA6B' of type 'AWS::CloudFormation::Stack' supports Tags but none are configured", + "message": "Resource 'ClusterKubectlHandlerRole94549F93' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "awscdkawseksKubectlProviderNestedStackawscdkawseksKubectlProviderNestedStackResourceA7AEBA6B", + "logicalId": "ClusterKubectlHandlerRole94549F93", "entityType": "Resource", - "resourceType": "AWS::CloudFormation::Stack" + "resourceType": "AWS::IAM::Role" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1058, + "startLine": 474, "startColumn": 4, - "endLine": 1058, + "endLine": 474, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" - } - ] - }, - "gh-issues/issue-54-bare.json": { - "filePath": "gh-issues/issue-54-bare.json", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 1, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Resource 'ClusterControlPlaneSecurityGroupD274242C' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Bucket", + "logicalId": "ClusterControlPlaneSecurityGroupD274242C", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::EC2::SecurityGroup" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 3, - "startColumn": 5, - "endLine": 3, - "endColumn": 12, + "startLine": 595, + "startColumn": 4, + "endLine": 595, + "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" - } - ] - }, - "gh-issues/issue-54-with-ownership.json": { - "filePath": "gh-issues/issue-54-with-ownership.json", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 1, - "informational": 1, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "W3045", - "severity": "WARN", - "message": "AccessControl property is deprecated. Use bucket policies instead", - "source": "CFN_LINT", - "entity": { - "logicalId": "Bucket", - "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" - }, - "propertyPath": "Properties.AccessControl", - "suggestedFix": "Remove AccessControl and use an AWS::S3::BucketPolicy resource", - "category": "Deprecation", - "startLine": 6, - "startColumn": 9, - "endLine": 6, - "endColumn": 23, - "ruleDescription": "Controlling access to an S3 bucket should be done with bucket policies", - "phase": "LINT", - "context": { - "actualValue": "PublicRead" - } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Resource 'ClusterCreationRole360249B6' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Bucket", + "logicalId": "ClusterCreationRole360249B6", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::IAM::Role" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 5, - "startColumn": 7, - "endLine": 5, - "endColumn": 18, + "startLine": 616, + "startColumn": 4, + "endLine": 616, + "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" - } - ] - }, - "gh-issues/issue-54.json": { - "filePath": "gh-issues/issue-54.json", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 1, - "informational": 1, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "E3045", - "severity": "ERROR", - "message": "A bucket with 'AccessControl' set should also have at least one 'OwnershipControl' configured", - "source": "CFN_LINT", - "entity": { - "logicalId": "Bucket", - "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" - }, - "propertyPath": "Properties", - "suggestedFix": "Add OwnershipControls to the bucket when using AccessControl", - "category": "Resource", - "startLine": 5, - "startColumn": 7, - "endLine": 5, - "endColumn": 18, - "ruleDescription": "Validate AccessControl are set with OwnershipControls", - "phase": "LINT" - }, - { - "ruleId": "W3045", - "severity": "WARN", - "message": "AccessControl property is deprecated. Use bucket policies instead", - "source": "CFN_LINT", - "entity": { - "logicalId": "Bucket", - "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" - }, - "propertyPath": "Properties.AccessControl", - "suggestedFix": "Remove AccessControl and use an AWS::S3::BucketPolicy resource", - "category": "Deprecation", - "startLine": 6, - "startColumn": 9, - "endLine": 6, - "endColumn": 23, - "ruleDescription": "Controlling access to an S3 bucket should be done with bucket policies", - "phase": "LINT", - "context": { - "actualValue": "PublicRead" - } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Resource 'ClusterKubectlReadyBarrier200052AF' of type 'AWS::SSM::Parameter' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Bucket", + "logicalId": "ClusterKubectlReadyBarrier200052AF", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::SSM::Parameter" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 5, - "startColumn": 7, - "endLine": 5, - "endColumn": 18, + "startLine": 882, + "startColumn": 4, + "endLine": 882, + "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" - } - ] - }, - "gh-issues/issue-55.json": { - "filePath": "gh-issues/issue-55.json", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 1, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Resource 'ClusterNodegroupDefaultCapacityNodeGroupRole55953B04' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Bucket", + "logicalId": "ClusterNodegroupDefaultCapacityNodeGroupRole55953B04", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::IAM::Role" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 12, - "startColumn": 7, - "endLine": 12, - "endColumn": 18, + "startLine": 896, + "startColumn": 4, + "endLine": 896, + "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" - } - ] - }, - "gh-issues/issue-56.json": { - "filePath": "gh-issues/issue-56.json", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 2, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'TopicName' is create-only; updating it will cause resource replacement", + "message": "Resource 'ClusterNodegroupDefaultCapacityDA0920A3' of type 'AWS::EKS::Nodegroup' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "WeakConsumer", + "logicalId": "ClusterNodegroupDefaultCapacityDA0920A3", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::EKS::Nodegroup" }, - "propertyPath": "Properties.TopicName", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 6, - "startColumn": 9, - "endLine": 6, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sns", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "dynamic (cross-stack output: StackName=\"Stack1\", Region=\"us-east-1\", OutputName=\"PublishOutputFnGetAttMyResourceArn8F315E6B\")" - } + "startLine": 956, + "startColumn": 4, + "endLine": 956, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'WeakConsumer' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'awscdkawseksClusterResourceProviderNestedStackawscdkawseksClusterResourceProviderNestedStackResource9827C454' of type 'AWS::CloudFormation::Stack' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "WeakConsumer", + "logicalId": "awscdkawseksClusterResourceProviderNestedStackawscdkawseksClusterResourceProviderNestedStackResource9827C454", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::CloudFormation::Stack" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 5, - "startColumn": 7, - "endLine": 5, - "endColumn": 18, + "startLine": 1035, + "startColumn": 4, + "endLine": 1035, + "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" - } - ] - }, - "gh-issues/issue-57.json": { - "filePath": "gh-issues/issue-57.json", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 1, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'AReallyAwesomeDistributionWithAMemorableNameThatIWillNeverForget046C0FA9' of type 'AWS::CloudFront::Distribution' supports Tags but none are configured", + "message": "Resource 'awscdkawseksKubectlProviderNestedStackawscdkawseksKubectlProviderNestedStackResourceA7AEBA6B' of type 'AWS::CloudFormation::Stack' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "AReallyAwesomeDistributionWithAMemorableNameThatIWillNeverForget046C0FA9", + "logicalId": "awscdkawseksKubectlProviderNestedStackawscdkawseksKubectlProviderNestedStackResourceA7AEBA6B", "entityType": "Resource", - "resourceType": "AWS::CloudFront::Distribution" + "resourceType": "AWS::CloudFormation::Stack" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 5, - "startColumn": 7, - "endLine": 5, - "endColumn": 18, + "startLine": 1058, + "startColumn": 4, + "endLine": 1058, + "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "gh-issues/issue-61.json": { - "filePath": "gh-issues/issue-61.json", + "gh-issues/issue-54-bare.json": { + "filePath": "gh-issues/issue-54-bare.json", "status": "OK", "metadata": { "resourcesScanned": 1, "counts": { - "fatal": 1, + "fatal": 0, "errors": 0, "warnings": 0, - "informational": 3, + "informational": 1, "debug": 0 }, "suppressed": 0, @@ -16674,164 +20943,15 @@ "severityLevel": "DEBUG" }, "diagnostics": [ - { - "ruleId": "F3017", - "severity": "FATAL", - "message": "Value is not valid under any of the 5 anyOf schemas for AWS::EC2::Volume (0 branches matched; at least one is required). Required property combinations: ['AvailabilityZone', 'Size'] or ['AvailabilityZone', 'SnapshotId'] or ['AvailabilityZoneId', 'Size'] or ['AvailabilityZoneId', 'SnapshotId'] or ['SourceVolumeId']. Branch failures: branch 1: 'AvailabilityZone' is a required property, 'Size' is a required property; branch 2: 'AvailabilityZone' is a required property, 'SnapshotId' is a required property; branch 3: 'AvailabilityZoneId' is a required property, 'Size' is a required property; branch 4: 'AvailabilityZoneId' is a required property, 'SnapshotId' is a required property; branch 5: 'SourceVolumeId' is a required property.", - "source": "SCHEMA", - "entity": { - "logicalId": "Resource", - "entityType": "Resource", - "resourceType": "AWS::EC2::Volume" - }, - "propertyPath": "Properties", - "category": "Schema", - "startLine": 3, - "startColumn": 5, - "endLine": 3, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Value not valid under anyOf", - "phase": "SCHEMA", - "context": { - "expectedConstraint": "at least one anyOf branch", - "extra": { - "branchCount": 5, - "branchFailures": [ - { - "branch": 1, - "reasons": [ - { - "message": "'AvailabilityZone' is a required property", - "propertyPath": "Properties" - }, - { - "message": "'Size' is a required property", - "propertyPath": "Properties" - } - ] - }, - { - "branch": 2, - "reasons": [ - { - "message": "'AvailabilityZone' is a required property", - "propertyPath": "Properties" - }, - { - "message": "'SnapshotId' is a required property", - "propertyPath": "Properties" - } - ] - }, - { - "branch": 3, - "reasons": [ - { - "message": "'AvailabilityZoneId' is a required property", - "propertyPath": "Properties" - }, - { - "message": "'Size' is a required property", - "propertyPath": "Properties" - } - ] - }, - { - "branch": 4, - "reasons": [ - { - "message": "'AvailabilityZoneId' is a required property", - "propertyPath": "Properties" - }, - { - "message": "'SnapshotId' is a required property", - "propertyPath": "Properties" - } - ] - }, - { - "branch": 5, - "reasons": [ - { - "message": "'SourceVolumeId' is a required property", - "propertyPath": "Properties" - } - ] - } - ], - "compositionKind": "anyOf", - "matchCount": 0, - "matchOutcome": "zeroMatches", - "validPropertyCombinations": [ - [ - "AvailabilityZone", - "Size" - ], - [ - "AvailabilityZone", - "SnapshotId" - ], - [ - "AvailabilityZoneId", - "Size" - ], - [ - "AvailabilityZoneId", - "SnapshotId" - ], - [ - "SourceVolumeId" - ] - ] - } - } - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "Resource", - "entityType": "Resource", - "resourceType": "AWS::EC2::Volume" - }, - "category": "Best Practice", - "startLine": 3, - "startColumn": 5, - "endLine": 3, - "endColumn": 14, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "Resource", - "entityType": "Resource", - "resourceType": "AWS::EC2::Volume" - }, - "category": "Best Practice", - "startLine": 3, - "startColumn": 5, - "endLine": 3, - "endColumn": 14, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Resource' of type 'AWS::EC2::Volume' supports Tags but none are configured", + "message": "Resource 'Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Resource", + "logicalId": "Bucket", "entityType": "Resource", - "resourceType": "AWS::EC2::Volume" + "resourceType": "AWS::S3::Bucket" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", @@ -16839,22 +20959,22 @@ "startLine": 3, "startColumn": 5, "endLine": 3, - "endColumn": 14, + "endColumn": 12, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "gh-issues/issue-62.json": { - "filePath": "gh-issues/issue-62.json", + "gh-issues/issue-54-with-ownership.json": { + "filePath": "gh-issues/issue-54-with-ownership.json", "status": "OK", "metadata": { "resourcesScanned": 1, "counts": { - "fatal": 1, + "fatal": 0, "errors": 0, - "warnings": 2, - "informational": 3, + "warnings": 1, + "informational": 1, "debug": 0 }, "suppressed": 0, @@ -16863,120 +20983,119 @@ }, "diagnostics": [ { - "ruleId": "F3032", - "severity": "FATAL", - "message": "expected minimum item count: 1, found: 0", - "source": "SCHEMA", + "ruleId": "W3045", + "severity": "WARN", + "message": "AccessControl property is deprecated. Use bucket policies instead", + "source": "CFN_LINT", "entity": { - "logicalId": "Canary", + "logicalId": "Bucket", "entityType": "Resource", - "resourceType": "AWS::Synthetics::Canary" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.ResourcesToReplicateTags", - "category": "Schema", - "startLine": 18, + "propertyPath": "Properties.AccessControl", + "suggestedFix": "Remove AccessControl and use an AWS::S3::BucketPolicy resource", + "category": "Deprecation", + "startLine": 6, "startColumn": 9, - "endLine": 18, - "endColumn": 34, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-synthetics", - "ruleDescription": "Array item count out of bounds", - "phase": "SCHEMA", + "endLine": 6, + "endColumn": 23, + "ruleDescription": "Controlling access to an S3 bucket should be done with bucket policies", + "phase": "LINT", "context": { - "extra": { - "actual_count": 0, - "max_items": 1, - "min_items": 1 - } + "actualValue": "PublicRead" } }, { - "ruleId": "W9002", - "severity": "WARN", - "message": "Property 'ExecutionRoleArn' has a hardcoded ARN - use Ref, GetAtt, or a parameter instead", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Canary", + "logicalId": "Bucket", "entityType": "Resource", - "resourceType": "AWS::Synthetics::Canary" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.ExecutionRoleArn", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 8, - "startColumn": 9, - "endLine": 8, - "endColumn": 26, - "ruleDescription": "Hardcoded ARN property", - "phase": "LINT" - }, - { - "ruleId": "W9013", - "severity": "WARN", - "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", - "source": "ENGINE", - "entity": { - "logicalId": "Canary", - "entityType": "Resource", - "resourceType": "AWS::Synthetics::Canary" - }, - "category": "Security", - "startLine": 3, - "startColumn": 5, - "endLine": 3, - "endColumn": 12, - "ruleDescription": "Hardcoded account ID in ARN", + "startLine": 5, + "startColumn": 7, + "endLine": 5, + "endColumn": 18, + "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "gh-issues/issue-54.json": { + "filePath": "gh-issues/issue-54.json", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 1, + "warnings": 1, + "informational": 1, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I3013", - "severity": "INFO", - "message": "'SuccessRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "ruleId": "E3045", + "severity": "ERROR", + "message": "A bucket with 'AccessControl' set should also have at least one 'OwnershipControl' configured", "source": "CFN_LINT", "entity": { - "logicalId": "Canary", + "logicalId": "Bucket", "entityType": "Resource", - "resourceType": "AWS::Synthetics::Canary" + "resourceType": "AWS::S3::Bucket" }, "propertyPath": "Properties", - "category": "Best Practice", + "suggestedFix": "Add OwnershipControls to the bucket when using AccessControl", + "category": "Resource", "startLine": 5, "startColumn": 7, "endLine": 5, "endColumn": 18, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "ruleDescription": "Validate AccessControl are set with OwnershipControls", "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Name' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W3045", + "severity": "WARN", + "message": "AccessControl property is deprecated. Use bucket policies instead", + "source": "CFN_LINT", "entity": { - "logicalId": "Canary", + "logicalId": "Bucket", "entityType": "Resource", - "resourceType": "AWS::Synthetics::Canary" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.Name", - "category": "Best Practice", + "propertyPath": "Properties.AccessControl", + "suggestedFix": "Remove AccessControl and use an AWS::S3::BucketPolicy resource", + "category": "Deprecation", "startLine": 6, "startColumn": 9, "endLine": 6, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-synthetics", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", + "endColumn": 23, + "ruleDescription": "Controlling access to an S3 bucket should be done with bucket policies", + "phase": "LINT", "context": { - "lifecycle": "create-only" + "actualValue": "PublicRead" } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Canary' of type 'AWS::Synthetics::Canary' supports Tags but none are configured", + "message": "Resource 'Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Canary", + "logicalId": "Bucket", "entityType": "Resource", - "resourceType": "AWS::Synthetics::Canary" + "resourceType": "AWS::S3::Bucket" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", @@ -16990,14 +21109,14 @@ } ] }, - "gh-issues/issue-63.json": { - "filePath": "gh-issues/issue-63.json", + "gh-issues/issue-55.json": { + "filePath": "gh-issues/issue-55.json", "status": "OK", "metadata": { "resourcesScanned": 1, "counts": { "fatal": 0, - "errors": 1, + "errors": 0, "warnings": 0, "informational": 1, "debug": 0 @@ -17008,55 +21127,139 @@ }, "diagnostics": [ { - "ruleId": "E2001", - "severity": "ERROR", - "message": "Parameter 'SomeParameter': Default must be a string", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "SomeParameter", - "entityType": "Parameter" + "logicalId": "Bucket", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Parameters/SomeParameter/Default", - "category": "Parameter", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 12, + "startColumn": 7, + "endLine": 12, + "endColumn": 18, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "gh-issues/issue-56.json": { + "filePath": "gh-issues/issue-56.json", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 2, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'TopicName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "WeakConsumer", + "entityType": "Resource", + "resourceType": "AWS::SNS::Topic" + }, + "propertyPath": "Properties.TopicName", + "category": "Best Practice", + "startLine": 6, + "startColumn": 9, + "endLine": 6, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sns", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "dynamic (cross-stack output: StackName=\"Stack1\", Region=\"us-east-1\", OutputName=\"PublishOutputFnGetAttMyResourceArn8F315E6B\")" + } + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'WeakConsumer' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "WeakConsumer", + "entityType": "Resource", + "resourceType": "AWS::SNS::Topic" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", "startLine": 5, "startColumn": 7, "endLine": 5, - "endColumn": 15, - "ruleDescription": "Parameters have appropriate properties", - "phase": "PARSE" + "endColumn": 18, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "gh-issues/issue-57.json": { + "filePath": "gh-issues/issue-57.json", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 1, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Topic' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'AReallyAwesomeDistributionWithAMemorableNameThatIWillNeverForget046C0FA9' of type 'AWS::CloudFront::Distribution' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Topic", + "logicalId": "AReallyAwesomeDistributionWithAMemorableNameThatIWillNeverForget046C0FA9", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::CloudFront::Distribution" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 29, + "startLine": 5, "startColumn": 7, - "endLine": 29, + "endLine": 5, "endColumn": 18, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "gh-issues/issue-65.json": { - "filePath": "gh-issues/issue-65.json", + "gh-issues/issue-61.json": { + "filePath": "gh-issues/issue-61.json", "status": "OK", "metadata": { - "resourcesScanned": 2, + "resourcesScanned": 1, "counts": { - "fatal": 0, + "fatal": 1, "errors": 0, - "warnings": 2, - "informational": 6, + "warnings": 0, + "informational": 3, "debug": 0 }, "suppressed": 0, @@ -17065,189 +21268,186 @@ }, "diagnostics": [ { - "ruleId": "W2531", - "severity": "WARN", - "message": "Runtime 'nodejs18.x' was deprecated on '2025-09-01'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'nodejs24.x'", - "source": "CFN_LINT", - "entity": { - "logicalId": "MyLambda", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 7, - "startColumn": 9, - "endLine": 7, - "endColumn": 17, - "ruleDescription": "Check if EOL Lambda Function Runtimes are used", - "phase": "SCHEMA", - "context": { - "actualValue": "nodejs18.x", - "lifecycle": "deprecated" - } - }, - { - "ruleId": "W9013", - "severity": "WARN", - "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", - "source": "ENGINE", + "ruleId": "F3017", + "severity": "FATAL", + "message": "Value is not valid under any of the 5 anyOf schemas for AWS::EC2::Volume (0 branches matched; at least one is required). Required property combinations: ['AvailabilityZone', 'Size'] or ['AvailabilityZone', 'SnapshotId'] or ['AvailabilityZoneId', 'Size'] or ['AvailabilityZoneId', 'SnapshotId'] or ['SourceVolumeId']. Branch failures: branch 1: 'AvailabilityZone' is a required property, 'Size' is a required property; branch 2: 'AvailabilityZone' is a required property, 'SnapshotId' is a required property; branch 3: 'AvailabilityZoneId' is a required property, 'Size' is a required property; branch 4: 'AvailabilityZoneId' is a required property, 'SnapshotId' is a required property; branch 5: 'SourceVolumeId' is a required property.", + "source": "SCHEMA", "entity": { - "logicalId": "MyLambda", + "logicalId": "Resource", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::EC2::Volume" }, - "category": "Security", + "propertyPath": "Properties", + "category": "Schema", "startLine": 3, "startColumn": 5, "endLine": 3, "endColumn": 14, - "ruleDescription": "Hardcoded account ID in ARN", - "phase": "LINT" - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "MyLambda", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "Properties.FunctionName", - "category": "Best Practice", - "startLine": 6, - "startColumn": 9, - "endLine": 6, - "endColumn": 22, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Action' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "S3Permission", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" - }, - "propertyPath": "Properties.Action", - "category": "Best Practice", - "startLine": 18, - "startColumn": 9, - "endLine": 18, - "endColumn": 16, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "S3Permission", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" - }, - "propertyPath": "Properties.FunctionName", - "category": "Best Practice", - "startLine": 19, - "startColumn": 9, - "endLine": 19, - "endColumn": 22, - "ruleDescription": "Create-only property updated triggers resource replacement", + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Value not valid under anyOf", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'MyLambda'" + "expectedConstraint": "at least one anyOf branch", + "extra": { + "branchCount": 5, + "branchFailures": [ + { + "branch": 1, + "reasons": [ + { + "message": "'AvailabilityZone' is a required property", + "propertyPath": "Properties" + }, + { + "message": "'Size' is a required property", + "propertyPath": "Properties" + } + ] + }, + { + "branch": 2, + "reasons": [ + { + "message": "'AvailabilityZone' is a required property", + "propertyPath": "Properties" + }, + { + "message": "'SnapshotId' is a required property", + "propertyPath": "Properties" + } + ] + }, + { + "branch": 3, + "reasons": [ + { + "message": "'AvailabilityZoneId' is a required property", + "propertyPath": "Properties" + }, + { + "message": "'Size' is a required property", + "propertyPath": "Properties" + } + ] + }, + { + "branch": 4, + "reasons": [ + { + "message": "'AvailabilityZoneId' is a required property", + "propertyPath": "Properties" + }, + { + "message": "'SnapshotId' is a required property", + "propertyPath": "Properties" + } + ] + }, + { + "branch": 5, + "reasons": [ + { + "message": "'SourceVolumeId' is a required property", + "propertyPath": "Properties" + } + ] + } + ], + "compositionKind": "anyOf", + "matchCount": 0, + "matchOutcome": "zeroMatches", + "validPropertyCombinations": [ + [ + "AvailabilityZone", + "Size" + ], + [ + "AvailabilityZone", + "SnapshotId" + ], + [ + "AvailabilityZoneId", + "Size" + ], + [ + "AvailabilityZoneId", + "SnapshotId" + ], + [ + "SourceVolumeId" + ] + ] + } } }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'Principal' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "S3Permission", + "logicalId": "Resource", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::EC2::Volume" }, - "propertyPath": "Properties.Principal", "category": "Best Practice", - "startLine": 20, - "startColumn": 9, - "endLine": 20, - "endColumn": 19, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 3, + "startColumn": 5, + "endLine": 3, + "endColumn": 14, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'SourceAccount' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "S3Permission", + "logicalId": "Resource", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::EC2::Volume" }, - "propertyPath": "Properties.SourceAccount", "category": "Best Practice", - "startLine": 21, - "startColumn": 9, - "endLine": 21, - "endColumn": 23, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 3, + "startColumn": 5, + "endLine": 3, + "endColumn": 14, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'MyLambda' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "message": "Resource 'Resource' of type 'AWS::EC2::Volume' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "MyLambda", + "logicalId": "Resource", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::EC2::Volume" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 5, - "startColumn": 7, - "endLine": 5, - "endColumn": 18, + "startLine": 3, + "startColumn": 5, + "endLine": 3, + "endColumn": 14, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "gh-issues/issue-67.json": { - "filePath": "gh-issues/issue-67.json", + "gh-issues/issue-62.json": { + "filePath": "gh-issues/issue-62.json", "status": "OK", "metadata": { "resourcesScanned": 1, "counts": { - "fatal": 0, + "fatal": 1, "errors": 0, - "warnings": 0, - "informational": 2, + "warnings": 2, + "informational": 3, "debug": 0 }, "suppressed": 0, @@ -17256,237 +21456,228 @@ }, "diagnostics": [ { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'AlarmName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "F3032", + "severity": "FATAL", + "message": "expected minimum item count: 1, found: 0", + "source": "SCHEMA", "entity": { - "logicalId": "PromAlarm", + "logicalId": "Canary", "entityType": "Resource", - "resourceType": "AWS::CloudWatch::Alarm" + "resourceType": "AWS::Synthetics::Canary" }, - "propertyPath": "Properties.AlarmName", - "category": "Best Practice", - "startLine": 6, + "propertyPath": "Properties.ResourcesToReplicateTags", + "category": "Schema", + "startLine": 18, "startColumn": 9, - "endLine": 6, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-cloudwatch.git", - "ruleDescription": "Create-only property updated triggers resource replacement", + "endLine": 18, + "endColumn": 34, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-synthetics", + "ruleDescription": "Array item count out of bounds", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "extra": { + "actual_count": 0, + "max_items": 1, + "min_items": 1 + } } }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'PromAlarm' of type 'AWS::CloudWatch::Alarm' supports Tags but none are configured", + "ruleId": "W9002", + "severity": "WARN", + "message": "Property 'ExecutionRoleArn' has a hardcoded ARN - use Ref, GetAtt, or a parameter instead", "source": "ENGINE", "entity": { - "logicalId": "PromAlarm", + "logicalId": "Canary", "entityType": "Resource", - "resourceType": "AWS::CloudWatch::Alarm" + "resourceType": "AWS::Synthetics::Canary" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.ExecutionRoleArn", "category": "Best Practice", - "startLine": 5, - "startColumn": 7, - "endLine": 5, - "endColumn": 18, - "ruleDescription": "Resource should have Tags", + "startLine": 8, + "startColumn": 9, + "endLine": 8, + "endColumn": 26, + "ruleDescription": "Hardcoded ARN property", "phase": "LINT" - } - ] - }, - "gh-issues/issue-68.json": { - "filePath": "gh-issues/issue-68.json", - "status": "OK", - "metadata": { - "resourcesScanned": 2, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 4, - "informational": 4, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "E3677", - "severity": "ERROR", - "message": "Runtime 'node99.x' is not supported with Code.ZipFile - use nodejs or python", - "source": "CFN_LINT", + "ruleId": "W9013", + "severity": "WARN", + "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", + "source": "ENGINE", "entity": { - "logicalId": "FutureNodeFunc", + "logicalId": "Canary", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::Synthetics::Canary" }, - "category": "Resource", - "startLine": 16, + "category": "Security", + "startLine": 3, "startColumn": 5, - "endLine": 16, - "endColumn": 20, - "ruleDescription": "Lambda ZipFile requires nodejs or python runtime", + "endLine": 3, + "endColumn": 12, + "ruleDescription": "Hardcoded account ID in ARN", "phase": "LINT" }, { - "ruleId": "W3030", - "severity": "WARN", - "message": "'nodejs99.x' is not one of ['dotnet10', 'dotnet6', 'dotnet8', 'dotnetcore1.0', 'dotnetcore2.0', 'dotnetcore2.1', 'dotnetcore3.1', 'go1.x', 'java11', 'java11.al2023', 'java17', 'java17.al2023', 'java21', 'java25', 'java8', 'java8.al2', 'java8.al2023', 'nodejs', 'nodejs10.x', 'nodejs12.x', 'nodejs14.x', 'nodejs16.x', 'nodejs18.x', 'nodejs20.x', 'nodejs22.x', 'nodejs24.x', 'nodejs26.x', 'nodejs4.3', 'nodejs4.3-edge', 'nodejs6.10', 'nodejs8.10', 'provided', 'provided.al2', 'provided.al2023', 'python2.7', 'python3.10', 'python3.11', 'python3.12', 'python3.13', 'python3.14', 'python3.15', 'python3.6', 'python3.7', 'python3.8', 'python3.9', 'ruby2.5', 'ruby2.7', 'ruby3.2', 'ruby3.3', 'ruby3.4', 'ruby4.0']", + "ruleId": "I3013", + "severity": "INFO", + "message": "'SuccessRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", "source": "CFN_LINT", "entity": { - "logicalId": "MyFunc", + "logicalId": "Canary", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::Synthetics::Canary" }, - "propertyPath": "Properties.Runtime", - "category": "Schema", - "startLine": 10, + "propertyPath": "Properties", + "category": "Best Practice", + "startLine": 5, + "startColumn": 7, + "endLine": 5, + "endColumn": 18, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "phase": "LINT" + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Name' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "Canary", + "entityType": "Resource", + "resourceType": "AWS::Synthetics::Canary" + }, + "propertyPath": "Properties.Name", + "category": "Best Practice", + "startLine": 6, "startColumn": 9, - "endLine": 10, - "endColumn": 17, - "ruleDescription": "Value not in allowed enum", + "endLine": 6, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-synthetics", + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "actualValue": "nodejs99.x", - "extra": { - "allowed_values": [ - "dotnet10", - "dotnet6", - "dotnet8", - "dotnetcore1.0", - "dotnetcore2.0", - "dotnetcore2.1", - "dotnetcore3.1", - "go1.x", - "java11", - "java11.al2023", - "java17", - "java17.al2023", - "java21", - "java25", - "java8", - "java8.al2", - "java8.al2023", - "nodejs", - "nodejs10.x", - "nodejs12.x", - "nodejs14.x", - "nodejs16.x", - "nodejs18.x", - "nodejs20.x", - "nodejs22.x", - "nodejs24.x", - "nodejs26.x", - "nodejs4.3", - "nodejs4.3-edge", - "nodejs6.10", - "nodejs8.10", - "provided", - "provided.al2", - "provided.al2023", - "python2.7", - "python3.10", - "python3.11", - "python3.12", - "python3.13", - "python3.14", - "python3.15", - "python3.6", - "python3.7", - "python3.8", - "python3.9", - "ruby2.5", - "ruby2.7", - "ruby3.2", - "ruby3.3", - "ruby3.4", - "ruby4.0" - ] - } + "lifecycle": "create-only" } }, { - "ruleId": "W3030", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Canary' of type 'AWS::Synthetics::Canary' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "Canary", + "entityType": "Resource", + "resourceType": "AWS::Synthetics::Canary" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 5, + "startColumn": 7, + "endLine": 5, + "endColumn": 18, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "gh-issues/issue-63.json": { + "filePath": "gh-issues/issue-63.json", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 1, + "warnings": 0, + "informational": 1, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "E2001", + "severity": "ERROR", + "message": "Parameter 'SomeParameter': Default must be a string", + "source": "CFN_LINT", + "entity": { + "logicalId": "SomeParameter", + "entityType": "Parameter" + }, + "propertyPath": "Parameters/SomeParameter/Default", + "category": "Parameter", + "startLine": 5, + "startColumn": 7, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Parameters have appropriate properties", + "phase": "PARSE" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Topic' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "Topic", + "entityType": "Resource", + "resourceType": "AWS::SNS::Topic" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 29, + "startColumn": 7, + "endLine": 29, + "endColumn": 18, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "gh-issues/issue-65.json": { + "filePath": "gh-issues/issue-65.json", + "status": "OK", + "metadata": { + "resourcesScanned": 2, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 2, + "informational": 6, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "W2531", "severity": "WARN", - "message": "'node99.x' is not one of ['dotnet10', 'dotnet6', 'dotnet8', 'dotnetcore1.0', 'dotnetcore2.0', 'dotnetcore2.1', 'dotnetcore3.1', 'go1.x', 'java11', 'java11.al2023', 'java17', 'java17.al2023', 'java21', 'java25', 'java8', 'java8.al2', 'java8.al2023', 'nodejs', 'nodejs10.x', 'nodejs12.x', 'nodejs14.x', 'nodejs16.x', 'nodejs18.x', 'nodejs20.x', 'nodejs22.x', 'nodejs24.x', 'nodejs26.x', 'nodejs4.3', 'nodejs4.3-edge', 'nodejs6.10', 'nodejs8.10', 'provided', 'provided.al2', 'provided.al2023', 'python2.7', 'python3.10', 'python3.11', 'python3.12', 'python3.13', 'python3.14', 'python3.15', 'python3.6', 'python3.7', 'python3.8', 'python3.9', 'ruby2.5', 'ruby2.7', 'ruby3.2', 'ruby3.3', 'ruby3.4', 'ruby4.0']", + "message": "Runtime 'nodejs18.x' was deprecated on '2025-09-01'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'nodejs24.x'", "source": "CFN_LINT", "entity": { - "logicalId": "FutureNodeFunc", + "logicalId": "MyLambda", "entityType": "Resource", "resourceType": "AWS::Lambda::Function" }, "propertyPath": "Properties.Runtime", - "category": "Schema", - "startLine": 22, + "category": "Deprecation", + "startLine": 7, "startColumn": 9, - "endLine": 22, + "endLine": 7, "endColumn": 17, - "ruleDescription": "Value not in allowed enum", + "ruleDescription": "Check if EOL Lambda Function Runtimes are used", "phase": "SCHEMA", "context": { - "actualValue": "node99.x", - "extra": { - "allowed_values": [ - "dotnet10", - "dotnet6", - "dotnet8", - "dotnetcore1.0", - "dotnetcore2.0", - "dotnetcore2.1", - "dotnetcore3.1", - "go1.x", - "java11", - "java11.al2023", - "java17", - "java17.al2023", - "java21", - "java25", - "java8", - "java8.al2", - "java8.al2023", - "nodejs", - "nodejs10.x", - "nodejs12.x", - "nodejs14.x", - "nodejs16.x", - "nodejs18.x", - "nodejs20.x", - "nodejs22.x", - "nodejs24.x", - "nodejs26.x", - "nodejs4.3", - "nodejs4.3-edge", - "nodejs6.10", - "nodejs8.10", - "provided", - "provided.al2", - "provided.al2023", - "python2.7", - "python3.10", - "python3.11", - "python3.12", - "python3.13", - "python3.14", - "python3.15", - "python3.6", - "python3.7", - "python3.8", - "python3.9", - "ruby2.5", - "ruby2.7", - "ruby3.2", - "ruby3.3", - "ruby3.4", - "ruby4.0" - ] - } + "actualValue": "nodejs18.x", + "lifecycle": "deprecated" } }, { @@ -17495,52 +21686,56 @@ "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", "source": "ENGINE", "entity": { - "logicalId": "MyFunc", + "logicalId": "MyLambda", "entityType": "Resource", "resourceType": "AWS::Lambda::Function" }, "category": "Security", - "startLine": 4, + "startLine": 3, "startColumn": 5, - "endLine": 4, - "endColumn": 12, + "endLine": 3, + "endColumn": 14, "ruleDescription": "Hardcoded account ID in ARN", "phase": "LINT" }, { - "ruleId": "W9013", - "severity": "WARN", - "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FutureNodeFunc", + "logicalId": "MyLambda", "entityType": "Resource", "resourceType": "AWS::Lambda::Function" }, - "category": "Security", - "startLine": 16, - "startColumn": 5, - "endLine": 16, - "endColumn": 20, - "ruleDescription": "Hardcoded account ID in ARN", - "phase": "LINT" + "propertyPath": "Properties.FunctionName", + "category": "Best Practice", + "startLine": 6, + "startColumn": 9, + "endLine": 6, + "endColumn": 22, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "message": "Property 'Action' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MyFunc", + "logicalId": "S3Permission", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::Lambda::Permission" }, - "propertyPath": "Properties.FunctionName", + "propertyPath": "Properties.Action", "category": "Best Practice", - "startLine": 7, + "startLine": 18, "startColumn": 9, - "endLine": 7, - "endColumn": 22, + "endLine": 18, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -17553,9 +21748,9 @@ "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FutureNodeFunc", + "logicalId": "S3Permission", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::Lambda::Permission" }, "propertyPath": "Properties.FunctionName", "category": "Best Practice", @@ -17565,62 +21760,87 @@ "endColumn": 22, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'MyLambda'" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Principal' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "S3Permission", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties.Principal", + "category": "Best Practice", + "startLine": 20, + "startColumn": 9, + "endLine": 20, + "endColumn": 19, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", "context": { "lifecycle": "create-only" } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'MyFunc' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "message": "Property 'SourceAccount' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MyFunc", + "logicalId": "S3Permission", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::Lambda::Permission" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.SourceAccount", "category": "Best Practice", - "startLine": 6, - "startColumn": 7, - "endLine": 6, - "endColumn": 18, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 21, + "startColumn": 9, + "endLine": 21, + "endColumn": 23, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'FutureNodeFunc' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "message": "Resource 'MyLambda' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "FutureNodeFunc", + "logicalId": "MyLambda", "entityType": "Resource", "resourceType": "AWS::Lambda::Function" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 18, + "startLine": 5, "startColumn": 7, - "endLine": 18, + "endLine": 5, "endColumn": 18, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "gh-issues/issue-69.yaml": { - "filePath": "gh-issues/issue-69.yaml", + "gh-issues/issue-67.json": { + "filePath": "gh-issues/issue-67.json", "status": "OK", "metadata": { "resourcesScanned": 1, "counts": { - "fatal": 2, + "fatal": 0, "errors": 0, "warnings": 0, - "informational": 0, + "informational": 2, "debug": 0 }, "suppressed": 0, @@ -17629,68 +21849,60 @@ }, "diagnostics": [ { - "ruleId": "F3032", - "severity": "FATAL", - "message": "expected maximum item count: 1, found: 2", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'AlarmName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Profile", + "logicalId": "PromAlarm", "entityType": "Resource", - "resourceType": "AWS::IAM::InstanceProfile" + "resourceType": "AWS::CloudWatch::Alarm" }, - "propertyPath": "Properties.Roles", - "category": "Schema", + "propertyPath": "Properties.AlarmName", + "category": "Best Practice", "startLine": 6, - "startColumn": 7, + "startColumn": 9, "endLine": 6, - "endColumn": 12, - "ruleDescription": "Array item count out of bounds", + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-cloudwatch.git", + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "extra": { - "actual_count": 2, - "max_items": 1, - "min_items": 0 - } + "lifecycle": "create-only" } }, { - "ruleId": "F3037", - "severity": "FATAL", - "message": "Array items are not unique", - "source": "SCHEMA", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'PromAlarm' of type 'AWS::CloudWatch::Alarm' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Profile", + "logicalId": "PromAlarm", "entityType": "Resource", - "resourceType": "AWS::IAM::InstanceProfile" + "resourceType": "AWS::CloudWatch::Alarm" }, - "propertyPath": "Properties.Roles", - "category": "Schema", - "startLine": 6, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 5, "startColumn": 7, - "endLine": 6, - "endColumn": 12, - "ruleDescription": "Array items not unique", - "phase": "SCHEMA", - "context": { - "actualValue": [ - "arn:aws:iam::012345678901:role/SameRole", - "arn:aws:iam::012345678901:role/SameRole" - ] - } + "endLine": 5, + "endColumn": 18, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" } ] }, - "good/E3019_identity_no_false_positive.yaml": { - "filePath": "good/E3019_identity_no_false_positive.yaml", + "gh-issues/issue-68.json": { + "filePath": "gh-issues/issue-68.json", "status": "OK", "metadata": { - "resourcesScanned": 5, + "resourcesScanned": 2, "counts": { "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 10, + "errors": 1, + "warnings": 4, + "informational": 4, "debug": 0 }, "suppressed": 0, @@ -17699,385 +21911,371 @@ }, "diagnostics": [ { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "BucketA", - "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" - }, - "propertyPath": "Properties.BucketName", - "category": "Best Practice", - "startLine": 13, - "startColumn": 18, - "endLine": 13, - "endColumn": 28, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter 'NameA' (type String)" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E3677", + "severity": "ERROR", + "message": "Runtime 'node99.x' is not supported with Code.ZipFile - use nodejs or python", + "source": "CFN_LINT", "entity": { - "logicalId": "BucketB", + "logicalId": "FutureNodeFunc", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.BucketName", - "category": "Best Practice", + "category": "Resource", "startLine": 16, - "startColumn": 18, + "startColumn": 5, "endLine": 16, - "endColumn": 28, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter 'NameB' (type String)" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "CompoundSub", - "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" - }, - "propertyPath": "Properties.BucketName", - "category": "Best Practice", - "startLine": 20, - "startColumn": 18, - "endLine": 20, - "endColumn": 28, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "dynamic (Sub:${NameA}-suffix)" - } + "endColumn": 20, + "ruleDescription": "Lambda ZipFile requires nodejs or python runtime", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W3030", + "severity": "WARN", + "message": "'nodejs99.x' is not one of ['dotnet10', 'dotnet6', 'dotnet8', 'dotnetcore1.0', 'dotnetcore2.0', 'dotnetcore2.1', 'dotnetcore3.1', 'go1.x', 'java11', 'java11.al2023', 'java17', 'java17.al2023', 'java21', 'java25', 'java8', 'java8.al2', 'java8.al2023', 'nodejs', 'nodejs10.x', 'nodejs12.x', 'nodejs14.x', 'nodejs16.x', 'nodejs18.x', 'nodejs20.x', 'nodejs22.x', 'nodejs24.x', 'nodejs26.x', 'nodejs4.3', 'nodejs4.3-edge', 'nodejs6.10', 'nodejs8.10', 'provided', 'provided.al2', 'provided.al2023', 'python2.7', 'python3.10', 'python3.11', 'python3.12', 'python3.13', 'python3.14', 'python3.15', 'python3.6', 'python3.7', 'python3.8', 'python3.9', 'ruby2.5', 'ruby2.7', 'ruby3.2', 'ruby3.3', 'ruby3.4', 'ruby4.0']", + "source": "CFN_LINT", "entity": { - "logicalId": "ConditionalLeft", + "logicalId": "MyFunc", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.BucketName", - "category": "Best Practice", - "startLine": 25, - "startColumn": 18, - "endLine": 25, - "endColumn": 28, - "ruleDescription": "Create-only property updated triggers resource replacement", + "propertyPath": "Properties.Runtime", + "category": "Schema", + "startLine": 10, + "startColumn": 9, + "endLine": 10, + "endColumn": 17, + "ruleDescription": "Value not in allowed enum", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "actualValue": "nodejs99.x", + "extra": { + "allowed_values": [ + "dotnet10", + "dotnet6", + "dotnet8", + "dotnetcore1.0", + "dotnetcore2.0", + "dotnetcore2.1", + "dotnetcore3.1", + "go1.x", + "java11", + "java11.al2023", + "java17", + "java17.al2023", + "java21", + "java25", + "java8", + "java8.al2", + "java8.al2023", + "nodejs", + "nodejs10.x", + "nodejs12.x", + "nodejs14.x", + "nodejs16.x", + "nodejs18.x", + "nodejs20.x", + "nodejs22.x", + "nodejs24.x", + "nodejs26.x", + "nodejs4.3", + "nodejs4.3-edge", + "nodejs6.10", + "nodejs8.10", + "provided", + "provided.al2", + "provided.al2023", + "python2.7", + "python3.10", + "python3.11", + "python3.12", + "python3.13", + "python3.14", + "python3.15", + "python3.6", + "python3.7", + "python3.8", + "python3.9", + "ruby2.5", + "ruby2.7", + "ruby3.2", + "ruby3.3", + "ruby3.4", + "ruby4.0" + ] + } } }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + { + "ruleId": "W3030", + "severity": "WARN", + "message": "'node99.x' is not one of ['dotnet10', 'dotnet6', 'dotnet8', 'dotnetcore1.0', 'dotnetcore2.0', 'dotnetcore2.1', 'dotnetcore3.1', 'go1.x', 'java11', 'java11.al2023', 'java17', 'java17.al2023', 'java21', 'java25', 'java8', 'java8.al2', 'java8.al2023', 'nodejs', 'nodejs10.x', 'nodejs12.x', 'nodejs14.x', 'nodejs16.x', 'nodejs18.x', 'nodejs20.x', 'nodejs22.x', 'nodejs24.x', 'nodejs26.x', 'nodejs4.3', 'nodejs4.3-edge', 'nodejs6.10', 'nodejs8.10', 'provided', 'provided.al2', 'provided.al2023', 'python2.7', 'python3.10', 'python3.11', 'python3.12', 'python3.13', 'python3.14', 'python3.15', 'python3.6', 'python3.7', 'python3.8', 'python3.9', 'ruby2.5', 'ruby2.7', 'ruby3.2', 'ruby3.3', 'ruby3.4', 'ruby4.0']", + "source": "CFN_LINT", "entity": { - "logicalId": "ConditionalRight", + "logicalId": "FutureNodeFunc", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.BucketName", - "category": "Best Practice", - "startLine": 29, - "startColumn": 18, - "endLine": 29, - "endColumn": 28, - "ruleDescription": "Create-only property updated triggers resource replacement", + "propertyPath": "Properties.Runtime", + "category": "Schema", + "startLine": 22, + "startColumn": 9, + "endLine": 22, + "endColumn": 17, + "ruleDescription": "Value not in allowed enum", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "actualValue": "node99.x", + "extra": { + "allowed_values": [ + "dotnet10", + "dotnet6", + "dotnet8", + "dotnetcore1.0", + "dotnetcore2.0", + "dotnetcore2.1", + "dotnetcore3.1", + "go1.x", + "java11", + "java11.al2023", + "java17", + "java17.al2023", + "java21", + "java25", + "java8", + "java8.al2", + "java8.al2023", + "nodejs", + "nodejs10.x", + "nodejs12.x", + "nodejs14.x", + "nodejs16.x", + "nodejs18.x", + "nodejs20.x", + "nodejs22.x", + "nodejs24.x", + "nodejs26.x", + "nodejs4.3", + "nodejs4.3-edge", + "nodejs6.10", + "nodejs8.10", + "provided", + "provided.al2", + "provided.al2023", + "python2.7", + "python3.10", + "python3.11", + "python3.12", + "python3.13", + "python3.14", + "python3.15", + "python3.6", + "python3.7", + "python3.8", + "python3.9", + "ruby2.5", + "ruby2.7", + "ruby3.2", + "ruby3.3", + "ruby3.4", + "ruby4.0" + ] + } } }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'BucketA' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "ruleId": "W9013", + "severity": "WARN", + "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", "source": "ENGINE", "entity": { - "logicalId": "BucketA", + "logicalId": "MyFunc", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 13, + "category": "Security", + "startLine": 4, "startColumn": 5, - "endLine": 13, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "endLine": 4, + "endColumn": 12, + "ruleDescription": "Hardcoded account ID in ARN", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'BucketB' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "ruleId": "W9013", + "severity": "WARN", + "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", "source": "ENGINE", "entity": { - "logicalId": "BucketB", + "logicalId": "FutureNodeFunc", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", + "category": "Security", "startLine": 16, "startColumn": 5, "endLine": 16, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'CompoundSub' of type 'AWS::S3::Bucket' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "CompoundSub", - "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 20, - "startColumn": 5, - "endLine": 20, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'ConditionalLeft' of type 'AWS::S3::Bucket' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "ConditionalLeft", - "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 25, - "startColumn": 5, - "endLine": 25, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "endColumn": 20, + "ruleDescription": "Hardcoded account ID in ARN", "phase": "LINT" }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'ConditionalRight' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConditionalRight", + "logicalId": "MyFunc", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.FunctionName", "category": "Best Practice", - "startLine": 29, - "startColumn": 5, - "endLine": 29, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "good/E3022_multi_element_join_distinct.yaml": { - "filePath": "good/E3022_multi_element_join_distinct.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 2, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 6, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "I1022", - "severity": "INFO", - "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", - "source": "CFN_LINT", - "entity": { - "logicalId": "MultiElementJoinA", - "entityType": "Resource", - "resourceType": "AWS::EC2::SubnetRouteTableAssociation" - }, - "propertyPath": "Properties.SubnetId.Fn::Join", - "category": "Intrinsic Function", - "startLine": 10, - "startColumn": 7, - "endLine": 10, - "endColumn": 15, - "ruleDescription": "Use Sub instead of Join", - "phase": "LINT" - }, - { - "ruleId": "I1022", - "severity": "INFO", - "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", - "source": "CFN_LINT", - "entity": { - "logicalId": "MultiElementJoinB", - "entityType": "Resource", - "resourceType": "AWS::EC2::SubnetRouteTableAssociation" - }, - "propertyPath": "Properties.SubnetId.Fn::Join", - "category": "Intrinsic Function", - "startLine": 15, - "startColumn": 7, - "endLine": 15, - "endColumn": 15, - "ruleDescription": "Use Sub instead of Join", - "phase": "LINT" + "startLine": 7, + "startColumn": 9, + "endLine": 7, + "endColumn": 22, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MultiElementJoinA", + "logicalId": "FutureNodeFunc", "entityType": "Resource", - "resourceType": "AWS::EC2::SubnetRouteTableAssociation" - }, - "propertyPath": "Properties.RouteTableId", - "category": "Best Practice", - "startLine": 9, - "startColumn": 7, - "endLine": 9, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.FunctionName", + "category": "Best Practice", + "startLine": 19, + "startColumn": 9, + "endLine": 19, + "endColumn": 22, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "extra": { - "replacement_strategy": "delete_then_create" - } + "lifecycle": "create-only" } }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", + "message": "Resource 'MyFunc' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "MultiElementJoinA", + "logicalId": "MyFunc", "entityType": "Resource", - "resourceType": "AWS::EC2::SubnetRouteTableAssociation" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.SubnetId", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 10, + "startLine": 6, "startColumn": 7, - "endLine": 10, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "dynamic (Join:{dynamic}-a)", - "extra": { - "replacement_strategy": "delete_then_create" - } - } + "endLine": 6, + "endColumn": 18, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", + "message": "Resource 'FutureNodeFunc' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "MultiElementJoinB", + "logicalId": "FutureNodeFunc", "entityType": "Resource", - "resourceType": "AWS::EC2::SubnetRouteTableAssociation" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.RouteTableId", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 14, + "startLine": 18, "startColumn": 7, - "endLine": 14, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", + "endLine": 18, + "endColumn": 18, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "gh-issues/issue-69.yaml": { + "filePath": "gh-issues/issue-69.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 2, + "errors": 0, + "warnings": 0, + "informational": 0, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "F3032", + "severity": "FATAL", + "message": "expected maximum item count: 1, found: 2", + "source": "SCHEMA", + "entity": { + "logicalId": "Profile", + "entityType": "Resource", + "resourceType": "AWS::IAM::InstanceProfile" + }, + "propertyPath": "Properties.Roles", + "category": "Schema", + "startLine": 6, + "startColumn": 7, + "endLine": 6, + "endColumn": 12, + "ruleDescription": "Array item count out of bounds", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", "extra": { - "replacement_strategy": "delete_then_create" + "actual_count": 2, + "max_items": 1, + "min_items": 0 } } }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "F3037", + "severity": "FATAL", + "message": "Array items are not unique", + "source": "SCHEMA", "entity": { - "logicalId": "MultiElementJoinB", + "logicalId": "Profile", "entityType": "Resource", - "resourceType": "AWS::EC2::SubnetRouteTableAssociation" + "resourceType": "AWS::IAM::InstanceProfile" }, - "propertyPath": "Properties.SubnetId", - "category": "Best Practice", - "startLine": 15, + "propertyPath": "Properties.Roles", + "category": "Schema", + "startLine": 6, "startColumn": 7, - "endLine": 15, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", + "endLine": 6, + "endColumn": 12, + "ruleDescription": "Array items not unique", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "dynamic (Join:{dynamic}-b)", - "extra": { - "replacement_strategy": "delete_then_create" - } + "actualValue": [ + "arn:aws:iam::012345678901:role/SameRole", + "arn:aws:iam::012345678901:role/SameRole" + ] } } ] }, - "good/E3031_cognito_user_pool_domain_pattern.yaml": { - "filePath": "good/E3031_cognito_user_pool_domain_pattern.yaml", + "good/E3019_identity_no_false_positive.yaml": { + "filePath": "good/E3019_identity_no_false_positive.yaml", "status": "OK", "metadata": { "resourcesScanned": 5, @@ -18085,7 +22283,7 @@ "fatal": 0, "errors": 0, "warnings": 0, - "informational": 8, + "informational": 10, "debug": 0 }, "suppressed": 0, @@ -18096,91 +22294,110 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'UserPoolId' is create-only; updating it will cause resource replacement", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "HostedUiPrefix", + "logicalId": "BucketA", "entityType": "Resource", - "resourceType": "AWS::Cognito::UserPoolDomain" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.UserPoolId", + "propertyPath": "Properties.BucketName", "category": "Best Practice", - "startLine": 18, - "startColumn": 7, - "endLine": 18, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "startLine": 13, + "startColumn": 18, + "endLine": 13, + "endColumn": 28, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "Ref to 'UserPool'" + "resolutionSource": "parameter 'NameA' (type String)" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Domain' is create-only; updating it will cause resource replacement", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "HostedUiPrefix", + "logicalId": "BucketB", "entityType": "Resource", - "resourceType": "AWS::Cognito::UserPoolDomain" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.Domain", + "propertyPath": "Properties.BucketName", "category": "Best Practice", - "startLine": 19, - "startColumn": 7, - "endLine": 19, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "startLine": 16, + "startColumn": 18, + "endLine": 16, + "endColumn": 28, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "parameter 'NameB' (type String)" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'UserPoolId' is create-only; updating it will cause resource replacement", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SingleCharacterPrefix", + "logicalId": "CompoundSub", "entityType": "Resource", - "resourceType": "AWS::Cognito::UserPoolDomain" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.UserPoolId", + "propertyPath": "Properties.BucketName", "category": "Best Practice", - "startLine": 23, - "startColumn": 7, - "endLine": 23, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "startLine": 20, + "startColumn": 18, + "endLine": 20, + "endColumn": 28, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "Ref to 'UserPool'" + "resolutionSource": "dynamic (Sub:${NameA}-suffix)" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Domain' is create-only; updating it will cause resource replacement", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SingleCharacterPrefix", + "logicalId": "ConditionalLeft", "entityType": "Resource", - "resourceType": "AWS::Cognito::UserPoolDomain" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.Domain", + "propertyPath": "Properties.BucketName", "category": "Best Practice", - "startLine": 24, - "startColumn": 7, - "endLine": 24, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "startLine": 25, + "startColumn": 18, + "endLine": 25, + "endColumn": 28, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConditionalRight", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" + }, + "propertyPath": "Properties.BucketName", + "category": "Best Practice", + "startLine": 29, + "startColumn": 18, + "endLine": 29, + "endColumn": 28, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -18188,130 +22405,117 @@ } }, { - "ruleId": "I9001", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'BucketA' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "BucketA", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 13, + "startColumn": 5, + "endLine": 13, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'UserPoolId' is create-only; updating it will cause resource replacement", + "message": "Resource 'BucketB' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "CustomDomain", + "logicalId": "BucketB", "entityType": "Resource", - "resourceType": "AWS::Cognito::UserPoolDomain" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.UserPoolId", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 28, - "startColumn": 7, - "endLine": 28, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'UserPool'" - } + "startLine": 16, + "startColumn": 5, + "endLine": 16, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Domain' is create-only; updating it will cause resource replacement", + "message": "Resource 'CompoundSub' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "CustomDomain", + "logicalId": "CompoundSub", "entityType": "Resource", - "resourceType": "AWS::Cognito::UserPoolDomain" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.Domain", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 29, - "startColumn": 7, - "endLine": 29, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 20, + "startColumn": 5, + "endLine": 20, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'UserPoolId' is create-only; updating it will cause resource replacement", + "message": "Resource 'ConditionalLeft' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ConditionallyCustomDomain", + "logicalId": "ConditionalLeft", "entityType": "Resource", - "resourceType": "AWS::Cognito::UserPoolDomain" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.UserPoolId", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 35, - "startColumn": 7, - "endLine": 35, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'UserPool'" - } + "startLine": 25, + "startColumn": 5, + "endLine": 25, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Domain' is create-only; updating it will cause resource replacement", + "message": "Resource 'ConditionalRight' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ConditionallyCustomDomain", + "logicalId": "ConditionalRight", "entityType": "Resource", - "resourceType": "AWS::Cognito::UserPoolDomain" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.Domain", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 36, - "startColumn": 7, - "endLine": 36, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Fn::If on condition 'UseCustomDomain'" - } + "startLine": 29, + "startColumn": 5, + "endLine": 29, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" } ] }, - "good/E3663_custom_environment_key.yaml": { - "filePath": "good/E3663_custom_environment_key.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 0, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [] - }, - "good/E3680_alb_subnet_counts.yaml": { - "filePath": "good/E3680_alb_subnet_counts.yaml", + "good/E3022_multi_element_join_distinct.yaml": { + "filePath": "good/E3022_multi_element_join_distinct.yaml", "status": "OK", "metadata": { - "resourcesScanned": 9, + "resourcesScanned": 2, "counts": { "fatal": 0, "errors": 0, "warnings": 0, - "informational": 19, + "informational": 6, "debug": 0 }, "suppressed": 0, @@ -18320,226 +22524,209 @@ }, "diagnostics": [ { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Vpc", - "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" - }, - "propertyPath": "Properties.CidrBlock", - "category": "Best Practice", - "startLine": 17, - "startColumn": 7, - "endLine": 17, - "endColumn": 16, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "SubnetA", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.VpcId", - "category": "Best Practice", - "startLine": 21, - "startColumn": 7, - "endLine": 21, - "endColumn": 12, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'Vpc'" - } - }, - { - "ruleId": "I9001", + "ruleId": "I1022", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", + "source": "CFN_LINT", "entity": { - "logicalId": "SubnetA", + "logicalId": "MultiElementJoinA", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::EC2::SubnetRouteTableAssociation" }, - "propertyPath": "Properties.CidrBlock", - "category": "Best Practice", - "startLine": 22, + "propertyPath": "Properties.SubnetId.Fn::Join", + "category": "Intrinsic Function", + "startLine": 10, "startColumn": 7, - "endLine": 22, - "endColumn": 16, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "endLine": 10, + "endColumn": 15, + "ruleDescription": "Use Sub instead of Join", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I1022", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", + "source": "CFN_LINT", "entity": { - "logicalId": "SubnetB", + "logicalId": "MultiElementJoinB", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::EC2::SubnetRouteTableAssociation" }, - "propertyPath": "Properties.VpcId", - "category": "Best Practice", - "startLine": 26, + "propertyPath": "Properties.SubnetId.Fn::Join", + "category": "Intrinsic Function", + "startLine": 15, "startColumn": 7, - "endLine": 26, - "endColumn": 12, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'Vpc'" - } + "endLine": 15, + "endColumn": 15, + "ruleDescription": "Use Sub instead of Join", + "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SubnetB", + "logicalId": "MultiElementJoinA", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::EC2::SubnetRouteTableAssociation" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Properties.RouteTableId", "category": "Best Practice", - "startLine": 27, + "startLine": 9, "startColumn": 7, - "endLine": 27, - "endColumn": 16, + "endLine": 9, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "extra": { + "replacement_strategy": "delete_then_create" + } } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Type' is create-only; updating it will cause resource replacement", + "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "AlbTwoSubnets", + "logicalId": "MultiElementJoinA", "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancingV2::LoadBalancer" + "resourceType": "AWS::EC2::SubnetRouteTableAssociation" }, - "propertyPath": "Properties.Type", + "propertyPath": "Properties.SubnetId", "category": "Best Practice", - "startLine": 31, + "startLine": 10, "startColumn": 7, - "endLine": 31, - "endColumn": 11, - "documentationUrl": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-loadbalancer.html", + "endLine": 10, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "dynamic (Join:{dynamic}-a)", + "extra": { + "replacement_strategy": "delete_then_create" + } } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Type' is create-only; updating it will cause resource replacement", + "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "AlbSubnetsFromParameter", + "logicalId": "MultiElementJoinB", "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancingV2::LoadBalancer" + "resourceType": "AWS::EC2::SubnetRouteTableAssociation" }, - "propertyPath": "Properties.Type", + "propertyPath": "Properties.RouteTableId", "category": "Best Practice", - "startLine": 44, + "startLine": 14, "startColumn": 7, - "endLine": 44, - "endColumn": 11, - "documentationUrl": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-loadbalancer.html", + "endLine": 14, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "extra": { + "replacement_strategy": "delete_then_create" + } } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Type' is create-only; updating it will cause resource replacement", + "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "NlbOneSubnet", + "logicalId": "MultiElementJoinB", "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancingV2::LoadBalancer" + "resourceType": "AWS::EC2::SubnetRouteTableAssociation" }, - "propertyPath": "Properties.Type", + "propertyPath": "Properties.SubnetId", "category": "Best Practice", - "startLine": 49, + "startLine": 15, "startColumn": 7, - "endLine": 49, - "endColumn": 11, - "documentationUrl": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-loadbalancer.html", + "endLine": 15, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "dynamic (Join:{dynamic}-b)", + "extra": { + "replacement_strategy": "delete_then_create" + } } + } + ] + }, + "good/E3031_cognito_user_pool_domain_pattern.yaml": { + "filePath": "good/E3031_cognito_user_pool_domain_pattern.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 5, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 8, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Type' is create-only; updating it will cause resource replacement", + "message": "Property 'UserPoolId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "GatewayOneSubnet", + "logicalId": "HostedUiPrefix", "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancingV2::LoadBalancer" + "resourceType": "AWS::Cognito::UserPoolDomain" }, - "propertyPath": "Properties.Type", + "propertyPath": "Properties.UserPoolId", "category": "Best Practice", - "startLine": 55, + "startLine": 18, "startColumn": 7, - "endLine": 55, - "endColumn": 11, - "documentationUrl": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-loadbalancer.html", + "endLine": 18, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'UserPool'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Type' is create-only; updating it will cause resource replacement", + "message": "Property 'Domain' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ParameterTypedOneSubnet", + "logicalId": "HostedUiPrefix", "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancingV2::LoadBalancer" + "resourceType": "AWS::Cognito::UserPoolDomain" }, - "propertyPath": "Properties.Type", + "propertyPath": "Properties.Domain", "category": "Best Practice", - "startLine": 61, + "startLine": 19, "startColumn": 7, - "endLine": 61, - "endColumn": 11, - "documentationUrl": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-loadbalancer.html", + "endLine": 19, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -18547,258 +22734,177 @@ } }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Vpc' of type 'AWS::EC2::VPC' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "Vpc", - "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 16, - "startColumn": 5, - "endLine": 16, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'SubnetA' of type 'AWS::EC2::Subnet' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "SubnetA", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 20, - "startColumn": 5, - "endLine": 20, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'SubnetB' of type 'AWS::EC2::Subnet' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "SubnetB", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 25, - "startColumn": 5, - "endLine": 25, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'AlbTwoSubnets' of type 'AWS::ElasticLoadBalancingV2::LoadBalancer' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "AlbTwoSubnets", - "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancingV2::LoadBalancer" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 30, - "startColumn": 5, - "endLine": 30, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'AlbDefaultTypeTwoSubnetMappings' of type 'AWS::ElasticLoadBalancingV2::LoadBalancer' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "AlbDefaultTypeTwoSubnetMappings", - "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancingV2::LoadBalancer" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 37, - "startColumn": 5, - "endLine": 37, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'AlbSubnetsFromParameter' of type 'AWS::ElasticLoadBalancingV2::LoadBalancer' supports Tags but none are configured", + "message": "Property 'UserPoolId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "AlbSubnetsFromParameter", + "logicalId": "SingleCharacterPrefix", "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancingV2::LoadBalancer" + "resourceType": "AWS::Cognito::UserPoolDomain" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.UserPoolId", "category": "Best Practice", - "startLine": 43, - "startColumn": 5, - "endLine": 43, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 23, + "startColumn": 7, + "endLine": 23, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'UserPool'" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'NlbOneSubnet' of type 'AWS::ElasticLoadBalancingV2::LoadBalancer' supports Tags but none are configured", + "message": "Property 'Domain' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "NlbOneSubnet", + "logicalId": "SingleCharacterPrefix", "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancingV2::LoadBalancer" + "resourceType": "AWS::Cognito::UserPoolDomain" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.Domain", "category": "Best Practice", - "startLine": 48, - "startColumn": 5, - "endLine": 48, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 24, + "startColumn": 7, + "endLine": 24, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'GatewayOneSubnet' of type 'AWS::ElasticLoadBalancingV2::LoadBalancer' supports Tags but none are configured", + "message": "Property 'UserPoolId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "GatewayOneSubnet", + "logicalId": "CustomDomain", "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancingV2::LoadBalancer" + "resourceType": "AWS::Cognito::UserPoolDomain" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.UserPoolId", "category": "Best Practice", - "startLine": 54, - "startColumn": 5, - "endLine": 54, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 28, + "startColumn": 7, + "endLine": 28, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'UserPool'" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'ParameterTypedOneSubnet' of type 'AWS::ElasticLoadBalancingV2::LoadBalancer' supports Tags but none are configured", + "message": "Property 'Domain' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ParameterTypedOneSubnet", + "logicalId": "CustomDomain", "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancingV2::LoadBalancer" + "resourceType": "AWS::Cognito::UserPoolDomain" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.Domain", "category": "Best Practice", - "startLine": 60, - "startColumn": 5, - "endLine": 60, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "good/E9001_aws_cdk_metadata.yaml": { - "filePath": "good/E9001_aws_cdk_metadata.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 2, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 2, - "debug": 0 + "startLine": 29, + "startColumn": 7, + "endLine": 29, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", + "message": "Property 'UserPoolId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Bucket", + "logicalId": "ConditionallyCustomDomain", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::Cognito::UserPoolDomain" }, - "propertyPath": "Properties.BucketName", + "propertyPath": "Properties.UserPoolId", "category": "Best Practice", - "startLine": 18, + "startLine": 35, "startColumn": 7, - "endLine": 18, + "endLine": 35, "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'UserPool'" } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Property 'Domain' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Bucket", + "logicalId": "ConditionallyCustomDomain", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::Cognito::UserPoolDomain" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.Domain", "category": "Best Practice", - "startLine": 17, - "startColumn": 5, - "endLine": 17, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 36, + "startColumn": 7, + "endLine": 36, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Fn::If on condition 'UseCustomDomain'" + } } ] }, - "good/E9002_port_range_exemptions.yaml": { - "filePath": "good/E9002_port_range_exemptions.yaml", + "good/E3663_custom_environment_key.yaml": { + "filePath": "good/E3663_custom_environment_key.yaml", "status": "OK", "metadata": { - "resourcesScanned": 5, + "resourcesScanned": 1, "counts": { "fatal": 0, "errors": 0, "warnings": 0, - "informational": 20, + "informational": 0, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [] + }, + "good/E3680_alb_subnet_counts.yaml": { + "filePath": "good/E3680_alb_subnet_counts.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 9, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 19, "debug": 0 }, "suppressed": 0, @@ -18818,9 +22924,9 @@ }, "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 10, + "startLine": 17, "startColumn": 7, - "endLine": 10, + "endLine": 17, "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", @@ -18828,43 +22934,21 @@ "lifecycle": "create-only" } }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "SecurityGroup", - "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" - }, - "propertyPath": "Properties.GroupDescription", - "category": "Best Practice", - "startLine": 14, - "startColumn": 7, - "endLine": 14, - "endColumn": 23, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, { "ruleId": "I9001", "severity": "INFO", "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SecurityGroup", + "logicalId": "SubnetA", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::EC2::Subnet" }, "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 15, + "startLine": 21, "startColumn": 7, - "endLine": 15, + "endLine": 21, "endColumn": 12, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", @@ -18876,44 +22960,19 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'GroupId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "StandaloneIngressIcmpTypeCode", - "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" - }, - "propertyPath": "Properties.GroupId", - "category": "Best Practice", - "startLine": 28, - "startColumn": 7, - "endLine": 28, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'SecurityGroup'" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'IpProtocol' is create-only; updating it will cause resource replacement", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "StandaloneIngressIcmpTypeCode", + "logicalId": "SubnetA", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.IpProtocol", + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 29, + "startLine": 22, "startColumn": 7, - "endLine": 29, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 22, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -18923,43 +22982,42 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'FromPort' is create-only; updating it will cause resource replacement", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "StandaloneIngressIcmpTypeCode", + "logicalId": "SubnetB", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.FromPort", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 30, + "startLine": 26, "startColumn": 7, - "endLine": 30, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 26, + "endColumn": 12, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'Vpc'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ToPort' is create-only; updating it will cause resource replacement", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "StandaloneIngressIcmpTypeCode", + "logicalId": "SubnetB", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.ToPort", + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 31, + "startLine": 27, "startColumn": 7, - "endLine": 31, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 27, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -18969,20 +23027,20 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'CidrIp' is create-only; updating it will cause resource replacement", + "message": "Property 'Type' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "StandaloneIngressIcmpTypeCode", + "logicalId": "AlbTwoSubnets", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" + "resourceType": "AWS::ElasticLoadBalancingV2::LoadBalancer" }, - "propertyPath": "Properties.CidrIp", + "propertyPath": "Properties.Type", "category": "Best Practice", - "startLine": 32, + "startLine": 31, "startColumn": 7, - "endLine": 32, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 31, + "endColumn": 11, + "documentationUrl": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-loadbalancer.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -18992,44 +23050,43 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'GroupId' is create-only; updating it will cause resource replacement", + "message": "Property 'Type' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "StandaloneIngressIcmpv6TypeCode", + "logicalId": "AlbSubnetsFromParameter", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" + "resourceType": "AWS::ElasticLoadBalancingV2::LoadBalancer" }, - "propertyPath": "Properties.GroupId", + "propertyPath": "Properties.Type", "category": "Best Practice", - "startLine": 36, + "startLine": 44, "startColumn": 7, - "endLine": 36, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 44, + "endColumn": 11, + "documentationUrl": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-loadbalancer.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'SecurityGroup'" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'IpProtocol' is create-only; updating it will cause resource replacement", + "message": "Property 'Type' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "StandaloneIngressIcmpv6TypeCode", + "logicalId": "NlbOneSubnet", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" + "resourceType": "AWS::ElasticLoadBalancingV2::LoadBalancer" }, - "propertyPath": "Properties.IpProtocol", + "propertyPath": "Properties.Type", "category": "Best Practice", - "startLine": 37, + "startLine": 49, "startColumn": 7, - "endLine": 37, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 49, + "endColumn": 11, + "documentationUrl": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-loadbalancer.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -19039,20 +23096,20 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'FromPort' is create-only; updating it will cause resource replacement", + "message": "Property 'Type' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "StandaloneIngressIcmpv6TypeCode", + "logicalId": "GatewayOneSubnet", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" + "resourceType": "AWS::ElasticLoadBalancingV2::LoadBalancer" }, - "propertyPath": "Properties.FromPort", + "propertyPath": "Properties.Type", "category": "Best Practice", - "startLine": 38, + "startLine": 55, "startColumn": 7, - "endLine": 38, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 55, + "endColumn": 11, + "documentationUrl": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-loadbalancer.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -19062,20 +23119,20 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ToPort' is create-only; updating it will cause resource replacement", + "message": "Property 'Type' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "StandaloneIngressIcmpv6TypeCode", + "logicalId": "ParameterTypedOneSubnet", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" + "resourceType": "AWS::ElasticLoadBalancingV2::LoadBalancer" }, - "propertyPath": "Properties.ToPort", + "propertyPath": "Properties.Type", "category": "Best Practice", - "startLine": 39, + "startLine": 61, "startColumn": 7, - "endLine": 39, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 61, + "endColumn": 11, + "documentationUrl": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-loadbalancer.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -19083,160 +23140,141 @@ } }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'CidrIpv6' is create-only; updating it will cause resource replacement", + "message": "Resource 'Vpc' of type 'AWS::EC2::VPC' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "StandaloneIngressIcmpv6TypeCode", + "logicalId": "Vpc", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" + "resourceType": "AWS::EC2::VPC" }, - "propertyPath": "Properties.CidrIpv6", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 40, - "startColumn": 7, - "endLine": 40, + "startLine": 16, + "startColumn": 5, + "endLine": 16, "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'GroupId' is create-only; updating it will cause resource replacement", + "message": "Resource 'SubnetA' of type 'AWS::EC2::Subnet' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "StandaloneEgressAscendingRange", + "logicalId": "SubnetA", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupEgress" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.GroupId", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 44, - "startColumn": 7, - "endLine": 44, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'SecurityGroup'" - } + "startLine": 20, + "startColumn": 5, + "endLine": 20, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'IpProtocol' is create-only; updating it will cause resource replacement", + "message": "Resource 'SubnetB' of type 'AWS::EC2::Subnet' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "StandaloneEgressAscendingRange", + "logicalId": "SubnetB", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupEgress" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.IpProtocol", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 45, - "startColumn": 7, - "endLine": 45, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 25, + "startColumn": 5, + "endLine": 25, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'FromPort' is create-only; updating it will cause resource replacement", + "message": "Resource 'AlbTwoSubnets' of type 'AWS::ElasticLoadBalancingV2::LoadBalancer' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "StandaloneEgressAscendingRange", + "logicalId": "AlbTwoSubnets", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupEgress" + "resourceType": "AWS::ElasticLoadBalancingV2::LoadBalancer" }, - "propertyPath": "Properties.FromPort", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 46, - "startColumn": 7, - "endLine": 46, + "startLine": 30, + "startColumn": 5, + "endLine": 30, "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'ToPort' is create-only; updating it will cause resource replacement", + "message": "Resource 'AlbDefaultTypeTwoSubnetMappings' of type 'AWS::ElasticLoadBalancingV2::LoadBalancer' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "StandaloneEgressAscendingRange", + "logicalId": "AlbDefaultTypeTwoSubnetMappings", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupEgress" + "resourceType": "AWS::ElasticLoadBalancingV2::LoadBalancer" }, - "propertyPath": "Properties.ToPort", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 47, - "startColumn": 7, - "endLine": 47, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 37, + "startColumn": 5, + "endLine": 37, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'CidrIp' is create-only; updating it will cause resource replacement", + "message": "Resource 'AlbSubnetsFromParameter' of type 'AWS::ElasticLoadBalancingV2::LoadBalancer' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "StandaloneEgressAscendingRange", + "logicalId": "AlbSubnetsFromParameter", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupEgress" + "resourceType": "AWS::ElasticLoadBalancingV2::LoadBalancer" }, - "propertyPath": "Properties.CidrIp", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 48, - "startColumn": 7, - "endLine": 48, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 43, + "startColumn": 5, + "endLine": 43, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Vpc' of type 'AWS::EC2::VPC' supports Tags but none are configured", + "message": "Resource 'NlbOneSubnet' of type 'AWS::ElasticLoadBalancingV2::LoadBalancer' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Vpc", + "logicalId": "NlbOneSubnet", "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" + "resourceType": "AWS::ElasticLoadBalancingV2::LoadBalancer" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 9, + "startLine": 48, "startColumn": 5, - "endLine": 9, + "endLine": 48, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -19244,66 +23282,47 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'SecurityGroup' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", + "message": "Resource 'GatewayOneSubnet' of type 'AWS::ElasticLoadBalancingV2::LoadBalancer' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "SecurityGroup", + "logicalId": "GatewayOneSubnet", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::ElasticLoadBalancingV2::LoadBalancer" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 13, + "startLine": 54, "startColumn": 5, - "endLine": 13, + "endLine": 54, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" - } - ] - }, - "good/W1028_pseudo_param_branches_reachable.yaml": { - "filePath": "good/W1028_pseudo_param_branches_reachable.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 1, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'KubectlHandlerRole' of type 'AWS::IAM::Role' supports Tags but none are configured", + "message": "Resource 'ParameterTypedOneSubnet' of type 'AWS::ElasticLoadBalancingV2::LoadBalancer' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "KubectlHandlerRole", + "logicalId": "ParameterTypedOneSubnet", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::ElasticLoadBalancingV2::LoadBalancer" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 20, + "startLine": 60, "startColumn": 5, - "endLine": 20, + "endLine": 60, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "good/W3010_getazs_not_flagged.yaml": { - "filePath": "good/W3010_getazs_not_flagged.yaml", + "good/E9001_aws_cdk_metadata.yaml": { + "filePath": "good/E9001_aws_cdk_metadata.yaml", "status": "OK", "metadata": { "resourcesScanned": 2, @@ -19311,7 +23330,7 @@ "fatal": 0, "errors": 0, "warnings": 0, - "informational": 6, + "informational": 2, "debug": 0 }, "suppressed": 0, @@ -19322,86 +23341,19 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'AvailabilityZones' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Elb", - "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancing::LoadBalancer" - }, - "propertyPath": "Properties.AvailabilityZones", - "category": "Best Practice", - "startLine": 8, - "startColumn": 7, - "endLine": 8, - "endColumn": 24, - "documentationUrl": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Subnet", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.VpcId", - "category": "Best Practice", - "startLine": 16, - "startColumn": 7, - "endLine": 16, - "endColumn": 12, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Subnet", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.CidrBlock", - "category": "Best Practice", - "startLine": 17, - "startColumn": 7, - "endLine": 17, - "endColumn": 16, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Subnet", + "logicalId": "Bucket", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.AvailabilityZone", + "propertyPath": "Properties.BucketName", "category": "Best Practice", "startLine": 18, "startColumn": 7, "endLine": 18, - "endColumn": 23, + "endColumn": 17, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -19411,47 +23363,27 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Elb' of type 'AWS::ElasticLoadBalancing::LoadBalancer' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "Elb", - "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancing::LoadBalancer" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 7, - "startColumn": 5, - "endLine": 7, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Subnet' of type 'AWS::EC2::Subnet' supports Tags but none are configured", + "message": "Resource 'Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Subnet", + "logicalId": "Bucket", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::S3::Bucket" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 15, + "startLine": 17, "startColumn": 5, - "endLine": 15, + "endLine": 17, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "good/apigateway_method_authorizer_same_rest_api.yaml": { - "filePath": "good/apigateway_method_authorizer_same_rest_api.yaml", + "good/E9002_port_range_exemptions.yaml": { + "filePath": "good/E9002_port_range_exemptions.yaml", "status": "OK", "metadata": { "resourcesScanned": 5, @@ -19459,7 +23391,7 @@ "fatal": 0, "errors": 0, "warnings": 0, - "informational": 9, + "informational": 20, "debug": 0 }, "suppressed": 0, @@ -19470,92 +23402,111 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'RestApiId' is create-only; updating it will cause resource replacement", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Authorizer1", + "logicalId": "Vpc", "entityType": "Resource", - "resourceType": "AWS::ApiGateway::Authorizer" + "resourceType": "AWS::EC2::VPC" }, - "propertyPath": "Properties.RestApiId", + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 19, + "startLine": 10, "startColumn": 7, - "endLine": 19, + "endLine": 10, "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt RestApi1.RestApiId" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'RestApiId' is create-only; updating it will cause resource replacement", + "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Method1", + "logicalId": "SecurityGroup", "entityType": "Resource", - "resourceType": "AWS::ApiGateway::Method" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.RestApiId", + "propertyPath": "Properties.GroupDescription", "category": "Best Practice", - "startLine": 25, + "startLine": 14, "startColumn": 7, - "endLine": 25, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway.git", + "endLine": 14, + "endColumn": 23, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "SecurityGroup", + "entityType": "Resource", + "resourceType": "AWS::EC2::SecurityGroup" + }, + "propertyPath": "Properties.VpcId", + "category": "Best Practice", + "startLine": 15, + "startColumn": 7, + "endLine": 15, + "endColumn": 12, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "Ref to 'RestApi1'" + "resolutionSource": "Ref to 'Vpc'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ResourceId' is create-only; updating it will cause resource replacement", + "message": "Property 'GroupId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Method1", + "logicalId": "StandaloneIngressIcmpTypeCode", "entityType": "Resource", - "resourceType": "AWS::ApiGateway::Method" + "resourceType": "AWS::EC2::SecurityGroupIngress" }, - "propertyPath": "Properties.ResourceId", + "propertyPath": "Properties.GroupId", "category": "Best Practice", - "startLine": 26, + "startLine": 28, "startColumn": 7, - "endLine": 26, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway.git", + "endLine": 28, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "GetAtt RestApi1.RootResourceId" + "resolutionSource": "Ref to 'SecurityGroup'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'HttpMethod' is create-only; updating it will cause resource replacement", + "message": "Property 'IpProtocol' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Method1", + "logicalId": "StandaloneIngressIcmpTypeCode", "entityType": "Resource", - "resourceType": "AWS::ApiGateway::Method" + "resourceType": "AWS::EC2::SecurityGroupIngress" }, - "propertyPath": "Properties.HttpMethod", + "propertyPath": "Properties.IpProtocol", "category": "Best Practice", - "startLine": 27, + "startLine": 29, "startColumn": 7, - "endLine": 27, + "endLine": 29, "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway.git", + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -19565,68 +23516,66 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'RestApiId' is create-only; updating it will cause resource replacement", + "message": "Property 'FromPort' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Deployment1", + "logicalId": "StandaloneIngressIcmpTypeCode", "entityType": "Resource", - "resourceType": "AWS::ApiGateway::Deployment" + "resourceType": "AWS::EC2::SecurityGroupIngress" }, - "propertyPath": "Properties.RestApiId", + "propertyPath": "Properties.FromPort", "category": "Best Practice", - "startLine": 36, + "startLine": 30, "startColumn": 7, - "endLine": 36, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway", + "endLine": 30, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt RestApi1.RestApiId" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'RestApiId' is create-only; updating it will cause resource replacement", + "message": "Property 'ToPort' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Stage1", + "logicalId": "StandaloneIngressIcmpTypeCode", "entityType": "Resource", - "resourceType": "AWS::ApiGateway::Stage" + "resourceType": "AWS::EC2::SecurityGroupIngress" }, - "propertyPath": "Properties.RestApiId", + "propertyPath": "Properties.ToPort", "category": "Best Practice", - "startLine": 40, + "startLine": 31, "startColumn": 7, - "endLine": 40, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway", + "endLine": 31, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'RestApi1'" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'StageName' is create-only; updating it will cause resource replacement", + "message": "Property 'CidrIp' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Stage1", + "logicalId": "StandaloneIngressIcmpTypeCode", "entityType": "Resource", - "resourceType": "AWS::ApiGateway::Stage" + "resourceType": "AWS::EC2::SecurityGroupIngress" }, - "propertyPath": "Properties.StageName", + "propertyPath": "Properties.CidrIp", "category": "Best Practice", - "startLine": 42, + "startLine": 32, "startColumn": 7, - "endLine": 42, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway", + "endLine": 32, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -19634,140 +23583,92 @@ } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'RestApi1' of type 'AWS::ApiGateway::RestApi' supports Tags but none are configured", + "message": "Property 'GroupId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "RestApi1", + "logicalId": "StandaloneIngressIcmpv6TypeCode", "entityType": "Resource", - "resourceType": "AWS::ApiGateway::RestApi" + "resourceType": "AWS::EC2::SecurityGroupIngress" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.GroupId", "category": "Best Practice", - "startLine": 12, - "startColumn": 5, - "endLine": 12, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 36, + "startColumn": 7, + "endLine": 36, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'SecurityGroup'" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'Stage1' of type 'AWS::ApiGateway::Stage' supports Tags but none are configured", + "message": "Property 'IpProtocol' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Stage1", - "entityType": "Resource", - "resourceType": "AWS::ApiGateway::Stage" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 39, - "startColumn": 5, - "endLine": 39, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "good/aurora_dbinstance.yaml": { - "filePath": "good/aurora_dbinstance.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 8, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "AuroraDB", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" - }, - "category": "Best Practice", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 11, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "AuroraDB", + "logicalId": "StandaloneIngressIcmpv6TypeCode", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::SecurityGroupIngress" }, + "propertyPath": "Properties.IpProtocol", "category": "Best Practice", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 11, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 37, + "startColumn": 7, + "endLine": 37, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'FromPort' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "AuroraDB", + "logicalId": "StandaloneIngressIcmpv6TypeCode", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::SecurityGroupIngress" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.FromPort", "category": "Best Practice", - "startLine": 6, + "startLine": 38, "startColumn": 7, - "endLine": 6, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "endLine": 38, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'DBClusterIdentifier' is create-only; updating it will cause resource replacement", + "message": "Property 'ToPort' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "AuroraDB", + "logicalId": "StandaloneIngressIcmpv6TypeCode", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::SecurityGroupIngress" }, - "propertyPath": "Properties.DBClusterIdentifier", + "propertyPath": "Properties.ToPort", "category": "Best Practice", - "startLine": 7, + "startLine": 39, "startColumn": 7, - "endLine": 7, - "endColumn": 26, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "endLine": 39, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -19777,247 +23678,193 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'BackupRetentionPeriod' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'CidrIpv6' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "AuroraDB", + "logicalId": "StandaloneIngressIcmpv6TypeCode", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::SecurityGroupIngress" }, - "propertyPath": "Properties.BackupRetentionPeriod", + "propertyPath": "Properties.CidrIpv6", "category": "Best Practice", - "startLine": 9, + "startLine": 40, "startColumn": 7, - "endLine": 9, - "endColumn": 28, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "endLine": 40, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only" } }, { - "ruleId": "I9002", + "ruleId": "I9001", "severity": "INFO", - "message": "'BackupRetentionPeriod' is ignored in this configuration (from extension)", + "message": "Property 'GroupId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "AuroraDB", + "logicalId": "StandaloneEgressAscendingRange", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::SecurityGroupEgress" }, - "propertyPath": "Properties.BackupRetentionPeriod", + "propertyPath": "Properties.GroupId", "category": "Best Practice", - "startLine": 9, + "startLine": 44, "startColumn": 7, - "endLine": 9, - "endColumn": 28, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Property is ignored in this configuration (from extension)", - "phase": "SCHEMA" - }, - { - "ruleId": "I9003", - "severity": "INFO", - "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", - "source": "ENGINE", - "category": "Best Practice", - "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", - "phase": "LINT" + "endLine": 44, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'SecurityGroup'" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'AuroraDB' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "message": "Property 'IpProtocol' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "AuroraDB", + "logicalId": "StandaloneEgressAscendingRange", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::SecurityGroupEgress" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.IpProtocol", "category": "Best Practice", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "good/both_forms.yaml": { - "filePath": "good/both_forms.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 13, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 1, - "informational": 2, - "debug": 0 + "startLine": 45, + "startColumn": 7, + "endLine": 45, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "W8001", - "severity": "WARN", - "message": "Condition 'Combined' is not used by any resource or Fn::If", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'FromPort' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Combined", - "entityType": "Condition" + "logicalId": "StandaloneEgressAscendingRange", + "entityType": "Resource", + "resourceType": "AWS::EC2::SecurityGroupEgress" }, - "propertyPath": "Conditions/Combined", + "propertyPath": "Properties.FromPort", "category": "Best Practice", - "startLine": 12, - "startColumn": 3, - "endLine": 12, - "endColumn": 11, - "ruleDescription": "Check if Conditions are Used", - "phase": "LINT" + "startLine": 46, + "startColumn": 7, + "endLine": 46, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", + "message": "Property 'ToPort' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "BucketShort", + "logicalId": "StandaloneEgressAscendingRange", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::EC2::SecurityGroupEgress" }, - "propertyPath": "Properties.BucketName", + "propertyPath": "Properties.ToPort", "category": "Best Practice", - "startLine": 20, + "startLine": 47, "startColumn": 7, - "endLine": 20, - "endColumn": 17, + "endLine": 47, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter with AllowedValues" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", + "message": "Property 'CidrIp' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "BucketLong", + "logicalId": "StandaloneEgressAscendingRange", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::EC2::SecurityGroupEgress" }, - "propertyPath": "Properties.BucketName", + "propertyPath": "Properties.CidrIp", "category": "Best Practice", - "startLine": 27, + "startLine": 48, "startColumn": 7, - "endLine": 27, - "endColumn": 17, + "endLine": 48, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter with AllowedValues" + "lifecycle": "create-only" } - } - ] - }, - "good/cdk_bootstrap_version_rule.json": { - "filePath": "good/cdk_bootstrap_version_rule.json", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 1, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Resource 'Vpc' of type 'AWS::EC2::VPC' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Bucket", + "logicalId": "Vpc", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::EC2::VPC" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 13, - "startColumn": 7, - "endLine": 13, - "endColumn": 18, + "startLine": 9, + "startColumn": 5, + "endLine": 9, + "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" - } - ] - }, - "good/cloudfront_valid.yaml": { - "filePath": "good/cloudfront_valid.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 1, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Distribution' of type 'AWS::CloudFront::Distribution' supports Tags but none are configured", + "message": "Resource 'SecurityGroup' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Distribution", + "logicalId": "SecurityGroup", "entityType": "Resource", - "resourceType": "AWS::CloudFront::Distribution" + "resourceType": "AWS::EC2::SecurityGroup" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 5, + "startLine": 13, "startColumn": 5, - "endLine": 5, + "endLine": 13, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "good/codepipeline_artifact_counts.yaml": { - "filePath": "good/codepipeline_artifact_counts.yaml", + "good/W1028_pseudo_param_branches_reachable.yaml": { + "filePath": "good/W1028_pseudo_param_branches_reachable.yaml", "status": "OK", "metadata": { "resourcesScanned": 1, "counts": { "fatal": 0, "errors": 0, - "warnings": 1, + "warnings": 0, "informational": 1, "debug": 0 }, @@ -20026,57 +23873,38 @@ "severityLevel": "DEBUG" }, "diagnostics": [ - { - "ruleId": "W9002", - "severity": "WARN", - "message": "Property 'RoleArn' has a hardcoded ARN - use Ref, GetAtt, or a parameter instead", - "source": "ENGINE", - "entity": { - "logicalId": "Pipeline", - "entityType": "Resource", - "resourceType": "AWS::CodePipeline::Pipeline" - }, - "propertyPath": "Properties.RoleArn", - "category": "Best Practice", - "startLine": 6, - "startColumn": 7, - "endLine": 6, - "endColumn": 14, - "ruleDescription": "Hardcoded ARN property", - "phase": "LINT" - }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Pipeline' of type 'AWS::CodePipeline::Pipeline' supports Tags but none are configured", + "message": "Resource 'KubectlHandlerRole' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Pipeline", + "logicalId": "KubectlHandlerRole", "entityType": "Resource", - "resourceType": "AWS::CodePipeline::Pipeline" + "resourceType": "AWS::IAM::Role" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 5, + "startLine": 20, "startColumn": 5, - "endLine": 5, + "endLine": 20, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "good/complex_conditions.yaml": { - "filePath": "good/complex_conditions.yaml", + "good/W2530_snapstart_unreachable_or_published.yaml": { + "filePath": "good/W2530_snapstart_unreachable_or_published.yaml", "status": "OK", "metadata": { - "resourcesScanned": 3, + "resourcesScanned": 16, "counts": { "fatal": 0, "errors": 0, - "warnings": 2, - "informational": 12, + "warnings": 4, + "informational": 16, "debug": 0 }, "suppressed": 0, @@ -20085,588 +23913,455 @@ }, "diagnostics": [ { - "ruleId": "W2501", + "ruleId": "W1028", "severity": "WARN", - "message": "Property 'MasterUserPassword' should not be a hardcoded string - use a parameter with NoEcho or a dynamic reference", + "message": "['Fn::If', 2] is not reachable. When setting condition 'IsUsEast1' to False from current status True", "source": "CFN_LINT", "entity": { - "logicalId": "Database", + "logicalId": "PropertiesBranchExcludedByResourceCondition", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.MasterUserPassword", - "category": "Security", - "startLine": 38, - "startColumn": 7, - "endLine": 38, - "endColumn": 25, - "ruleDescription": "Check if Password Properties are correctly configured", + "propertyPath": "Properties.Fn::If.Fn::If.2", + "category": "Best Practice", + "startLine": 11, + "startColumn": 5, + "endLine": 11, + "endColumn": 11, + "ruleDescription": "Check Fn::If has a path that cannot be reached", "phase": "LINT" }, { - "ruleId": "W8001", + "ruleId": "W1028", "severity": "WARN", - "message": "Condition 'IsNotProd' is not used by any resource or Fn::If", + "message": "['Fn::If', 2] is not reachable. When setting condition 'IsUsEast1' to False from current status True", "source": "CFN_LINT", "entity": { - "logicalId": "IsNotProd", - "entityType": "Condition" + "logicalId": "ApplyOnBranchExcludedByResourceCondition", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Conditions/IsNotProd", + "propertyPath": "Properties.SnapStart.ApplyOn.Fn::If.2", "category": "Best Practice", - "startLine": 20, - "startColumn": 3, - "endLine": 20, - "endColumn": 12, - "ruleDescription": "Check if Conditions are Used", + "startLine": 38, + "startColumn": 40, + "endLine": 38, + "endColumn": 41, + "ruleDescription": "Check Fn::If has a path that cannot be reached", "phase": "LINT" - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + }, + { + "ruleId": "W1028", + "severity": "WARN", + "message": "['Fn::If', 2] is not reachable. When setting condition 'IsUsEast1' to False from current status True", "source": "CFN_LINT", "entity": { - "logicalId": "Database", + "logicalId": "RepeatedConditionExcludesInnerBranch", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Function" }, + "propertyPath": "Properties.SnapStart.Fn::If.1.ApplyOn.Fn::If.2", "category": "Best Practice", - "startLine": 31, - "startColumn": 3, - "endLine": 31, - "endColumn": 11, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "startLine": 50, + "startColumn": 42, + "endLine": 50, + "endColumn": 43, + "ruleDescription": "Check Fn::If has a path that cannot be reached", "phase": "LINT" }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "ruleId": "W1028", + "severity": "WARN", + "message": "['Fn::If', 1] is not reachable. When setting condition 'IsUsWest2' to True", "source": "CFN_LINT", "entity": { - "logicalId": "Database", + "logicalId": "ExclusiveConditionsExcludeInnerBranch", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Function" }, + "propertyPath": "Properties.SnapStart.Fn::If.1.ApplyOn.Fn::If.1", "category": "Best Practice", - "startLine": 31, - "startColumn": 3, - "endLine": 31, - "endColumn": 11, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "startLine": 63, + "startColumn": 36, + "endLine": 63, + "endColumn": 37, + "ruleDescription": "Check Fn::If has a path that cannot be reached", "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Bucket", + "logicalId": "PublishedThroughSubVersion", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::Lambda::Version" }, - "propertyPath": "Properties.BucketName", + "propertyPath": "Properties.FunctionName", "category": "Best Practice", - "startLine": 26, + "startLine": 92, "startColumn": 7, - "endLine": 26, - "endColumn": 17, + "endLine": 92, + "endColumn": 19, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "Fn::If on condition 'IsProd'" + "resolutionSource": "dynamic (Sub:${PublishedThroughSub})" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Database", + "logicalId": "PublishedFromConditionalPropertiesVersion", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Version" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.FunctionName", "category": "Best Practice", - "startLine": 36, + "startLine": 114, "startColumn": 7, - "endLine": 36, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "endLine": 114, + "endColumn": 19, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only", + "resolutionSource": "GetAtt PublishedFromConditionalProperties.Arn" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'MasterUsername' is create-only; updating it will cause resource replacement", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Database", + "logicalId": "PublishedInMatchingConditionVersion", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Version" }, - "propertyPath": "Properties.MasterUsername", + "propertyPath": "Properties.FunctionName", "category": "Best Practice", - "startLine": 37, + "startLine": 132, "startColumn": 7, - "endLine": 37, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "endLine": 132, + "endColumn": 19, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'PublishedInMatchingCondition'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'StorageEncrypted' is create-only; updating it will cause resource replacement", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Database", + "logicalId": "PublishedInUsEast1Version", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Version" }, - "propertyPath": "Properties.StorageEncrypted", + "propertyPath": "Properties.FunctionName", "category": "Best Practice", - "startLine": 39, + "startLine": 148, "startColumn": 7, - "endLine": 39, - "endColumn": 23, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "endLine": 148, + "endColumn": 19, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'PublishedInEveryDeployment'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'BackupRetentionPeriod' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Database", + "logicalId": "PublishedElsewhereVersion", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Version" }, - "propertyPath": "Properties.BackupRetentionPeriod", + "propertyPath": "Properties.FunctionName", "category": "Best Practice", - "startLine": 41, + "startLine": 153, "startColumn": 7, - "endLine": 41, - "endColumn": 28, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "endLine": 153, + "endColumn": 19, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'PublishedInEveryDeployment'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DevBucket", + "logicalId": "PublishedFromMatchingFunctionNameBranchVersion", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::Lambda::Version" }, - "propertyPath": "Properties.BucketName", + "propertyPath": "Properties.FunctionName", "category": "Best Practice", - "startLine": 46, + "startLine": 168, "startColumn": 7, - "endLine": 46, - "endColumn": 17, + "endLine": 168, + "endColumn": 19, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "Fn::If on condition 'IsUsEast1'" } }, - { - "ruleId": "I9003", - "severity": "INFO", - "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", - "source": "ENGINE", - "category": "Best Practice", - "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "Bucket", - "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 25, - "startColumn": 5, - "endLine": 25, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Database' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "Database", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 34, - "startColumn": 5, - "endLine": 34, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'DevBucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Resource 'PropertiesBranchExcludedByResourceCondition' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "DevBucket", + "logicalId": "PropertiesBranchExcludedByResourceCondition", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::Lambda::Function" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 45, + "startLine": 11, "startColumn": 5, - "endLine": 45, + "endLine": 11, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" - } - ] - }, - "good/conditional_constraints_composite_keys_and_monitoring.yaml": { - "filePath": "good/conditional_constraints_composite_keys_and_monitoring.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 7, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 1, - "informational": 18, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "W9002", - "severity": "WARN", - "message": "Property 'MonitoringRoleArn' has a hardcoded ARN - use Ref, GetAtt, or a parameter instead", - "source": "ENGINE", - "entity": { - "logicalId": "ClusterWithEnhancedMonitoring", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" - }, - "propertyPath": "Properties.MonitoringRoleArn", - "category": "Best Practice", - "startLine": 103, - "startColumn": 7, - "endLine": 103, - "endColumn": 24, - "ruleDescription": "Hardcoded ARN property", - "phase": "LINT" - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "TableWithLsiCompositeKey", - "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" - }, - "propertyPath": "Properties.KeySchema", - "category": "Best Practice", - "startLine": 20, - "startColumn": 7, - "endLine": 20, - "endColumn": 16, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "TableWithoutIndexesSimpleKey", - "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" - }, - "propertyPath": "Properties.KeySchema", - "category": "Best Practice", - "startLine": 43, - "startColumn": 7, - "endLine": 43, - "endColumn": 16, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", + "message": "Resource 'ApplyOnBranchExcludedByResourceCondition' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "GlobalTableWithLsiCompositeKey", + "logicalId": "ApplyOnBranchExcludedByResourceCondition", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::GlobalTable" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.KeySchema", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 59, - "startColumn": 7, - "endLine": 59, - "endColumn": 16, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 30, + "startColumn": 5, + "endLine": 30, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'LocalSecondaryIndexes' is conditionally create-only; updating it may cause resource replacement", + "message": "Resource 'RepeatedConditionExcludesInnerBranch' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "GlobalTableWithLsiCompositeKey", + "logicalId": "RepeatedConditionExcludesInnerBranch", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::GlobalTable" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.LocalSecondaryIndexes", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 65, - "startColumn": 7, - "endLine": 65, - "endColumn": 28, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 41, + "startColumn": 5, + "endLine": 41, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Resource 'ExclusiveConditionsExcludeInnerBranch' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "MysqlClusterAdminUsername", + "logicalId": "ExclusiveConditionsExcludeInnerBranch", "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 81, - "startColumn": 7, - "endLine": 81, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 54, + "startColumn": 5, + "endLine": 54, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'MasterUsername' is conditionally create-only; updating it may cause resource replacement", + "message": "Resource 'SnapStartNoValueOrNone' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "MysqlClusterAdminUsername", + "logicalId": "SnapStartNoValueOrNone", "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.MasterUsername", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 82, - "startColumn": 7, - "endLine": 82, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 67, + "startColumn": 5, + "endLine": 67, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Resource 'PublishedThroughSub' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "PostgresClusterOtherUsername", + "logicalId": "PublishedThroughSub", "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 90, - "startColumn": 7, - "endLine": 90, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 80, + "startColumn": 5, + "endLine": 80, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'MasterUsername' is conditionally create-only; updating it may cause resource replacement", + "message": "Resource 'PublishedFromConditionalProperties' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "PostgresClusterOtherUsername", + "logicalId": "PublishedFromConditionalProperties", "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.MasterUsername", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 91, - "startColumn": 7, - "endLine": 91, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 95, + "startColumn": 5, + "endLine": 95, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Resource 'PublishedInMatchingCondition' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ClusterWithEnhancedMonitoring", + "logicalId": "PublishedInMatchingCondition", "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 99, - "startColumn": 7, - "endLine": 99, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 117, + "startColumn": 5, + "endLine": 117, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'MasterUsername' is conditionally create-only; updating it may cause resource replacement", + "message": "Resource 'PublishedInEveryDeployment' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ClusterWithEnhancedMonitoring", + "logicalId": "PublishedInEveryDeployment", "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.MasterUsername", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 100, - "startColumn": 7, - "endLine": 100, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 135, + "startColumn": 5, + "endLine": 135, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Resource 'PublishedFromMatchingFunctionNameBranch' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ClusterWithoutMonitoring", + "logicalId": "PublishedFromMatchingFunctionNameBranch", "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 110, - "startColumn": 7, - "endLine": 110, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 156, + "startColumn": 5, + "endLine": 156, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "good/W3010_getazs_not_flagged.yaml": { + "filePath": "good/W3010_getazs_not_flagged.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 2, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 6, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'MasterUsername' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'AvailabilityZones' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ClusterWithoutMonitoring", + "logicalId": "Elb", "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" + "resourceType": "AWS::ElasticLoadBalancing::LoadBalancer" }, - "propertyPath": "Properties.MasterUsername", + "propertyPath": "Properties.AvailabilityZones", "category": "Best Practice", - "startLine": 111, + "startLine": 8, "startColumn": 7, - "endLine": 111, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", + "endLine": 8, + "endColumn": 24, + "documentationUrl": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -20674,101 +24369,87 @@ } }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'TableWithLsiCompositeKey' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "TableWithLsiCompositeKey", - "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 12, - "startColumn": 5, - "endLine": 12, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'TableWithoutIndexesSimpleKey' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "TableWithoutIndexesSimpleKey", + "logicalId": "Subnet", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 39, - "startColumn": 5, - "endLine": 39, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 16, + "startColumn": 7, + "endLine": 16, + "endColumn": 12, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'MysqlClusterAdminUsername' of type 'AWS::RDS::DBCluster' supports Tags but none are configured", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MysqlClusterAdminUsername", + "logicalId": "Subnet", "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 80, - "startColumn": 5, - "endLine": 80, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 17, + "startColumn": 7, + "endLine": 17, + "endColumn": 16, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'PostgresClusterOtherUsername' of type 'AWS::RDS::DBCluster' supports Tags but none are configured", + "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "PostgresClusterOtherUsername", + "logicalId": "Subnet", "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.AvailabilityZone", "category": "Best Practice", - "startLine": 89, - "startColumn": 5, - "endLine": 89, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 18, + "startColumn": 7, + "endLine": 18, + "endColumn": 23, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'ClusterWithEnhancedMonitoring' of type 'AWS::RDS::DBCluster' supports Tags but none are configured", + "message": "Resource 'Elb' of type 'AWS::ElasticLoadBalancing::LoadBalancer' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ClusterWithEnhancedMonitoring", + "logicalId": "Elb", "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" + "resourceType": "AWS::ElasticLoadBalancing::LoadBalancer" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 98, + "startLine": 7, "startColumn": 5, - "endLine": 98, + "endLine": 7, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -20776,35 +24457,35 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'ClusterWithoutMonitoring' of type 'AWS::RDS::DBCluster' supports Tags but none are configured", + "message": "Resource 'Subnet' of type 'AWS::EC2::Subnet' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ClusterWithoutMonitoring", + "logicalId": "Subnet", "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" + "resourceType": "AWS::EC2::Subnet" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 109, + "startLine": 15, "startColumn": 5, - "endLine": 109, + "endLine": 15, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "good/conditional_constraints_within_limits.yaml": { - "filePath": "good/conditional_constraints_within_limits.yaml", + "good/apigateway_method_authorizer_same_rest_api.yaml": { + "filePath": "good/apigateway_method_authorizer_same_rest_api.yaml", "status": "OK", "metadata": { - "resourcesScanned": 11, + "resourcesScanned": 5, "counts": { "fatal": 0, "errors": 0, "warnings": 0, - "informational": 21, + "informational": 9, "debug": 0 }, "suppressed": 0, @@ -20818,22 +24499,22 @@ "message": "Property 'RestApiId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "TokenAuthorizerAtTheLimit", + "logicalId": "Authorizer1", "entityType": "Resource", "resourceType": "AWS::ApiGateway::Authorizer" }, "propertyPath": "Properties.RestApiId", "category": "Best Practice", - "startLine": 56, + "startLine": 19, "startColumn": 7, - "endLine": 56, + "endLine": 19, "endColumn": 16, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "Ref to 'RestApi'" + "resolutionSource": "GetAtt RestApi1.RestApiId" } }, { @@ -20842,22 +24523,69 @@ "message": "Property 'RestApiId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "CognitoAuthorizerLongTtl", + "logicalId": "Method1", "entityType": "Resource", - "resourceType": "AWS::ApiGateway::Authorizer" + "resourceType": "AWS::ApiGateway::Method" }, "propertyPath": "Properties.RestApiId", "category": "Best Practice", - "startLine": 65, + "startLine": 25, "startColumn": 7, - "endLine": 65, + "endLine": 25, "endColumn": 16, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "Ref to 'RestApi'" + "resolutionSource": "Ref to 'RestApi1'" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ResourceId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "Method1", + "entityType": "Resource", + "resourceType": "AWS::ApiGateway::Method" + }, + "propertyPath": "Properties.ResourceId", + "category": "Best Practice", + "startLine": 26, + "startColumn": 7, + "endLine": 26, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "GetAtt RestApi1.RootResourceId" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'HttpMethod' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "Method1", + "entityType": "Resource", + "resourceType": "AWS::ApiGateway::Method" + }, + "propertyPath": "Properties.HttpMethod", + "category": "Best Practice", + "startLine": 27, + "startColumn": 7, + "endLine": 27, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" } }, { @@ -20866,22 +24594,22 @@ "message": "Property 'RestApiId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Deployment", + "logicalId": "Deployment1", "entityType": "Resource", "resourceType": "AWS::ApiGateway::Deployment" }, "propertyPath": "Properties.RestApiId", "category": "Best Practice", - "startLine": 74, + "startLine": 36, "startColumn": 7, - "endLine": 74, + "endLine": 36, "endColumn": 16, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "Ref to 'RestApi'" + "resolutionSource": "GetAtt RestApi1.RestApiId" } }, { @@ -20890,22 +24618,22 @@ "message": "Property 'RestApiId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "StageWithAbsolutePaths", + "logicalId": "Stage1", "entityType": "Resource", "resourceType": "AWS::ApiGateway::Stage" }, "propertyPath": "Properties.RestApiId", "category": "Best Practice", - "startLine": 78, + "startLine": 40, "startColumn": 7, - "endLine": 78, + "endLine": 40, "endColumn": 16, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "Ref to 'RestApi'" + "resolutionSource": "Ref to 'RestApi1'" } }, { @@ -20914,15 +24642,15 @@ "message": "Property 'StageName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "StageWithAbsolutePaths", + "logicalId": "Stage1", "entityType": "Resource", "resourceType": "AWS::ApiGateway::Stage" }, "propertyPath": "Properties.StageName", "category": "Best Practice", - "startLine": 80, + "startLine": 42, "startColumn": 7, - "endLine": 80, + "endLine": 42, "endColumn": 16, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -20932,73 +24660,99 @@ } }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Resource 'RestApi1' of type 'AWS::ApiGateway::RestApi' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "AuroraLongBackupRetention", + "logicalId": "RestApi1", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::ApiGateway::RestApi" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 95, - "startColumn": 7, - "endLine": 95, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 12, + "startColumn": 5, + "endLine": 12, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Stage1' of type 'AWS::ApiGateway::Stage' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "Stage1", + "entityType": "Resource", + "resourceType": "AWS::ApiGateway::Stage" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 39, + "startColumn": 5, + "endLine": 39, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "good/aurora_dbinstance.yaml": { + "filePath": "good/aurora_dbinstance.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 8, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'DBClusterIdentifier' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "AuroraLongBackupRetention", + "logicalId": "AuroraDB", "entityType": "Resource", "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.DBClusterIdentifier", "category": "Best Practice", - "startLine": 97, - "startColumn": 7, - "endLine": 97, - "endColumn": 26, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 11, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'BackupRetentionPeriod' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "AuroraLongBackupRetention", + "logicalId": "AuroraDB", "entityType": "Resource", "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.BackupRetentionPeriod", "category": "Best Practice", - "startLine": 98, - "startColumn": 7, - "endLine": 98, - "endColumn": 28, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 11, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { "ruleId": "I9001", @@ -21006,15 +24760,15 @@ "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MysqlBackupRetentionAtTheLimit", + "logicalId": "AuroraDB", "entityType": "Resource", "resourceType": "AWS::RDS::DBInstance" }, "propertyPath": "Properties.Engine", "category": "Best Practice", - "startLine": 104, + "startLine": 6, "startColumn": 7, - "endLine": 104, + "endLine": 6, "endColumn": 13, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -21026,42 +24780,19 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'MasterUsername' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "MysqlBackupRetentionAtTheLimit", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" - }, - "propertyPath": "Properties.MasterUsername", - "category": "Best Practice", - "startLine": 107, - "startColumn": 7, - "endLine": 107, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'StorageEncrypted' is create-only; updating it will cause resource replacement", + "message": "Property 'DBClusterIdentifier' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MysqlBackupRetentionAtTheLimit", + "logicalId": "AuroraDB", "entityType": "Resource", "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.StorageEncrypted", + "propertyPath": "Properties.DBClusterIdentifier", "category": "Best Practice", - "startLine": 109, + "startLine": 7, "startColumn": 7, - "endLine": 109, - "endColumn": 23, + "endLine": 7, + "endColumn": 26, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", @@ -21075,15 +24806,15 @@ "message": "Property 'BackupRetentionPeriod' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MysqlBackupRetentionAtTheLimit", + "logicalId": "AuroraDB", "entityType": "Resource", "resourceType": "AWS::RDS::DBInstance" }, "propertyPath": "Properties.BackupRetentionPeriod", "category": "Best Practice", - "startLine": 110, + "startLine": 9, "startColumn": 7, - "endLine": 110, + "endLine": 9, "endColumn": 28, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -21098,15 +24829,15 @@ "message": "'BackupRetentionPeriod' is ignored in this configuration (from extension)", "source": "ENGINE", "entity": { - "logicalId": "AuroraLongBackupRetention", + "logicalId": "AuroraDB", "entityType": "Resource", "resourceType": "AWS::RDS::DBInstance" }, "propertyPath": "Properties.BackupRetentionPeriod", "category": "Best Practice", - "startLine": 98, + "startLine": 9, "startColumn": 7, - "endLine": 98, + "endLine": 9, "endColumn": 28, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Property is ignored in this configuration (from extension)", @@ -21124,150 +24855,30 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'FunctionRole' of type 'AWS::IAM::Role' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "FunctionRole", - "entityType": "Resource", - "resourceType": "AWS::IAM::Role" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 11, - "startColumn": 5, - "endLine": 11, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'TimeoutAtTheLimit' of type 'AWS::Lambda::Function' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "TimeoutAtTheLimit", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 21, - "startColumn": 5, - "endLine": 21, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'ManagedInstancesLongTimeout' of type 'AWS::Lambda::Function' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "ManagedInstancesLongTimeout", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 31, - "startColumn": 5, - "endLine": 31, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'RestApi' of type 'AWS::ApiGateway::RestApi' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "RestApi", - "entityType": "Resource", - "resourceType": "AWS::ApiGateway::RestApi" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 50, - "startColumn": 5, - "endLine": 50, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'StageWithAbsolutePaths' of type 'AWS::ApiGateway::Stage' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "StageWithAbsolutePaths", - "entityType": "Resource", - "resourceType": "AWS::ApiGateway::Stage" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 77, - "startColumn": 5, - "endLine": 77, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'AuroraLongBackupRetention' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "AuroraLongBackupRetention", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 94, - "startColumn": 5, - "endLine": 94, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'MysqlBackupRetentionAtTheLimit' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "message": "Resource 'AuroraDB' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "MysqlBackupRetentionAtTheLimit", + "logicalId": "AuroraDB", "entityType": "Resource", "resourceType": "AWS::RDS::DBInstance" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 103, + "startLine": 5, "startColumn": 5, - "endLine": 103, + "endLine": 5, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "good/conditions.yaml": { - "filePath": "good/conditions.yaml", + "good/both_forms.yaml": { + "filePath": "good/both_forms.yaml", "status": "OK", "metadata": { - "resourcesScanned": 2, + "resourcesScanned": 13, "counts": { "fatal": 0, "errors": 0, @@ -21281,72 +24892,73 @@ }, "diagnostics": [ { - "ruleId": "W9010", + "ruleId": "W8001", "severity": "WARN", - "message": "Hardcoded AMI ID - use a parameter or mapping for portability", - "source": "ENGINE", + "message": "Condition 'Combined' is not used by any resource or Fn::If", + "source": "CFN_LINT", "entity": { - "logicalId": "myInstance", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "logicalId": "Combined", + "entityType": "Condition" }, - "propertyPath": "Properties.ImageId", - "category": "Security", - "startLine": 28, - "startColumn": 7, - "endLine": 28, - "endColumn": 14, - "ruleDescription": "Hardcoded AMI ID", + "propertyPath": "Conditions/Combined", + "category": "Best Practice", + "startLine": 12, + "startColumn": 3, + "endLine": 12, + "endColumn": 11, + "ruleDescription": "Check if Conditions are Used", "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "myInstance", + "logicalId": "BucketShort", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Properties.BucketName", "category": "Best Practice", - "startLine": 28, + "startLine": 20, "startColumn": 7, - "endLine": 28, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 20, + "endColumn": 17, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "Fn::If on condition 'isProd'" + "resolutionSource": "parameter with AllowedValues" } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'CloudFrontDistribution' of type 'AWS::CloudFront::Distribution' supports Tags but none are configured", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "CloudFrontDistribution", + "logicalId": "BucketLong", "entityType": "Resource", - "resourceType": "AWS::CloudFront::Distribution" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.BucketName", "category": "Best Practice", - "startLine": 41, - "startColumn": 5, - "endLine": 41, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 27, + "startColumn": 7, + "endLine": 27, + "endColumn": 17, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "parameter with AllowedValues" + } } ] }, - "good/conditions/and.yaml": { - "filePath": "good/conditions/and.yaml", + "good/cdk_bootstrap_version_rule.json": { + "filePath": "good/cdk_bootstrap_version_rule.json", "status": "OK", "metadata": { "resourcesScanned": 1, @@ -21354,480 +24966,354 @@ "fatal": 0, "errors": 0, "warnings": 0, - "informational": 0, + "informational": 1, "debug": 0 }, "suppressed": 0, "strict": false, "severityLevel": "DEBUG" }, - "diagnostics": [] - }, - "good/core/conditions.yaml": { - "filePath": "good/core/conditions.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 8, - "counts": { - "fatal": 2, - "errors": 0, - "warnings": 9, - "informational": 18, - "debug": 0 - }, - "suppressed": 2, - "strict": false, - "severityLevel": "DEBUG" - }, "diagnostics": [ { - "ruleId": "F3003", - "severity": "FATAL", - "message": "'Role' is a required property", - "source": "SCHEMA", - "entity": { - "logicalId": "AMIIDLookup", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "Properties", - "suggestedFix": "Add the required property 'Role'", - "category": "Schema", - "startLine": 101, - "startColumn": 5, - "endLine": 101, - "endColumn": 15, - "conditionScenario": { - "isPrimary": false - }, - "ruleDescription": "Required property missing", - "phase": "SCHEMA" - }, - { - "ruleId": "F3014", - "severity": "FATAL", - "message": "Exactly one of ['VirtualName', 'Ebs', 'NoDevice'] must be specified", - "source": "SCHEMA", - "entity": { - "logicalId": "myInstance2", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.BlockDeviceMappings.{}", - "category": "Schema", - "startLine": 36, - "startColumn": 7, - "endLine": 36, - "endColumn": 26, - "conditionScenario": { - "isPrimary": true, - "isPrimaryAndProduction": true - }, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Exactly one of properties required (requiredXor)", - "phase": "SCHEMA", - "context": { - "resolutionSource": "Fn::If on condition 'isPrimaryAndProduction'" - } - }, - { - "ruleId": "W1028", - "severity": "WARN", - "message": "['Fn::If', 2] is not reachable. When setting condition 'isPrimary' to False. Where existing status for condition 'isPrimaryAndProduction' is True", - "source": "CFN_LINT", - "entity": { - "logicalId": "myInstance2", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.BlockDeviceMappings.Fn::If.1.0.VirtualName.Fn::If.2", - "category": "Best Practice", - "startLine": 44, - "startColumn": 19, - "endLine": 44, - "endColumn": 20, - "ruleDescription": "Check Fn::If has a path that cannot be reached", - "phase": "LINT" - }, - { - "ruleId": "W1028", - "severity": "WARN", - "message": "['Fn::If', 2] is not reachable. When setting condition 'isPrimary' to False. Where existing status for condition 'isPrimaryAndProduction' is True", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "myInstance4", + "logicalId": "Bucket", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.InstanceType.Fn::If.1.Fn::If.2", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 74, - "startColumn": 13, - "endLine": 74, - "endColumn": 14, - "ruleDescription": "Check Fn::If has a path that cannot be reached", - "phase": "LINT" - }, - { - "ruleId": "W2531", - "severity": "WARN", - "message": "Runtime 'nodejs18.x' was deprecated on '2025-09-01'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'nodejs24.x'", - "source": "CFN_LINT", - "entity": { - "logicalId": "AMIIDLookup", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 111, + "startLine": 13, "startColumn": 7, - "endLine": 111, - "endColumn": 14, - "ruleDescription": "Check if EOL Lambda Function Runtimes are used", - "phase": "SCHEMA", - "context": { - "actualValue": "nodejs18.x", - "lifecycle": "deprecated" - } - }, - { - "ruleId": "W8001", - "severity": "WARN", - "message": "Condition 'isNotProduction' is not used by any resource or Fn::If", - "source": "CFN_LINT", - "entity": { - "logicalId": "isNotProduction", - "entityType": "Condition" - }, - "propertyPath": "Conditions/isNotProduction", - "category": "Best Practice", - "startLine": 17, - "startColumn": 3, - "endLine": 17, + "endLine": 13, "endColumn": 18, - "ruleDescription": "Check if Conditions are Used", - "phase": "LINT" - }, - { - "ruleId": "W8001", - "severity": "WARN", - "message": "Condition 'isPrimaryAndProdOrStage' is not used by any resource or Fn::If", - "source": "CFN_LINT", - "entity": { - "logicalId": "isPrimaryAndProdOrStage", - "entityType": "Condition" - }, - "propertyPath": "Conditions/isPrimaryAndProdOrStage", - "category": "Best Practice", - "startLine": 19, - "startColumn": 3, - "endLine": 19, - "endColumn": 26, - "ruleDescription": "Check if Conditions are Used", + "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "good/cloudfront_valid.yaml": { + "filePath": "good/cloudfront_valid.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 1, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "W9010", - "severity": "WARN", - "message": "Hardcoded AMI ID - use a parameter or mapping for portability", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Distribution' of type 'AWS::CloudFront::Distribution' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "myInstance1", + "logicalId": "Distribution", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::CloudFront::Distribution" }, - "propertyPath": "Properties.ImageId", - "category": "Security", - "startLine": 31, - "startColumn": 7, - "endLine": 31, - "endColumn": 14, - "ruleDescription": "Hardcoded AMI ID", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "good/codepipeline_artifact_counts.yaml": { + "filePath": "good/codepipeline_artifact_counts.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 1, + "informational": 1, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "W9010", + "ruleId": "W9002", "severity": "WARN", - "message": "Hardcoded AMI ID - use a parameter or mapping for portability", + "message": "Property 'RoleArn' has a hardcoded ARN - use Ref, GetAtt, or a parameter instead", "source": "ENGINE", "entity": { - "logicalId": "myInstance2", + "logicalId": "Pipeline", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::CodePipeline::Pipeline" }, - "propertyPath": "Properties.ImageId", - "category": "Security", - "startLine": 35, + "propertyPath": "Properties.RoleArn", + "category": "Best Practice", + "startLine": 6, "startColumn": 7, - "endLine": 35, + "endLine": 6, "endColumn": 14, - "ruleDescription": "Hardcoded AMI ID", + "ruleDescription": "Hardcoded ARN property", "phase": "LINT" }, { - "ruleId": "W9010", - "severity": "WARN", - "message": "Hardcoded AMI ID - use a parameter or mapping for portability", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Pipeline' of type 'AWS::CodePipeline::Pipeline' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "myInstance3", + "logicalId": "Pipeline", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::CodePipeline::Pipeline" }, - "propertyPath": "Properties.ImageId", - "category": "Security", - "startLine": 53, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 5, "startColumn": 5, - "endLine": 53, + "endLine": 5, "endColumn": 15, - "ruleDescription": "Hardcoded AMI ID", + "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "good/complex_conditions.yaml": { + "filePath": "good/complex_conditions.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 3, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 2, + "informational": 12, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "W9010", + "ruleId": "W2501", "severity": "WARN", - "message": "Hardcoded AMI ID - use a parameter or mapping for portability", - "source": "ENGINE", + "message": "Property 'MasterUserPassword' should not be a hardcoded string - use a parameter with NoEcho or a dynamic reference", + "source": "CFN_LINT", "entity": { - "logicalId": "myInstance4", + "logicalId": "Database", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Properties.MasterUserPassword", "category": "Security", - "startLine": 67, + "startLine": 38, "startColumn": 7, - "endLine": 67, - "endColumn": 14, - "ruleDescription": "Hardcoded AMI ID", + "endLine": 38, + "endColumn": 25, + "ruleDescription": "Check if Password Properties are correctly configured", "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "mySubnet", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.CidrBlock", - "category": "Best Practice", - "startLine": 25, - "startColumn": 7, - "endLine": 25, - "endColumn": 16, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W8001", + "severity": "WARN", + "message": "Condition 'IsNotProd' is not used by any resource or Fn::If", + "source": "CFN_LINT", "entity": { - "logicalId": "mySubnet", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "logicalId": "IsNotProd", + "entityType": "Condition" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Conditions/IsNotProd", "category": "Best Practice", - "startLine": 26, - "startColumn": 7, - "endLine": 26, + "startLine": 20, + "startColumn": 3, + "endLine": 20, "endColumn": 12, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "ruleDescription": "Check if Conditions are Used", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "myInstance1", + "logicalId": "Database", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.SubnetId", "category": "Best Practice", - "startLine": 30, - "startColumn": 7, - "endLine": 30, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Fn::If on condition 'isDevelopment'" - } + "startLine": 31, + "startColumn": 3, + "endLine": 31, + "endColumn": 11, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "myInstance1", + "logicalId": "Database", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.ImageId", "category": "Best Practice", "startLine": 31, - "startColumn": 7, + "startColumn": 3, "endLine": 31, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "endColumn": 11, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "myInstance2", + "logicalId": "Bucket", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Properties.BucketName", "category": "Best Practice", - "startLine": 35, + "startLine": 26, "startColumn": 7, - "endLine": 35, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 26, + "endColumn": 17, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "Fn::If on condition 'IsProd'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'BlockDeviceMappings' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "myInstance2", + "logicalId": "Database", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.BlockDeviceMappings", + "propertyPath": "Properties.Engine", "category": "Best Practice", "startLine": 36, "startColumn": 7, "endLine": 36, - "endColumn": 26, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only", - "resolutionSource": "Fn::If on condition 'isPrimaryAndProduction'" + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "message": "Property 'MasterUsername' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "myInstance4", + "logicalId": "Database", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Properties.MasterUsername", "category": "Best Practice", - "startLine": 67, + "startLine": 37, "startColumn": 7, - "endLine": 67, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 37, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Fn::If on condition 'isProduction'" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'StorageEncrypted' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "myInstance4", + "logicalId": "Database", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.InstanceType", + "propertyPath": "Properties.StorageEncrypted", "category": "Best Practice", - "startLine": 68, + "startLine": 39, "startColumn": 7, - "endLine": 68, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 39, + "endColumn": 23, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only", - "resolutionSource": "Fn::If on condition 'isPrimaryAndProduction'" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Path' is create-only; updating it will cause resource replacement", + "message": "Property 'BackupRetentionPeriod' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "LambdaExecutionRole", + "logicalId": "Database", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Path", + "propertyPath": "Properties.BackupRetentionPeriod", "category": "Best Practice", - "startLine": 91, + "startLine": 41, "startColumn": 7, - "endLine": 91, - "endColumn": 11, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "endLine": 41, + "endColumn": 28, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Path' is create-only; updating it will cause resource replacement", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "InstanceProfile", + "logicalId": "DevBucket", "entityType": "Resource", - "resourceType": "AWS::IAM::InstanceProfile" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.Path", + "propertyPath": "Properties.BucketName", "category": "Best Practice", - "startLine": 96, + "startLine": 46, "startColumn": 7, - "endLine": 96, - "endColumn": 11, + "endLine": 46, + "endColumn": 17, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -21846,39 +25332,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'mySubnet' of type 'AWS::EC2::Subnet' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "mySubnet", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 24, - "startColumn": 5, - "endLine": 24, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'myInstance1' of type 'AWS::EC2::Instance' supports Tags but none are configured", + "message": "Resource 'Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "myInstance1", + "logicalId": "Bucket", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::S3::Bucket" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 29, + "startLine": 25, "startColumn": 5, - "endLine": 29, + "endLine": 25, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -21886,12 +25352,12 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'myInstance2' of type 'AWS::EC2::Instance' supports Tags but none are configured", + "message": "Resource 'Database' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "myInstance2", + "logicalId": "Database", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::RDS::DBInstance" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", @@ -21906,159 +25372,35 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'myInstance3' of type 'AWS::EC2::Instance' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "myInstance3", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 53, - "startColumn": 5, - "endLine": 53, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'myInstance4' of type 'AWS::EC2::Instance' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "myInstance4", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 66, - "startColumn": 5, - "endLine": 66, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'LambdaExecutionRole' of type 'AWS::IAM::Role' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "LambdaExecutionRole", - "entityType": "Resource", - "resourceType": "AWS::IAM::Role" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 79, - "startColumn": 5, - "endLine": 79, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'AMIIDLookup' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "message": "Resource 'DevBucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "AMIIDLookup", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 101, - "startColumn": 5, - "endLine": 101, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "good/core/config_cfn_lint.json": { - "filePath": "good/core/config_cfn_lint.json", - "status": "OK", - "metadata": { - "resourcesScanned": 0, - "counts": { - "fatal": 1, - "errors": 0, - "warnings": 0, - "informational": 0, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "F0001", - "severity": "FATAL", - "message": "Resources section must exist and be non-empty", - "source": "SCHEMA", - "category": "Structure", - "startLine": 16, - "startColumn": 2, - "endLine": 16, - "endColumn": 12, - "ruleDescription": "Resources section must exist and be non-empty", - "phase": "SCHEMA" - } - ] - }, - "good/core/config_cfn_lint.yaml": { - "filePath": "good/core/config_cfn_lint.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 0, - "counts": { - "fatal": 1, - "errors": 0, - "warnings": 0, - "informational": 0, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "F0001", - "severity": "FATAL", - "message": "Resources section must exist and be non-empty", - "source": "SCHEMA", - "category": "Structure", - "startLine": 11, - "startColumn": 1, - "endLine": 11, - "endColumn": 10, - "ruleDescription": "Resources section must exist and be non-empty", - "phase": "SCHEMA" + "logicalId": "DevBucket", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 45, + "startColumn": 5, + "endLine": 45, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" } ] }, - "good/core/config_default_e3012.yaml": { - "filePath": "good/core/config_default_e3012.yaml", + "good/conditional_constraints_composite_keys_and_monitoring.yaml": { + "filePath": "good/conditional_constraints_composite_keys_and_monitoring.yaml", "status": "OK", "metadata": { - "resourcesScanned": 1, + "resourcesScanned": 7, "counts": { "fatal": 0, "errors": 0, "warnings": 1, - "informational": 3, + "informational": 18, "debug": 0 }, "suppressed": 0, @@ -22067,44 +25409,44 @@ }, "diagnostics": [ { - "ruleId": "W9003", + "ruleId": "W9002", "severity": "WARN", - "message": "'5' is not of type 'integer' - automatically coerced (string to integer)", - "source": "CFN_LINT", + "message": "Property 'MonitoringRoleArn' has a hardcoded ARN - use Ref, GetAtt, or a parameter instead", + "source": "ENGINE", "entity": { - "logicalId": "myTable", + "logicalId": "ClusterWithEnhancedMonitoring", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::RDS::DBCluster" }, - "propertyPath": "Properties.ProvisionedThroughput.WriteCapacityUnits", + "propertyPath": "Properties.MonitoringRoleArn", "category": "Best Practice", - "startLine": 20, - "startColumn": 9, - "endLine": 20, - "endColumn": 27, - "ruleDescription": "Property type coercion warning", - "phase": "SCHEMA" + "startLine": 103, + "startColumn": 7, + "endLine": 103, + "endColumn": 24, + "ruleDescription": "Hardcoded ARN property", + "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'TableName' is create-only; updating it will cause resource replacement", + "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "myTable", + "logicalId": "TableWithLsiCompositeKey", "entityType": "Resource", "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.TableName", + "propertyPath": "Properties.KeySchema", "category": "Best Practice", - "startLine": 11, + "startLine": 20, "startColumn": 7, - "endLine": 11, + "endLine": 20, "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } }, { @@ -22113,15 +25455,15 @@ "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "myTable", + "logicalId": "TableWithoutIndexesSimpleKey", "entityType": "Resource", "resourceType": "AWS::DynamoDB::Table" }, "propertyPath": "Properties.KeySchema", "category": "Best Practice", - "startLine": 15, + "startLine": 43, "startColumn": 7, - "endLine": 15, + "endLine": 43, "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", @@ -22130,297 +25472,204 @@ } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'myTable' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", + "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "myTable", + "logicalId": "GlobalTableWithLsiCompositeKey", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::DynamoDB::GlobalTable" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.KeySchema", "category": "Best Practice", - "startLine": 10, - "startColumn": 5, - "endLine": 10, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "good/core/config_only_i1002.yaml": { - "filePath": "good/core/config_only_i1002.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 0, - "counts": { - "fatal": 1, - "errors": 0, - "warnings": 0, - "informational": 0, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "F0001", - "severity": "FATAL", - "message": "Resources section must exist and be non-empty", - "source": "SCHEMA", - "category": "Structure", - "startLine": 8, - "startColumn": 1, - "endLine": 8, - "endColumn": 10, - "ruleDescription": "Resources section must exist and be non-empty", - "phase": "SCHEMA" - } - ] - }, - "good/core/config_only_i1003.yaml": { - "filePath": "good/core/config_only_i1003.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 0, - "counts": { - "fatal": 1, - "errors": 0, - "warnings": 0, - "informational": 0, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "F0001", - "severity": "FATAL", - "message": "Resources section must exist and be non-empty", - "source": "SCHEMA", - "category": "Structure", - "startLine": 8, - "startColumn": 1, - "endLine": 8, - "endColumn": 10, - "ruleDescription": "Resources section must exist and be non-empty", - "phase": "SCHEMA" - } - ] - }, - "good/core/config_parameters.yaml": { - "filePath": "good/core/config_parameters.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 0, - "counts": { - "fatal": 1, - "errors": 0, - "warnings": 0, - "informational": 0, - "debug": 0 + "startLine": 59, + "startColumn": 7, + "endLine": 59, + "endColumn": 16, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "F0001", - "severity": "FATAL", - "message": "Resources section must exist and be non-empty", - "source": "SCHEMA", - "category": "Structure", - "startLine": 8, - "startColumn": 1, - "endLine": 8, - "endColumn": 10, - "ruleDescription": "Resources section must exist and be non-empty", - "phase": "SCHEMA" - } - ] - }, - "good/core/directives.yaml": { - "filePath": "good/core/directives.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 3, - "debug": 0 + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'LocalSecondaryIndexes' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "GlobalTableWithLsiCompositeKey", + "entityType": "Resource", + "resourceType": "AWS::DynamoDB::GlobalTable" + }, + "propertyPath": "Properties.LocalSecondaryIndexes", + "category": "Best Practice", + "startLine": 65, + "startColumn": 7, + "endLine": 65, + "endColumn": 28, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "MyKey", + "logicalId": "MysqlClusterAdminUsername", "entityType": "Resource", - "resourceType": "AWS::KMS::Key" + "resourceType": "AWS::RDS::DBCluster" }, + "propertyPath": "Properties.Engine", "category": "Best Practice", - "startLine": 4, - "startColumn": 3, - "endLine": 4, - "endColumn": 8, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 81, + "startColumn": 7, + "endLine": 81, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'MasterUsername' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "MyKey", + "logicalId": "MysqlClusterAdminUsername", "entityType": "Resource", - "resourceType": "AWS::KMS::Key" + "resourceType": "AWS::RDS::DBCluster" }, + "propertyPath": "Properties.MasterUsername", "category": "Best Practice", - "startLine": 4, - "startColumn": 3, - "endLine": 4, - "endColumn": 8, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 82, + "startColumn": 7, + "endLine": 82, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'MyKey' of type 'AWS::KMS::Key' supports Tags but none are configured", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MyKey", + "logicalId": "PostgresClusterOtherUsername", "entityType": "Resource", - "resourceType": "AWS::KMS::Key" + "resourceType": "AWS::RDS::DBCluster" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.Engine", "category": "Best Practice", - "startLine": 4, - "startColumn": 3, - "endLine": 4, - "endColumn": 8, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "good/core/resource_attributes.yaml": { - "filePath": "good/core/resource_attributes.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 8, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 11, - "debug": 0 + "startLine": 90, + "startColumn": 7, + "endLine": 90, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", + "message": "Property 'MasterUsername' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "CommonCfnAttributes", + "logicalId": "PostgresClusterOtherUsername", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::RDS::DBCluster" }, - "propertyPath": "Properties.BucketName", + "propertyPath": "Properties.MasterUsername", "category": "Best Practice", - "startLine": 26, + "startLine": 91, "startColumn": 7, - "endLine": 26, - "endColumn": 17, + "endLine": 91, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DependsOnSingleString", + "logicalId": "ClusterWithEnhancedMonitoring", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::RDS::DBCluster" }, - "propertyPath": "Properties.BucketName", + "propertyPath": "Properties.Engine", "category": "Best Practice", - "startLine": 33, + "startLine": 99, "startColumn": 7, - "endLine": 33, - "endColumn": 17, + "endLine": 99, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", + "message": "Property 'MasterUsername' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DependsOnList", + "logicalId": "ClusterWithEnhancedMonitoring", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::RDS::DBCluster" }, - "propertyPath": "Properties.BucketName", + "propertyPath": "Properties.MasterUsername", "category": "Best Practice", - "startLine": 42, + "startLine": 100, "startColumn": 7, - "endLine": 42, - "endColumn": 17, + "endLine": 100, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'LaunchTemplate' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "AutoScalingGroupWithPolicies", + "logicalId": "ClusterWithoutMonitoring", "entityType": "Resource", - "resourceType": "AWS::AutoScaling::AutoScalingGroup" + "resourceType": "AWS::RDS::DBCluster" }, - "propertyPath": "Properties.LaunchTemplate", + "propertyPath": "Properties.Engine", "category": "Best Practice", - "startLine": 63, + "startLine": 110, "startColumn": 7, - "endLine": 63, - "endColumn": 21, + "endLine": 110, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -22430,41 +25679,42 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", + "message": "Property 'MasterUsername' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "BucketWithTransform", + "logicalId": "ClusterWithoutMonitoring", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::RDS::DBCluster" }, - "propertyPath": "Properties.BucketName", + "propertyPath": "Properties.MasterUsername", "category": "Best Practice", - "startLine": 82, + "startLine": 111, "startColumn": 7, - "endLine": 82, - "endColumn": 17, + "endLine": 111, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'CommonCfnAttributes' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Resource 'TableWithLsiCompositeKey' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "CommonCfnAttributes", + "logicalId": "TableWithLsiCompositeKey", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::DynamoDB::Table" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 25, + "startLine": 12, "startColumn": 5, - "endLine": 25, + "endLine": 12, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -22472,19 +25722,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'DependsOnSingleString' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Resource 'TableWithoutIndexesSimpleKey' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "DependsOnSingleString", + "logicalId": "TableWithoutIndexesSimpleKey", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::DynamoDB::Table" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 32, + "startLine": 39, "startColumn": 5, - "endLine": 32, + "endLine": 39, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -22492,19 +25742,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'DependsOnList' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Resource 'MysqlClusterAdminUsername' of type 'AWS::RDS::DBCluster' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "DependsOnList", + "logicalId": "MysqlClusterAdminUsername", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::RDS::DBCluster" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 41, + "startLine": 80, "startColumn": 5, - "endLine": 41, + "endLine": 80, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -22512,19 +25762,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'AutoScalingGroupWithPolicies' of type 'AWS::AutoScaling::AutoScalingGroup' supports Tags but none are configured", + "message": "Resource 'PostgresClusterOtherUsername' of type 'AWS::RDS::DBCluster' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "AutoScalingGroupWithPolicies", + "logicalId": "PostgresClusterOtherUsername", "entityType": "Resource", - "resourceType": "AWS::AutoScaling::AutoScalingGroup" + "resourceType": "AWS::RDS::DBCluster" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 60, + "startLine": 89, "startColumn": 5, - "endLine": 60, + "endLine": 89, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -22532,19 +25782,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'BucketWithTransform' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Resource 'ClusterWithEnhancedMonitoring' of type 'AWS::RDS::DBCluster' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "BucketWithTransform", + "logicalId": "ClusterWithEnhancedMonitoring", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::RDS::DBCluster" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 81, + "startLine": 98, "startColumn": 5, - "endLine": 81, + "endLine": 98, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -22552,35 +25802,35 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'BucketWithConnectors' of type 'AWS::Serverless::Function' supports Tags but none are configured", + "message": "Resource 'ClusterWithoutMonitoring' of type 'AWS::RDS::DBCluster' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "BucketWithConnectors", + "logicalId": "ClusterWithoutMonitoring", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::RDS::DBCluster" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 94, + "startLine": 109, "startColumn": 5, - "endLine": 94, + "endLine": 109, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "good/custom/is-defined.yaml": { - "filePath": "good/custom/is-defined.yaml", + "good/conditional_constraints_within_limits.yaml": { + "filePath": "good/conditional_constraints_within_limits.yaml", "status": "OK", "metadata": { - "resourcesScanned": 7, + "resourcesScanned": 11, "counts": { - "fatal": 2, + "fatal": 0, "errors": 0, - "warnings": 12, - "informational": 8, + "warnings": 0, + "informational": 21, "debug": 0 }, "suppressed": 0, @@ -22589,330 +25839,350 @@ }, "diagnostics": [ { - "ruleId": "F0005", - "severity": "FATAL", - "message": "'Parameter' is not a valid top-level template section", - "source": "SCHEMA", - "propertyPath": "Parameter", - "category": "Structure", - "startLine": 4, - "startColumn": 1, - "endLine": 4, - "endColumn": 10, - "ruleDescription": "Top-level keys must be valid section names", - "phase": "SCHEMA" - }, - { - "ruleId": "F1020", - "severity": "FATAL", - "message": "'NodeEnv' is not one of ['AWS::AccountId', 'AWS::NoValue', 'AWS::NotificationARNs', 'AWS::Partition', 'AWS::Region', 'AWS::StackId', 'AWS::StackName', 'AWS::URLSuffix', 'LambdaExecutionRole', 'LambdaFunctionTestDefinedArray', 'LambdaFunctionTestDefinedEmpty', 'LambdaFunctionTestDefinedGetAttr', 'LambdaFunctionTestDefinedObject', 'LambdaFunctionTestDefinedRef', 'LambdaFunctionTestDefinedValue']", - "source": "SCHEMA", - "entity": { - "logicalId": "LambdaFunctionTestDefinedRef", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "Properties.Environment.Variables.NODE_ENV", - "suggestedFix": "Check that the Ref target exists as a resource, parameter, or pseudo-parameter", - "category": "Intrinsic Function", - "startLine": 70, - "startColumn": 11, - "endLine": 70, - "endColumn": 19, - "ruleDescription": "Ref/GetAtt target must exist", - "phase": "SCHEMA" + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'RestApiId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "TokenAuthorizerAtTheLimit", + "entityType": "Resource", + "resourceType": "AWS::ApiGateway::Authorizer" + }, + "propertyPath": "Properties.RestApiId", + "category": "Best Practice", + "startLine": 56, + "startColumn": 7, + "endLine": 56, + "endColumn": 16, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'RestApi'" + } }, { - "ruleId": "W2531", - "severity": "WARN", - "message": "Runtime 'nodejs18.x' was deprecated on '2025-09-01'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'nodejs24.x'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'RestApiId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "LambdaFunctionTestDefinedArray", + "logicalId": "CognitoAuthorizerLongTtl", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::ApiGateway::Authorizer" }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 32, + "propertyPath": "Properties.RestApiId", + "category": "Best Practice", + "startLine": 65, "startColumn": 7, - "endLine": 32, - "endColumn": 14, - "ruleDescription": "Check if EOL Lambda Function Runtimes are used", + "endLine": 65, + "endColumn": 16, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway.git", + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "actualValue": "nodejs18.x", - "lifecycle": "deprecated" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'RestApi'" } }, { - "ruleId": "W2531", - "severity": "WARN", - "message": "Runtime 'nodejs18.x' was deprecated on '2025-09-01'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'nodejs24.x'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'RestApiId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "LambdaFunctionTestDefinedEmpty", + "logicalId": "Deployment", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::ApiGateway::Deployment" }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 42, + "propertyPath": "Properties.RestApiId", + "category": "Best Practice", + "startLine": 74, "startColumn": 7, - "endLine": 42, - "endColumn": 14, - "ruleDescription": "Check if EOL Lambda Function Runtimes are used", + "endLine": 74, + "endColumn": 16, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway", + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "actualValue": "nodejs18.x", - "lifecycle": "deprecated" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'RestApi'" } }, { - "ruleId": "W2531", - "severity": "WARN", - "message": "Runtime 'nodejs18.x' was deprecated on '2025-09-01'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'nodejs24.x'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'RestApiId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "LambdaFunctionTestDefinedGetAttr", + "logicalId": "StageWithAbsolutePaths", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::ApiGateway::Stage" }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 52, + "propertyPath": "Properties.RestApiId", + "category": "Best Practice", + "startLine": 78, "startColumn": 7, - "endLine": 52, - "endColumn": 14, - "ruleDescription": "Check if EOL Lambda Function Runtimes are used", + "endLine": 78, + "endColumn": 16, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway", + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "actualValue": "nodejs18.x", - "lifecycle": "deprecated" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'RestApi'" } }, { - "ruleId": "W2531", - "severity": "WARN", - "message": "Runtime 'nodejs18.x' was deprecated on '2025-09-01'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'nodejs24.x'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'StageName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "LambdaFunctionTestDefinedObject", + "logicalId": "StageWithAbsolutePaths", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::ApiGateway::Stage" }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 63, + "propertyPath": "Properties.StageName", + "category": "Best Practice", + "startLine": 80, "startColumn": 7, - "endLine": 63, - "endColumn": 14, - "ruleDescription": "Check if EOL Lambda Function Runtimes are used", + "endLine": 80, + "endColumn": 16, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway", + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "actualValue": "nodejs18.x", - "lifecycle": "deprecated" + "lifecycle": "create-only" } }, { - "ruleId": "W2531", - "severity": "WARN", - "message": "Runtime 'nodejs18.x' was deprecated on '2025-09-01'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'nodejs24.x'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "LambdaFunctionTestDefinedRef", + "logicalId": "AuroraLongBackupRetention", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 73, + "propertyPath": "Properties.Engine", + "category": "Best Practice", + "startLine": 95, "startColumn": 7, - "endLine": 73, - "endColumn": 14, - "ruleDescription": "Check if EOL Lambda Function Runtimes are used", + "endLine": 95, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "actualValue": "nodejs18.x", - "lifecycle": "deprecated" + "lifecycle": "conditional-create-only" } }, { - "ruleId": "W2531", - "severity": "WARN", - "message": "Runtime 'nodejs18.x' was deprecated on '2025-09-01'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'nodejs24.x'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'DBClusterIdentifier' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "LambdaFunctionTestDefinedValue", + "logicalId": "AuroraLongBackupRetention", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 83, + "propertyPath": "Properties.DBClusterIdentifier", + "category": "Best Practice", + "startLine": 97, "startColumn": 7, - "endLine": 83, - "endColumn": 14, - "ruleDescription": "Check if EOL Lambda Function Runtimes are used", + "endLine": 97, + "endColumn": 26, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "actualValue": "nodejs18.x", - "lifecycle": "deprecated" + "lifecycle": "create-only" } }, { - "ruleId": "W3002", - "severity": "WARN", - "message": "This code may only work with 'package' cli command", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'BackupRetentionPeriod' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "LambdaFunctionTestDefinedArray", + "logicalId": "AuroraLongBackupRetention", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Code", + "propertyPath": "Properties.BackupRetentionPeriod", "category": "Best Practice", - "startLine": 24, + "startLine": 98, "startColumn": 7, - "endLine": 24, - "endColumn": 11, - "ruleDescription": "Warn when properties are configured to only work with the package command", - "phase": "LINT" + "endLine": 98, + "endColumn": 28, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "W3002", - "severity": "WARN", - "message": "This code may only work with 'package' cli command", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "LambdaFunctionTestDefinedEmpty", + "logicalId": "MysqlBackupRetentionAtTheLimit", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Code", + "propertyPath": "Properties.Engine", "category": "Best Practice", - "startLine": 36, + "startLine": 104, "startColumn": 7, - "endLine": 36, - "endColumn": 11, - "ruleDescription": "Warn when properties are configured to only work with the package command", - "phase": "LINT" + "endLine": 104, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "W3002", - "severity": "WARN", - "message": "This code may only work with 'package' cli command", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'MasterUsername' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "LambdaFunctionTestDefinedGetAttr", + "logicalId": "MysqlBackupRetentionAtTheLimit", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Code", + "propertyPath": "Properties.MasterUsername", "category": "Best Practice", - "startLine": 46, + "startLine": 107, "startColumn": 7, - "endLine": 46, - "endColumn": 11, - "ruleDescription": "Warn when properties are configured to only work with the package command", - "phase": "LINT" + "endLine": 107, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W3002", - "severity": "WARN", - "message": "This code may only work with 'package' cli command", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'StorageEncrypted' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "LambdaFunctionTestDefinedObject", + "logicalId": "MysqlBackupRetentionAtTheLimit", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Code", + "propertyPath": "Properties.StorageEncrypted", "category": "Best Practice", - "startLine": 56, + "startLine": 109, "startColumn": 7, - "endLine": 56, - "endColumn": 11, - "ruleDescription": "Warn when properties are configured to only work with the package command", - "phase": "LINT" + "endLine": 109, + "endColumn": 23, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W3002", - "severity": "WARN", - "message": "This code may only work with 'package' cli command", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'BackupRetentionPeriod' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "LambdaFunctionTestDefinedRef", + "logicalId": "MysqlBackupRetentionAtTheLimit", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Code", + "propertyPath": "Properties.BackupRetentionPeriod", "category": "Best Practice", - "startLine": 67, + "startLine": 110, "startColumn": 7, - "endLine": 67, - "endColumn": 11, - "ruleDescription": "Warn when properties are configured to only work with the package command", - "phase": "LINT" + "endLine": 110, + "endColumn": 28, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "W3002", - "severity": "WARN", - "message": "This code may only work with 'package' cli command", - "source": "CFN_LINT", + "ruleId": "I9002", + "severity": "INFO", + "message": "'BackupRetentionPeriod' is ignored in this configuration (from extension)", + "source": "ENGINE", "entity": { - "logicalId": "LambdaFunctionTestDefinedValue", + "logicalId": "AuroraLongBackupRetention", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Code", + "propertyPath": "Properties.BackupRetentionPeriod", "category": "Best Practice", - "startLine": 77, + "startLine": 98, "startColumn": 7, - "endLine": 77, - "endColumn": 11, - "ruleDescription": "Warn when properties are configured to only work with the package command", + "endLine": 98, + "endColumn": 28, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Property is ignored in this configuration (from extension)", + "phase": "SCHEMA" + }, + { + "ruleId": "I9003", + "severity": "INFO", + "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", + "source": "ENGINE", + "category": "Best Practice", + "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Path' is create-only; updating it will cause resource replacement", + "message": "Resource 'FunctionRole' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "LambdaExecutionRole", + "logicalId": "FunctionRole", "entityType": "Resource", "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.Path", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 20, - "startColumn": 7, - "endLine": 20, - "endColumn": 11, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 11, + "startColumn": 5, + "endLine": 11, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'LambdaExecutionRole' of type 'AWS::IAM::Role' supports Tags but none are configured", + "message": "Resource 'TimeoutAtTheLimit' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "LambdaExecutionRole", + "logicalId": "TimeoutAtTheLimit", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::Lambda::Function" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 9, + "startLine": 21, "startColumn": 5, - "endLine": 9, + "endLine": 21, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -22920,19 +26190,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'LambdaFunctionTestDefinedArray' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "message": "Resource 'ManagedInstancesLongTimeout' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "LambdaFunctionTestDefinedArray", + "logicalId": "ManagedInstancesLongTimeout", "entityType": "Resource", "resourceType": "AWS::Lambda::Function" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 23, + "startLine": 31, "startColumn": 5, - "endLine": 23, + "endLine": 31, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -22940,19 +26210,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'LambdaFunctionTestDefinedEmpty' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "message": "Resource 'RestApi' of type 'AWS::ApiGateway::RestApi' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "LambdaFunctionTestDefinedEmpty", + "logicalId": "RestApi", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::ApiGateway::RestApi" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 35, + "startLine": 50, "startColumn": 5, - "endLine": 35, + "endLine": 50, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -22960,19 +26230,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'LambdaFunctionTestDefinedGetAttr' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "message": "Resource 'StageWithAbsolutePaths' of type 'AWS::ApiGateway::Stage' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "LambdaFunctionTestDefinedGetAttr", + "logicalId": "StageWithAbsolutePaths", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::ApiGateway::Stage" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 45, + "startLine": 77, "startColumn": 5, - "endLine": 45, + "endLine": 77, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -22980,19 +26250,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'LambdaFunctionTestDefinedObject' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "message": "Resource 'AuroraLongBackupRetention' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "LambdaFunctionTestDefinedObject", + "logicalId": "AuroraLongBackupRetention", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::RDS::DBInstance" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 55, + "startLine": 94, "startColumn": 5, - "endLine": 55, + "endLine": 94, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -23000,130 +26270,229 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'LambdaFunctionTestDefinedRef' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "message": "Resource 'MysqlBackupRetentionAtTheLimit' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "LambdaFunctionTestDefinedRef", + "logicalId": "MysqlBackupRetentionAtTheLimit", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::RDS::DBInstance" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 66, + "startLine": 103, "startColumn": 5, - "endLine": 66, + "endLine": 103, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "good/conditions.yaml": { + "filePath": "good/conditions.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 2, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 1, + "informational": 2, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "W9010", + "severity": "WARN", + "message": "Hardcoded AMI ID - use a parameter or mapping for portability", + "source": "ENGINE", + "entity": { + "logicalId": "myInstance", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Properties.ImageId", + "category": "Security", + "startLine": 28, + "startColumn": 7, + "endLine": 28, + "endColumn": 14, + "ruleDescription": "Hardcoded AMI ID", + "phase": "LINT" + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "myInstance", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Properties.ImageId", + "category": "Best Practice", + "startLine": 28, + "startColumn": 7, + "endLine": 28, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Fn::If on condition 'isProd'" + } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'LambdaFunctionTestDefinedValue' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "message": "Resource 'CloudFrontDistribution' of type 'AWS::CloudFront::Distribution' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "LambdaFunctionTestDefinedValue", + "logicalId": "CloudFrontDistribution", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::CloudFront::Distribution" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 76, + "startLine": 41, "startColumn": 5, - "endLine": 76, + "endLine": 41, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "good/custom/is-not-defined.yaml": { - "filePath": "good/custom/is-not-defined.yaml", + "good/conditions/and.yaml": { + "filePath": "good/conditions/and.yaml", "status": "OK", "metadata": { - "resourcesScanned": 5, + "resourcesScanned": 1, "counts": { "fatal": 0, "errors": 0, - "warnings": 8, - "informational": 6, + "warnings": 0, + "informational": 0, "debug": 0 }, "suppressed": 0, "strict": false, "severityLevel": "DEBUG" }, + "diagnostics": [] + }, + "good/core/conditions.yaml": { + "filePath": "good/core/conditions.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 8, + "counts": { + "fatal": 2, + "errors": 0, + "warnings": 9, + "informational": 18, + "debug": 0 + }, + "suppressed": 2, + "strict": false, + "severityLevel": "DEBUG" + }, "diagnostics": [ { - "ruleId": "W2531", - "severity": "WARN", - "message": "Runtime 'nodejs18.x' was deprecated on '2025-09-01'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'nodejs24.x'", - "source": "CFN_LINT", + "ruleId": "F3003", + "severity": "FATAL", + "message": "'Role' is a required property", + "source": "SCHEMA", "entity": { - "logicalId": "LambdaFunctionTestNotDefinedFromParent", + "logicalId": "AMIIDLookup", "entityType": "Resource", "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 26, + "propertyPath": "Properties", + "suggestedFix": "Add the required property 'Role'", + "category": "Schema", + "startLine": 101, + "startColumn": 5, + "endLine": 101, + "endColumn": 15, + "conditionScenario": { + "isPrimary": false + }, + "ruleDescription": "Required property missing", + "phase": "SCHEMA" + }, + { + "ruleId": "F3014", + "severity": "FATAL", + "message": "Exactly one of ['VirtualName', 'Ebs', 'NoDevice'] must be specified", + "source": "SCHEMA", + "entity": { + "logicalId": "myInstance2", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Properties.BlockDeviceMappings.{}", + "category": "Schema", + "startLine": 36, "startColumn": 7, - "endLine": 26, - "endColumn": 14, - "ruleDescription": "Check if EOL Lambda Function Runtimes are used", + "endLine": 36, + "endColumn": 26, + "conditionScenario": { + "isPrimary": true, + "isPrimaryAndProduction": true + }, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Exactly one of properties required (requiredXor)", "phase": "SCHEMA", "context": { - "actualValue": "nodejs18.x", - "lifecycle": "deprecated" + "resolutionSource": "Fn::If on condition 'isPrimaryAndProduction'" } }, { - "ruleId": "W2531", + "ruleId": "W1028", "severity": "WARN", - "message": "Runtime 'nodejs18.x' was deprecated on '2025-09-01'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'nodejs24.x'", + "message": "['Fn::If', 2] is not reachable. When setting condition 'isPrimary' to False. Where existing status for condition 'isPrimaryAndProduction' is True", "source": "CFN_LINT", "entity": { - "logicalId": "LambdaFunctionTestNotDefinedFromProperties", + "logicalId": "myInstance2", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 33, - "startColumn": 7, - "endLine": 33, - "endColumn": 14, - "ruleDescription": "Check if EOL Lambda Function Runtimes are used", - "phase": "SCHEMA", - "context": { - "actualValue": "nodejs18.x", - "lifecycle": "deprecated" - } + "propertyPath": "Properties.BlockDeviceMappings.Fn::If.1.0.VirtualName.Fn::If.2", + "category": "Best Practice", + "startLine": 44, + "startColumn": 19, + "endLine": 44, + "endColumn": 20, + "ruleDescription": "Check Fn::If has a path that cannot be reached", + "phase": "LINT" }, { - "ruleId": "W2531", + "ruleId": "W1028", "severity": "WARN", - "message": "Runtime 'nodejs18.x' was deprecated on '2025-09-01'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'nodejs24.x'", + "message": "['Fn::If', 2] is not reachable. When setting condition 'isPrimary' to False. Where existing status for condition 'isPrimaryAndProduction' is True", "source": "CFN_LINT", "entity": { - "logicalId": "LambdaFunctionTestNotDefinedRefAWSNoValue", + "logicalId": "myInstance4", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 43, - "startColumn": 7, - "endLine": 43, + "propertyPath": "Properties.InstanceType.Fn::If.1.Fn::If.2", + "category": "Best Practice", + "startLine": 74, + "startColumn": 13, + "endLine": 74, "endColumn": 14, - "ruleDescription": "Check if EOL Lambda Function Runtimes are used", - "phase": "SCHEMA", - "context": { - "actualValue": "nodejs18.x", - "lifecycle": "deprecated" - } + "ruleDescription": "Check Fn::If has a path that cannot be reached", + "phase": "LINT" }, { "ruleId": "W2531", @@ -23131,15 +26500,15 @@ "message": "Runtime 'nodejs18.x' was deprecated on '2025-09-01'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'nodejs24.x'", "source": "CFN_LINT", "entity": { - "logicalId": "LambdaFunctionTestNotDefinedWithSiblings", + "logicalId": "AMIIDLookup", "entityType": "Resource", "resourceType": "AWS::Lambda::Function" }, "propertyPath": "Properties.Runtime", "category": "Deprecation", - "startLine": 53, + "startLine": 111, "startColumn": 7, - "endLine": 53, + "endLine": 111, "endColumn": 14, "ruleDescription": "Check if EOL Lambda Function Runtimes are used", "phase": "SCHEMA", @@ -23149,98 +26518,133 @@ } }, { - "ruleId": "W3002", + "ruleId": "W8001", "severity": "WARN", - "message": "This code may only work with 'package' cli command", + "message": "Condition 'isNotProduction' is not used by any resource or Fn::If", "source": "CFN_LINT", "entity": { - "logicalId": "LambdaFunctionTestNotDefinedFromParent", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "logicalId": "isNotProduction", + "entityType": "Condition" }, - "propertyPath": "Properties.Code", + "propertyPath": "Conditions/isNotProduction", "category": "Best Practice", - "startLine": 21, - "startColumn": 7, - "endLine": 21, - "endColumn": 11, - "ruleDescription": "Warn when properties are configured to only work with the package command", + "startLine": 17, + "startColumn": 3, + "endLine": 17, + "endColumn": 18, + "ruleDescription": "Check if Conditions are Used", "phase": "LINT" }, { - "ruleId": "W3002", + "ruleId": "W8001", "severity": "WARN", - "message": "This code may only work with 'package' cli command", + "message": "Condition 'isPrimaryAndProdOrStage' is not used by any resource or Fn::If", "source": "CFN_LINT", "entity": { - "logicalId": "LambdaFunctionTestNotDefinedFromProperties", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "logicalId": "isPrimaryAndProdOrStage", + "entityType": "Condition" }, - "propertyPath": "Properties.Code", + "propertyPath": "Conditions/isPrimaryAndProdOrStage", "category": "Best Practice", - "startLine": 30, + "startLine": 19, + "startColumn": 3, + "endLine": 19, + "endColumn": 26, + "ruleDescription": "Check if Conditions are Used", + "phase": "LINT" + }, + { + "ruleId": "W9010", + "severity": "WARN", + "message": "Hardcoded AMI ID - use a parameter or mapping for portability", + "source": "ENGINE", + "entity": { + "logicalId": "myInstance1", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Properties.ImageId", + "category": "Security", + "startLine": 31, "startColumn": 7, - "endLine": 30, - "endColumn": 11, - "ruleDescription": "Warn when properties are configured to only work with the package command", + "endLine": 31, + "endColumn": 14, + "ruleDescription": "Hardcoded AMI ID", "phase": "LINT" }, { - "ruleId": "W3002", + "ruleId": "W9010", "severity": "WARN", - "message": "This code may only work with 'package' cli command", - "source": "CFN_LINT", + "message": "Hardcoded AMI ID - use a parameter or mapping for portability", + "source": "ENGINE", "entity": { - "logicalId": "LambdaFunctionTestNotDefinedRefAWSNoValue", + "logicalId": "myInstance2", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Code", - "category": "Best Practice", - "startLine": 37, + "propertyPath": "Properties.ImageId", + "category": "Security", + "startLine": 35, "startColumn": 7, - "endLine": 37, - "endColumn": 11, - "ruleDescription": "Warn when properties are configured to only work with the package command", + "endLine": 35, + "endColumn": 14, + "ruleDescription": "Hardcoded AMI ID", "phase": "LINT" }, { - "ruleId": "W3002", + "ruleId": "W9010", "severity": "WARN", - "message": "This code may only work with 'package' cli command", - "source": "CFN_LINT", + "message": "Hardcoded AMI ID - use a parameter or mapping for portability", + "source": "ENGINE", + "entity": { + "logicalId": "myInstance3", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Properties.ImageId", + "category": "Security", + "startLine": 53, + "startColumn": 5, + "endLine": 53, + "endColumn": 15, + "ruleDescription": "Hardcoded AMI ID", + "phase": "LINT" + }, + { + "ruleId": "W9010", + "severity": "WARN", + "message": "Hardcoded AMI ID - use a parameter or mapping for portability", + "source": "ENGINE", "entity": { - "logicalId": "LambdaFunctionTestNotDefinedWithSiblings", + "logicalId": "myInstance4", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Code", - "category": "Best Practice", - "startLine": 47, + "propertyPath": "Properties.ImageId", + "category": "Security", + "startLine": 67, "startColumn": 7, - "endLine": 47, - "endColumn": 11, - "ruleDescription": "Warn when properties are configured to only work with the package command", + "endLine": 67, + "endColumn": 14, + "ruleDescription": "Hardcoded AMI ID", "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Path' is create-only; updating it will cause resource replacement", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "LambdaExecutionRole", + "logicalId": "mySubnet", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.Path", + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 17, + "startLine": 25, "startColumn": 7, - "endLine": 17, - "endColumn": 11, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "endLine": 25, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -23248,226 +26652,191 @@ } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'LambdaExecutionRole' of type 'AWS::IAM::Role' supports Tags but none are configured", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "LambdaExecutionRole", + "logicalId": "mySubnet", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 6, - "startColumn": 5, - "endLine": 6, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 26, + "startColumn": 7, + "endLine": 26, + "endColumn": 12, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'LambdaFunctionTestNotDefinedFromParent' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "LambdaFunctionTestNotDefinedFromParent", + "logicalId": "myInstance1", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.SubnetId", "category": "Best Practice", - "startLine": 20, - "startColumn": 5, - "endLine": 20, + "startLine": 30, + "startColumn": 7, + "endLine": 30, "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Fn::If on condition 'isDevelopment'" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'LambdaFunctionTestNotDefinedFromProperties' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "LambdaFunctionTestNotDefinedFromProperties", + "logicalId": "myInstance1", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 29, - "startColumn": 5, - "endLine": 29, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 31, + "startColumn": 7, + "endLine": 31, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'LambdaFunctionTestNotDefinedRefAWSNoValue' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "LambdaFunctionTestNotDefinedRefAWSNoValue", + "logicalId": "myInstance2", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 36, - "startColumn": 5, - "endLine": 36, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 35, + "startColumn": 7, + "endLine": 35, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'LambdaFunctionTestNotDefinedWithSiblings' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "message": "Property 'BlockDeviceMappings' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "LambdaFunctionTestNotDefinedWithSiblings", + "logicalId": "myInstance2", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.BlockDeviceMappings", "category": "Best Practice", - "startLine": 46, - "startColumn": 5, - "endLine": 46, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "good/custom/numeric-inequalities-large.yaml": { - "filePath": "good/custom/numeric-inequalities-large.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 3, - "counts": { - "fatal": 0, - "errors": 2, - "warnings": 3, - "informational": 4, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "E2533", - "severity": "ERROR", - "message": "Runtime 'nodejs4.3' was deprecated on '2020-03-05'. Creation was disabled on '2020-02-03', and updates were disabled on '2020-03-05'. Please consider updating to 'nodejs24.x'", - "source": "CFN_LINT", - "entity": { - "logicalId": "TimeoutInNumericsFunction", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 27, + "startLine": 36, "startColumn": 7, - "endLine": 27, - "endColumn": 14, - "ruleDescription": "Check if Lambda Function Runtimes are updatable", + "endLine": 36, + "endColumn": 26, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "actualValue": "nodejs4.3", - "lifecycle": "end-of-life" + "lifecycle": "conditional-create-only", + "resolutionSource": "Fn::If on condition 'isPrimaryAndProduction'" } }, { - "ruleId": "E2533", - "severity": "ERROR", - "message": "Runtime 'nodejs4.3' was deprecated on '2020-03-05'. Creation was disabled on '2020-02-03', and updates were disabled on '2020-03-05'. Please consider updating to 'nodejs24.x'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "TimeoutInStringFunction", + "logicalId": "myInstance4", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 35, + "propertyPath": "Properties.ImageId", + "category": "Best Practice", + "startLine": 67, "startColumn": 7, - "endLine": 35, + "endLine": 67, "endColumn": 14, - "ruleDescription": "Check if Lambda Function Runtimes are updatable", + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "actualValue": "nodejs4.3", - "lifecycle": "end-of-life" + "lifecycle": "create-only", + "resolutionSource": "Fn::If on condition 'isProduction'" } }, { - "ruleId": "W3002", - "severity": "WARN", - "message": "This code may only work with 'package' cli command", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "TimeoutInNumericsFunction", + "logicalId": "myInstance4", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Code", + "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 26, + "startLine": 68, "startColumn": 7, - "endLine": 26, - "endColumn": 11, - "ruleDescription": "Warn when properties are configured to only work with the package command", - "phase": "LINT" + "endLine": 68, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only", + "resolutionSource": "Fn::If on condition 'isPrimaryAndProduction'" + } }, { - "ruleId": "W3002", - "severity": "WARN", - "message": "This code may only work with 'package' cli command", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Path' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "TimeoutInStringFunction", + "logicalId": "LambdaExecutionRole", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.Code", + "propertyPath": "Properties.Path", "category": "Best Practice", - "startLine": 34, + "startLine": 91, "startColumn": 7, - "endLine": 34, + "endLine": 91, "endColumn": 11, - "ruleDescription": "Warn when properties are configured to only work with the package command", - "phase": "LINT" - }, - { - "ruleId": "W9003", - "severity": "WARN", - "message": "'100' is not of type 'integer' - automatically coerced (string to integer)", - "source": "CFN_LINT", - "entity": { - "logicalId": "TimeoutInStringFunction", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "Properties.Timeout", - "category": "Best Practice", - "startLine": 36, - "startColumn": 7, - "endLine": 36, - "endColumn": 14, - "ruleDescription": "Property type coercion warning", - "phase": "SCHEMA" + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { "ruleId": "I9001", @@ -23475,39 +26844,47 @@ "message": "Property 'Path' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "LambdaExecutionRole", + "logicalId": "InstanceProfile", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::IAM::InstanceProfile" }, "propertyPath": "Properties.Path", "category": "Best Practice", - "startLine": 20, + "startLine": 96, "startColumn": 7, - "endLine": 20, + "endLine": 96, "endColumn": 11, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only" } }, + { + "ruleId": "I9003", + "severity": "INFO", + "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", + "source": "ENGINE", + "category": "Best Practice", + "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", + "phase": "LINT" + }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'LambdaExecutionRole' of type 'AWS::IAM::Role' supports Tags but none are configured", + "message": "Resource 'mySubnet' of type 'AWS::EC2::Subnet' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "LambdaExecutionRole", + "logicalId": "mySubnet", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::EC2::Subnet" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 8, + "startLine": 24, "startColumn": 5, - "endLine": 8, + "endLine": 24, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -23515,19 +26892,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'TimeoutInNumericsFunction' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "message": "Resource 'myInstance1' of type 'AWS::EC2::Instance' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "TimeoutInNumericsFunction", + "logicalId": "myInstance1", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 23, + "startLine": 29, "startColumn": 5, - "endLine": 23, + "endLine": 29, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -23535,162 +26912,221 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'TimeoutInStringFunction' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "message": "Resource 'myInstance2' of type 'AWS::EC2::Instance' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "TimeoutInStringFunction", + "logicalId": "myInstance2", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 31, + "startLine": 34, "startColumn": 5, - "endLine": 31, + "endLine": 34, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" - } - ] - }, - "good/custom/numeric-inequalities-small.yaml": { - "filePath": "good/custom/numeric-inequalities-small.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 3, - "counts": { - "fatal": 0, - "errors": 2, - "warnings": 3, - "informational": 4, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "E2533", - "severity": "ERROR", - "message": "Runtime 'nodejs4.3' was deprecated on '2020-03-05'. Creation was disabled on '2020-02-03', and updates were disabled on '2020-03-05'. Please consider updating to 'nodejs24.x'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'myInstance3' of type 'AWS::EC2::Instance' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "TimeoutInNumericsFunction", + "logicalId": "myInstance3", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 27, - "startColumn": 7, - "endLine": 27, - "endColumn": 14, - "ruleDescription": "Check if Lambda Function Runtimes are updatable", - "phase": "SCHEMA", - "context": { - "actualValue": "nodejs4.3", - "lifecycle": "end-of-life" - } + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 53, + "startColumn": 5, + "endLine": 53, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "E2533", - "severity": "ERROR", - "message": "Runtime 'nodejs4.3' was deprecated on '2020-03-05'. Creation was disabled on '2020-02-03', and updates were disabled on '2020-03-05'. Please consider updating to 'nodejs24.x'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'myInstance4' of type 'AWS::EC2::Instance' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "TimeoutInStringFunction", + "logicalId": "myInstance4", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 35, - "startColumn": 7, - "endLine": 35, - "endColumn": 14, - "ruleDescription": "Check if Lambda Function Runtimes are updatable", - "phase": "SCHEMA", - "context": { - "actualValue": "nodejs4.3", - "lifecycle": "end-of-life" - } + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 66, + "startColumn": 5, + "endLine": 66, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "W3002", - "severity": "WARN", - "message": "This code may only work with 'package' cli command", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'LambdaExecutionRole' of type 'AWS::IAM::Role' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "TimeoutInNumericsFunction", + "logicalId": "LambdaExecutionRole", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.Code", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 26, - "startColumn": 7, - "endLine": 26, - "endColumn": 11, - "ruleDescription": "Warn when properties are configured to only work with the package command", + "startLine": 79, + "startColumn": 5, + "endLine": 79, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "W3002", - "severity": "WARN", - "message": "This code may only work with 'package' cli command", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'AMIIDLookup' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "TimeoutInStringFunction", + "logicalId": "AMIIDLookup", "entityType": "Resource", "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.Code", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 34, - "startColumn": 7, - "endLine": 34, - "endColumn": 11, - "ruleDescription": "Warn when properties are configured to only work with the package command", + "startLine": 101, + "startColumn": 5, + "endLine": 101, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "good/core/config_cfn_lint.json": { + "filePath": "good/core/config_cfn_lint.json", + "status": "OK", + "metadata": { + "resourcesScanned": 0, + "counts": { + "fatal": 1, + "errors": 0, + "warnings": 0, + "informational": 0, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "F0001", + "severity": "FATAL", + "message": "Resources section must exist and be non-empty", + "source": "SCHEMA", + "category": "Structure", + "startLine": 16, + "startColumn": 2, + "endLine": 16, + "endColumn": 12, + "ruleDescription": "Resources section must exist and be non-empty", + "phase": "SCHEMA" + } + ] + }, + "good/core/config_cfn_lint.yaml": { + "filePath": "good/core/config_cfn_lint.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 0, + "counts": { + "fatal": 1, + "errors": 0, + "warnings": 0, + "informational": 0, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "F0001", + "severity": "FATAL", + "message": "Resources section must exist and be non-empty", + "source": "SCHEMA", + "category": "Structure", + "startLine": 11, + "startColumn": 1, + "endLine": 11, + "endColumn": 10, + "ruleDescription": "Resources section must exist and be non-empty", + "phase": "SCHEMA" + } + ] + }, + "good/core/config_default_e3012.yaml": { + "filePath": "good/core/config_default_e3012.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 1, + "informational": 3, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { "ruleId": "W9003", "severity": "WARN", - "message": "'9' is not of type 'integer' - automatically coerced (string to integer)", + "message": "'5' is not of type 'integer' - automatically coerced (string to integer)", "source": "CFN_LINT", "entity": { - "logicalId": "TimeoutInStringFunction", + "logicalId": "myTable", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "Properties.Timeout", - "category": "Best Practice", - "startLine": 36, - "startColumn": 7, - "endLine": 36, - "endColumn": 14, + "resourceType": "AWS::DynamoDB::Table" + }, + "propertyPath": "Properties.ProvisionedThroughput.WriteCapacityUnits", + "category": "Best Practice", + "startLine": 20, + "startColumn": 9, + "endLine": 20, + "endColumn": 27, "ruleDescription": "Property type coercion warning", "phase": "SCHEMA" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Path' is create-only; updating it will cause resource replacement", + "message": "Property 'TableName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "LambdaExecutionRole", + "logicalId": "myTable", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.Path", + "propertyPath": "Properties.TableName", "category": "Best Practice", - "startLine": 20, + "startLine": 11, "startColumn": 7, - "endLine": 20, - "endColumn": 11, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "endLine": 11, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -23698,76 +27134,58 @@ } }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'LambdaExecutionRole' of type 'AWS::IAM::Role' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "LambdaExecutionRole", - "entityType": "Resource", - "resourceType": "AWS::IAM::Role" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 8, - "startColumn": 5, - "endLine": 8, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'TimeoutInNumericsFunction' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "TimeoutInNumericsFunction", + "logicalId": "myTable", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.KeySchema", "category": "Best Practice", - "startLine": 23, - "startColumn": 5, - "endLine": 23, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 15, + "startColumn": 7, + "endLine": 15, + "endColumn": 16, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'TimeoutInStringFunction' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "message": "Resource 'myTable' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "TimeoutInStringFunction", + "logicalId": "myTable", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::DynamoDB::Table" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 31, + "startLine": 10, "startColumn": 5, - "endLine": 31, + "endLine": 10, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "good/decode/parsing.json": { - "filePath": "good/decode/parsing.json", + "good/core/config_only_i1002.yaml": { + "filePath": "good/core/config_only_i1002.yaml", "status": "OK", "metadata": { "resourcesScanned": 0, "counts": { "fatal": 1, "errors": 0, - "warnings": 1, + "warnings": 0, "informational": 0, "debug": 0 }, @@ -23783,39 +27201,53 @@ "source": "SCHEMA", "category": "Structure", "startLine": 8, - "startColumn": 3, + "startColumn": 1, "endLine": 8, - "endColumn": 13, + "endColumn": 10, "ruleDescription": "Resources section must exist and be non-empty", "phase": "SCHEMA" + } + ] + }, + "good/core/config_only_i1003.yaml": { + "filePath": "good/core/config_only_i1003.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 0, + "counts": { + "fatal": 1, + "errors": 0, + "warnings": 0, + "informational": 0, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'VPN' is not referenced anywhere in the template", - "source": "CFN_LINT", - "entity": { - "logicalId": "VPN", - "entityType": "Parameter" - }, - "propertyPath": "Parameters/VPN", - "category": "Best Practice", - "startLine": 3, - "startColumn": 5, - "endLine": 3, - "endColumn": 9, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "ruleId": "F0001", + "severity": "FATAL", + "message": "Resources section must exist and be non-empty", + "source": "SCHEMA", + "category": "Structure", + "startLine": 8, + "startColumn": 1, + "endLine": 8, + "endColumn": 10, + "ruleDescription": "Resources section must exist and be non-empty", + "phase": "SCHEMA" } ] }, - "good/decode/yaml11_scalars.yaml": { - "filePath": "good/decode/yaml11_scalars.yaml", + "good/core/config_parameters.yaml": { + "filePath": "good/core/config_parameters.yaml", "status": "OK", "metadata": { - "resourcesScanned": 1, + "resourcesScanned": 0, "counts": { - "fatal": 0, + "fatal": 1, "errors": 0, "warnings": 0, "informational": 0, @@ -23825,18 +27257,32 @@ "strict": false, "severityLevel": "DEBUG" }, - "diagnostics": [] + "diagnostics": [ + { + "ruleId": "F0001", + "severity": "FATAL", + "message": "Resources section must exist and be non-empty", + "source": "SCHEMA", + "category": "Structure", + "startLine": 8, + "startColumn": 1, + "endLine": 8, + "endColumn": 10, + "ruleDescription": "Resources section must exist and be non-empty", + "phase": "SCHEMA" + } + ] }, - "good/deletion_policies.yaml": { - "filePath": "good/deletion_policies.yaml", + "good/core/directives.yaml": { + "filePath": "good/core/directives.yaml", "status": "OK", "metadata": { - "resourcesScanned": 2, + "resourcesScanned": 1, "counts": { "fatal": 0, "errors": 0, - "warnings": 4, - "informational": 7, + "warnings": 0, + "informational": 3, "debug": 0 }, "suppressed": 0, @@ -23845,228 +27291,322 @@ }, "diagnostics": [ { - "ruleId": "W2501", - "severity": "WARN", - "message": "Property 'MasterUserPassword' should not be a hardcoded string - use a parameter with NoEcho or a dynamic reference", + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "DB", + "logicalId": "MyKey", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::KMS::Key" }, - "propertyPath": "Properties.MasterUserPassword", - "category": "Security", - "startLine": 12, - "startColumn": 7, - "endLine": 12, - "endColumn": 25, - "ruleDescription": "Check if Password Properties are correctly configured", + "category": "Best Practice", + "startLine": 4, + "startColumn": 3, + "endLine": 4, + "endColumn": 8, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "W3011", - "severity": "WARN", - "message": "Both 'UpdateReplacePolicy' and 'DeletionPolicy' are needed to protect resource from deletion", + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "Bucket", + "logicalId": "MyKey", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::KMS::Key" }, "category": "Best Practice", - "startLine": 3, + "startLine": 4, "startColumn": 3, - "endLine": 3, - "endColumn": 9, - "ruleDescription": "Check resources with UpdateReplacePolicy/DeletionPolicy have both", + "endLine": 4, + "endColumn": 8, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "W3011", - "severity": "WARN", - "message": "Both 'UpdateReplacePolicy' and 'DeletionPolicy' are needed to protect resource from deletion", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'MyKey' of type 'AWS::KMS::Key' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "DB", + "logicalId": "MyKey", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::KMS::Key" }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 6, + "startLine": 4, "startColumn": 3, - "endLine": 6, - "endColumn": 5, - "ruleDescription": "Check resources with UpdateReplacePolicy/DeletionPolicy have both", + "endLine": 4, + "endColumn": 8, + "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "good/core/resource_attributes.yaml": { + "filePath": "good/core/resource_attributes.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 8, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 11, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "W9008", - "severity": "WARN", - "message": "RDS instance should have StorageEncrypted set to true", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DB", + "logicalId": "CommonCfnAttributes", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.StorageEncrypted", - "suggestedFix": "Set StorageEncrypted to true", - "category": "Security", - "startLine": 9, - "startColumn": 5, - "endLine": 9, - "endColumn": 15, - "ruleDescription": "RDS instance should have StorageEncrypted", - "phase": "LINT" + "propertyPath": "Properties.BucketName", + "category": "Best Practice", + "startLine": 26, + "startColumn": 7, + "endLine": 26, + "endColumn": 17, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "DB", + "logicalId": "DependsOnSingleString", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::S3::Bucket" }, + "propertyPath": "Properties.BucketName", "category": "Best Practice", - "startLine": 6, - "startColumn": 3, - "endLine": 6, - "endColumn": 5, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 33, + "startColumn": 7, + "endLine": 33, + "endColumn": 17, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DB", + "logicalId": "DependsOnList", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.BucketName", "category": "Best Practice", - "startLine": 10, + "startLine": 42, "startColumn": 7, - "endLine": 10, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "endLine": 42, + "endColumn": 17, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'MasterUsername' is create-only; updating it will cause resource replacement", + "message": "Property 'LaunchTemplate' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DB", + "logicalId": "AutoScalingGroupWithPolicies", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::AutoScaling::AutoScalingGroup" }, - "propertyPath": "Properties.MasterUsername", + "propertyPath": "Properties.LaunchTemplate", "category": "Best Practice", - "startLine": 11, + "startLine": 63, "startColumn": 7, - "endLine": 11, + "endLine": 63, "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'BackupRetentionPeriod' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DB", + "logicalId": "BucketWithTransform", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.BackupRetentionPeriod", + "propertyPath": "Properties.BucketName", "category": "Best Practice", - "startLine": 14, + "startLine": 82, "startColumn": 7, - "endLine": 14, - "endColumn": 28, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "endLine": 82, + "endColumn": 17, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only" } }, { - "ruleId": "I9003", + "ruleId": "I9040", "severity": "INFO", - "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", + "message": "Resource 'CommonCfnAttributes' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", + "entity": { + "logicalId": "CommonCfnAttributes", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", + "startLine": 25, + "startColumn": 5, + "endLine": 25, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Resource 'DependsOnSingleString' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Bucket", + "logicalId": "DependsOnSingleString", "entityType": "Resource", "resourceType": "AWS::S3::Bucket" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 9, + "startLine": 32, + "startColumn": 5, + "endLine": 32, + "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'DB' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "message": "Resource 'DependsOnList' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "DB", + "logicalId": "DependsOnList", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::S3::Bucket" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 9, + "startLine": 41, "startColumn": 5, - "endLine": 9, + "endLine": 41, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'AutoScalingGroupWithPolicies' of type 'AWS::AutoScaling::AutoScalingGroup' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "AutoScalingGroupWithPolicies", + "entityType": "Resource", + "resourceType": "AWS::AutoScaling::AutoScalingGroup" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 60, + "startColumn": 5, + "endLine": 60, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'BucketWithTransform' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "BucketWithTransform", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 81, + "startColumn": 5, + "endLine": 81, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'BucketWithConnectors' of type 'AWS::Serverless::Function' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "BucketWithConnectors", + "entityType": "Resource", + "resourceType": "AWS::Serverless::Function" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 94, + "startColumn": 5, + "endLine": 94, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "good/dynamodb_provisioned.yaml": { - "filePath": "good/dynamodb_provisioned.yaml", + "good/custom/is-defined.yaml": { + "filePath": "good/custom/is-defined.yaml", "status": "OK", "metadata": { - "resourcesScanned": 1, + "resourcesScanned": 7, "counts": { - "fatal": 0, + "fatal": 2, "errors": 0, - "warnings": 0, - "informational": 5, + "warnings": 12, + "informational": 8, "debug": 0 }, "suppressed": 0, @@ -24075,368 +27615,308 @@ }, "diagnostics": [ { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "DDBTable", - "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" - }, - "category": "Best Practice", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 11, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "ruleId": "F0005", + "severity": "FATAL", + "message": "'Parameter' is not a valid top-level template section", + "source": "SCHEMA", + "propertyPath": "Parameter", + "category": "Structure", + "startLine": 4, + "startColumn": 1, + "endLine": 4, + "endColumn": 10, + "ruleDescription": "Top-level keys must be valid section names", + "phase": "SCHEMA" }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "ruleId": "F1020", + "severity": "FATAL", + "message": "'NodeEnv' is not one of ['AWS::AccountId', 'AWS::NoValue', 'AWS::NotificationARNs', 'AWS::Partition', 'AWS::Region', 'AWS::StackId', 'AWS::StackName', 'AWS::URLSuffix', 'LambdaExecutionRole', 'LambdaFunctionTestDefinedArray', 'LambdaFunctionTestDefinedEmpty', 'LambdaFunctionTestDefinedGetAttr', 'LambdaFunctionTestDefinedObject', 'LambdaFunctionTestDefinedRef', 'LambdaFunctionTestDefinedValue']", + "source": "SCHEMA", "entity": { - "logicalId": "DDBTable", + "logicalId": "LambdaFunctionTestDefinedRef", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::Lambda::Function" }, - "category": "Best Practice", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 11, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "propertyPath": "Properties.Environment.Variables.NODE_ENV", + "suggestedFix": "Check that the Ref target exists as a resource, parameter, or pseudo-parameter", + "category": "Intrinsic Function", + "startLine": 70, + "startColumn": 11, + "endLine": 70, + "endColumn": 19, + "ruleDescription": "Ref/GetAtt target must exist", + "phase": "SCHEMA" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'TableName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W2531", + "severity": "WARN", + "message": "Runtime 'nodejs18.x' was deprecated on '2025-09-01'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'nodejs24.x'", + "source": "CFN_LINT", "entity": { - "logicalId": "DDBTable", + "logicalId": "LambdaFunctionTestDefinedArray", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.TableName", - "category": "Best Practice", - "startLine": 6, + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 32, "startColumn": 7, - "endLine": 6, - "endColumn": 16, - "ruleDescription": "Create-only property updated triggers resource replacement", + "endLine": 32, + "endColumn": 14, + "ruleDescription": "Check if EOL Lambda Function Runtimes are used", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "actualValue": "nodejs18.x", + "lifecycle": "deprecated" } }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W2531", + "severity": "WARN", + "message": "Runtime 'nodejs18.x' was deprecated on '2025-09-01'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'nodejs24.x'", + "source": "CFN_LINT", "entity": { - "logicalId": "DDBTable", + "logicalId": "LambdaFunctionTestDefinedEmpty", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.KeySchema", - "category": "Best Practice", - "startLine": 14, + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 42, "startColumn": 7, - "endLine": 14, - "endColumn": 16, - "ruleDescription": "Create-only property updated triggers resource replacement", + "endLine": 42, + "endColumn": 14, + "ruleDescription": "Check if EOL Lambda Function Runtimes are used", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "actualValue": "nodejs18.x", + "lifecycle": "deprecated" } }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'DDBTable' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W2531", + "severity": "WARN", + "message": "Runtime 'nodejs18.x' was deprecated on '2025-09-01'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'nodejs24.x'", + "source": "CFN_LINT", "entity": { - "logicalId": "DDBTable", + "logicalId": "LambdaFunctionTestDefinedGetAttr", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "good/dynamodb_valid_attributes.yaml": { - "filePath": "good/dynamodb_valid_attributes.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 5, - "debug": 0 + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 52, + "startColumn": 7, + "endLine": 52, + "endColumn": 14, + "ruleDescription": "Check if EOL Lambda Function Runtimes are used", + "phase": "SCHEMA", + "context": { + "actualValue": "nodejs18.x", + "lifecycle": "deprecated" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "ruleId": "W2531", + "severity": "WARN", + "message": "Runtime 'nodejs18.x' was deprecated on '2025-09-01'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'nodejs24.x'", "source": "CFN_LINT", "entity": { - "logicalId": "GoodTable", + "logicalId": "LambdaFunctionTestDefinedObject", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::Lambda::Function" }, - "category": "Best Practice", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 12, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 63, + "startColumn": 7, + "endLine": 63, + "endColumn": 14, + "ruleDescription": "Check if EOL Lambda Function Runtimes are used", + "phase": "SCHEMA", + "context": { + "actualValue": "nodejs18.x", + "lifecycle": "deprecated" + } }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "ruleId": "W2531", + "severity": "WARN", + "message": "Runtime 'nodejs18.x' was deprecated on '2025-09-01'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'nodejs24.x'", "source": "CFN_LINT", "entity": { - "logicalId": "GoodTable", + "logicalId": "LambdaFunctionTestDefinedRef", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::Lambda::Function" }, - "category": "Best Practice", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 12, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 73, + "startColumn": 7, + "endLine": 73, + "endColumn": 14, + "ruleDescription": "Check if EOL Lambda Function Runtimes are used", + "phase": "SCHEMA", + "context": { + "actualValue": "nodejs18.x", + "lifecycle": "deprecated" + } }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'TableName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W2531", + "severity": "WARN", + "message": "Runtime 'nodejs18.x' was deprecated on '2025-09-01'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'nodejs24.x'", + "source": "CFN_LINT", "entity": { - "logicalId": "GoodTable", + "logicalId": "LambdaFunctionTestDefinedValue", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.TableName", - "category": "Best Practice", - "startLine": 6, + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 83, "startColumn": 7, - "endLine": 6, - "endColumn": 16, - "ruleDescription": "Create-only property updated triggers resource replacement", + "endLine": 83, + "endColumn": 14, + "ruleDescription": "Check if EOL Lambda Function Runtimes are used", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "actualValue": "nodejs18.x", + "lifecycle": "deprecated" } }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W3002", + "severity": "WARN", + "message": "This code may only work with 'package' cli command", + "source": "CFN_LINT", "entity": { - "logicalId": "GoodTable", + "logicalId": "LambdaFunctionTestDefinedArray", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.KeySchema", + "propertyPath": "Properties.Code", "category": "Best Practice", - "startLine": 13, + "startLine": 24, "startColumn": 7, - "endLine": 13, - "endColumn": 16, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "endLine": 24, + "endColumn": 11, + "ruleDescription": "Warn when properties are configured to only work with the package command", + "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'GoodTable' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W3002", + "severity": "WARN", + "message": "This code may only work with 'package' cli command", + "source": "CFN_LINT", "entity": { - "logicalId": "GoodTable", + "logicalId": "LambdaFunctionTestDefinedEmpty", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.Code", "category": "Best Practice", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "startLine": 36, + "startColumn": 7, + "endLine": 36, + "endColumn": 11, + "ruleDescription": "Warn when properties are configured to only work with the package command", "phase": "LINT" - } - ] - }, - "good/ecs_awsvpc_valid.yaml": { - "filePath": "good/ecs_awsvpc_valid.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 3, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W3002", + "severity": "WARN", + "message": "This code may only work with 'package' cli command", + "source": "CFN_LINT", "entity": { - "logicalId": "Task", + "logicalId": "LambdaFunctionTestDefinedGetAttr", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.NetworkMode", + "propertyPath": "Properties.Code", "category": "Best Practice", - "startLine": 6, + "startLine": 46, "startColumn": 7, - "endLine": 6, - "endColumn": 18, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "endLine": 46, + "endColumn": 11, + "ruleDescription": "Warn when properties are configured to only work with the package command", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W3002", + "severity": "WARN", + "message": "This code may only work with 'package' cli command", + "source": "CFN_LINT", "entity": { - "logicalId": "Task", + "logicalId": "LambdaFunctionTestDefinedObject", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.ContainerDefinitions", + "propertyPath": "Properties.Code", "category": "Best Practice", - "startLine": 7, + "startLine": 56, "startColumn": 7, - "endLine": 7, - "endColumn": 27, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "endLine": 56, + "endColumn": 11, + "ruleDescription": "Warn when properties are configured to only work with the package command", + "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Task' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W3002", + "severity": "WARN", + "message": "This code may only work with 'package' cli command", + "source": "CFN_LINT", "entity": { - "logicalId": "Task", + "logicalId": "LambdaFunctionTestDefinedRef", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.Code", "category": "Best Practice", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "startLine": 67, + "startColumn": 7, + "endLine": 67, + "endColumn": 11, + "ruleDescription": "Warn when properties are configured to only work with the package command", "phase": "LINT" - } - ] - }, - "good/ecs_fargate.yaml": { - "filePath": "good/ecs_fargate.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 2, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 9, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Family' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W3002", + "severity": "WARN", + "message": "This code may only work with 'package' cli command", + "source": "CFN_LINT", "entity": { - "logicalId": "TaskDef", + "logicalId": "LambdaFunctionTestDefinedValue", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.Family", + "propertyPath": "Properties.Code", "category": "Best Practice", - "startLine": 6, + "startLine": 77, "startColumn": 7, - "endLine": 6, - "endColumn": 13, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "endLine": 77, + "endColumn": 11, + "ruleDescription": "Warn when properties are configured to only work with the package command", + "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", + "message": "Property 'Path' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "TaskDef", + "logicalId": "LambdaExecutionRole", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.RequiresCompatibilities", + "propertyPath": "Properties.Path", "category": "Best Practice", - "startLine": 7, + "startLine": 20, "startColumn": 7, - "endLine": 7, - "endColumn": 30, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "endLine": 20, + "endColumn": 11, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -24444,135 +27924,121 @@ } }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", + "message": "Resource 'LambdaExecutionRole' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "TaskDef", + "logicalId": "LambdaExecutionRole", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.NetworkMode", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", "startLine": 9, - "startColumn": 7, + "startColumn": 5, "endLine": 9, - "endColumn": 18, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", + "message": "Resource 'LambdaFunctionTestDefinedArray' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "TaskDef", + "logicalId": "LambdaFunctionTestDefinedArray", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.Cpu", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 10, - "startColumn": 7, - "endLine": 10, - "endColumn": 10, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 23, + "startColumn": 5, + "endLine": 23, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Memory' is create-only; updating it will cause resource replacement", + "message": "Resource 'LambdaFunctionTestDefinedEmpty' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "TaskDef", + "logicalId": "LambdaFunctionTestDefinedEmpty", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.Memory", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 11, - "startColumn": 7, - "endLine": 11, - "endColumn": 13, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 35, + "startColumn": 5, + "endLine": 35, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", + "message": "Resource 'LambdaFunctionTestDefinedGetAttr' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "TaskDef", + "logicalId": "LambdaFunctionTestDefinedGetAttr", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.ContainerDefinitions", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 12, - "startColumn": 7, - "endLine": 12, - "endColumn": 27, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 45, + "startColumn": 5, + "endLine": 45, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'LaunchType' is conditionally create-only; updating it may cause resource replacement", + "message": "Resource 'LambdaFunctionTestDefinedObject' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Service", + "logicalId": "LambdaFunctionTestDefinedObject", "entityType": "Resource", - "resourceType": "AWS::ECS::Service" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.LaunchType", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 19, - "startColumn": 7, - "endLine": 19, - "endColumn": 17, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 55, + "startColumn": 5, + "endLine": 55, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'TaskDef' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", + "message": "Resource 'LambdaFunctionTestDefinedRef' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "TaskDef", + "logicalId": "LambdaFunctionTestDefinedRef", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::Lambda::Function" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 5, + "startLine": 66, "startColumn": 5, - "endLine": 5, + "endLine": 66, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -24580,19 +28046,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Service' of type 'AWS::ECS::Service' supports Tags but none are configured", + "message": "Resource 'LambdaFunctionTestDefinedValue' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Service", + "logicalId": "LambdaFunctionTestDefinedValue", "entityType": "Resource", - "resourceType": "AWS::ECS::Service" + "resourceType": "AWS::Lambda::Function" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 18, + "startLine": 76, "startColumn": 5, - "endLine": 18, + "endLine": 76, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" diff --git a/src/resources/expected/validation_reports6.json b/src/resources/expected/validation_reports6.json index 8f466ade..37aa36d2 100644 --- a/src/resources/expected/validation_reports6.json +++ b/src/resources/expected/validation_reports6.json @@ -1,14 +1,14 @@ { - "good/ecs_fargate_ddb_valid.yaml": { - "filePath": "good/ecs_fargate_ddb_valid.yaml", + "good/custom/is-not-defined.yaml": { + "filePath": "good/custom/is-not-defined.yaml", "status": "OK", "metadata": { - "resourcesScanned": 14, + "resourcesScanned": 5, "counts": { "fatal": 0, "errors": 0, - "warnings": 0, - "informational": 81, + "warnings": 8, + "informational": 6, "debug": 0 }, "suppressed": 0, @@ -17,202 +17,190 @@ }, "diagnostics": [ { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "PayPerRequestTable", - "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" - }, - "category": "Best Practice", - "startLine": 76, - "startColumn": 3, - "endLine": 76, - "endColumn": 21, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "PayPerRequestTable", - "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" - }, - "category": "Best Practice", - "startLine": 76, - "startColumn": 3, - "endLine": 76, - "endColumn": 21, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "ruleId": "W2531", + "severity": "WARN", + "message": "Runtime 'nodejs18.x' was deprecated on '2025-09-01'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'nodejs24.x'", "source": "CFN_LINT", "entity": { - "logicalId": "ProvisionedTable", + "logicalId": "LambdaFunctionTestNotDefinedFromParent", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::Lambda::Function" }, - "category": "Best Practice", - "startLine": 89, - "startColumn": 3, - "endLine": 89, - "endColumn": 19, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 26, + "startColumn": 7, + "endLine": 26, + "endColumn": 14, + "ruleDescription": "Check if EOL Lambda Function Runtimes are used", + "phase": "SCHEMA", + "context": { + "actualValue": "nodejs18.x", + "lifecycle": "deprecated" + } }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "ruleId": "W2531", + "severity": "WARN", + "message": "Runtime 'nodejs18.x' was deprecated on '2025-09-01'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'nodejs24.x'", "source": "CFN_LINT", "entity": { - "logicalId": "ProvisionedTable", + "logicalId": "LambdaFunctionTestNotDefinedFromProperties", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::Lambda::Function" }, - "category": "Best Practice", - "startLine": 89, - "startColumn": 3, - "endLine": 89, - "endColumn": 19, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 33, + "startColumn": 7, + "endLine": 33, + "endColumn": 14, + "ruleDescription": "Check if EOL Lambda Function Runtimes are used", + "phase": "SCHEMA", + "context": { + "actualValue": "nodejs18.x", + "lifecycle": "deprecated" + } }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "ruleId": "W2531", + "severity": "WARN", + "message": "Runtime 'nodejs18.x' was deprecated on '2025-09-01'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'nodejs24.x'", "source": "CFN_LINT", "entity": { - "logicalId": "DefaultWithThroughput", + "logicalId": "LambdaFunctionTestNotDefinedRefAWSNoValue", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::Lambda::Function" }, - "category": "Best Practice", - "startLine": 105, - "startColumn": 3, - "endLine": 105, - "endColumn": 24, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 43, + "startColumn": 7, + "endLine": 43, + "endColumn": 14, + "ruleDescription": "Check if EOL Lambda Function Runtimes are used", + "phase": "SCHEMA", + "context": { + "actualValue": "nodejs18.x", + "lifecycle": "deprecated" + } }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "ruleId": "W2531", + "severity": "WARN", + "message": "Runtime 'nodejs18.x' was deprecated on '2025-09-01'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'nodejs24.x'", "source": "CFN_LINT", "entity": { - "logicalId": "DefaultWithThroughput", + "logicalId": "LambdaFunctionTestNotDefinedWithSiblings", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::Lambda::Function" }, - "category": "Best Practice", - "startLine": 105, - "startColumn": 3, - "endLine": 105, - "endColumn": 24, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 53, + "startColumn": 7, + "endLine": 53, + "endColumn": 14, + "ruleDescription": "Check if EOL Lambda Function Runtimes are used", + "phase": "SCHEMA", + "context": { + "actualValue": "nodejs18.x", + "lifecycle": "deprecated" + } }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "ruleId": "W3002", + "severity": "WARN", + "message": "This code may only work with 'package' cli command", "source": "CFN_LINT", "entity": { - "logicalId": "CorrelatedProvisionedThenOnDemand", + "logicalId": "LambdaFunctionTestNotDefinedFromParent", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::Lambda::Function" }, + "propertyPath": "Properties.Code", "category": "Best Practice", - "startLine": 161, - "startColumn": 3, - "endLine": 161, - "endColumn": 36, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "startLine": 21, + "startColumn": 7, + "endLine": 21, + "endColumn": 11, + "ruleDescription": "Warn when properties are configured to only work with the package command", "phase": "LINT" }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "ruleId": "W3002", + "severity": "WARN", + "message": "This code may only work with 'package' cli command", "source": "CFN_LINT", "entity": { - "logicalId": "CorrelatedProvisionedThenOnDemand", + "logicalId": "LambdaFunctionTestNotDefinedFromProperties", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::Lambda::Function" }, + "propertyPath": "Properties.Code", "category": "Best Practice", - "startLine": 161, - "startColumn": 3, - "endLine": 161, - "endColumn": 36, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "startLine": 30, + "startColumn": 7, + "endLine": 30, + "endColumn": 11, + "ruleDescription": "Warn when properties are configured to only work with the package command", "phase": "LINT" }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "ruleId": "W3002", + "severity": "WARN", + "message": "This code may only work with 'package' cli command", "source": "CFN_LINT", "entity": { - "logicalId": "CorrelatedOnDemandThenProvisioned", + "logicalId": "LambdaFunctionTestNotDefinedRefAWSNoValue", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::Lambda::Function" }, + "propertyPath": "Properties.Code", "category": "Best Practice", - "startLine": 172, - "startColumn": 3, - "endLine": 172, - "endColumn": 36, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "startLine": 37, + "startColumn": 7, + "endLine": 37, + "endColumn": 11, + "ruleDescription": "Warn when properties are configured to only work with the package command", "phase": "LINT" }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "ruleId": "W3002", + "severity": "WARN", + "message": "This code may only work with 'package' cli command", "source": "CFN_LINT", "entity": { - "logicalId": "CorrelatedOnDemandThenProvisioned", + "logicalId": "LambdaFunctionTestNotDefinedWithSiblings", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::Lambda::Function" }, + "propertyPath": "Properties.Code", "category": "Best Practice", - "startLine": 172, - "startColumn": 3, - "endLine": 172, - "endColumn": 36, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "startLine": 47, + "startColumn": 7, + "endLine": 47, + "endColumn": 11, + "ruleDescription": "Warn when properties are configured to only work with the package command", "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Family' is create-only; updating it will cause resource replacement", + "message": "Property 'Path' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ValidFargate", + "logicalId": "LambdaExecutionRole", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.Family", + "propertyPath": "Properties.Path", "category": "Best Practice", - "startLine": 11, + "startLine": 17, "startColumn": 7, - "endLine": 11, - "endColumn": 13, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "endLine": 17, + "endColumn": 11, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -220,229 +208,244 @@ } }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", + "message": "Resource 'LambdaExecutionRole' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ValidFargate", + "logicalId": "LambdaExecutionRole", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.RequiresCompatibilities", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 12, - "startColumn": 7, - "endLine": 12, - "endColumn": 30, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 6, + "startColumn": 5, + "endLine": 6, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", + "message": "Resource 'LambdaFunctionTestNotDefinedFromParent' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ValidFargate", + "logicalId": "LambdaFunctionTestNotDefinedFromParent", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.NetworkMode", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 14, - "startColumn": 7, - "endLine": 14, - "endColumn": 18, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 20, + "startColumn": 5, + "endLine": 20, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", + "message": "Resource 'LambdaFunctionTestNotDefinedFromProperties' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ValidFargate", + "logicalId": "LambdaFunctionTestNotDefinedFromProperties", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.Cpu", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 15, - "startColumn": 7, - "endLine": 15, - "endColumn": 10, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 29, + "startColumn": 5, + "endLine": 29, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Memory' is create-only; updating it will cause resource replacement", + "message": "Resource 'LambdaFunctionTestNotDefinedRefAWSNoValue' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ValidFargate", + "logicalId": "LambdaFunctionTestNotDefinedRefAWSNoValue", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.Memory", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 16, - "startColumn": 7, - "endLine": 16, - "endColumn": 13, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 36, + "startColumn": 5, + "endLine": 36, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", + "message": "Resource 'LambdaFunctionTestNotDefinedWithSiblings' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ValidFargate", + "logicalId": "LambdaFunctionTestNotDefinedWithSiblings", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.ContainerDefinitions", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 17, + "startLine": 46, + "startColumn": 5, + "endLine": 46, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "good/custom/numeric-inequalities-large.yaml": { + "filePath": "good/custom/numeric-inequalities-large.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 3, + "counts": { + "fatal": 0, + "errors": 2, + "warnings": 3, + "informational": 4, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "E2533", + "severity": "ERROR", + "message": "Runtime 'nodejs4.3' was deprecated on '2020-03-05'. Creation was disabled on '2020-02-03', and updates were disabled on '2020-03-05'. Please consider updating to 'nodejs24.x'", + "source": "CFN_LINT", + "entity": { + "logicalId": "TimeoutInNumericsFunction", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 27, "startColumn": 7, - "endLine": 17, - "endColumn": 27, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", + "endLine": 27, + "endColumn": 14, + "ruleDescription": "Check if Lambda Function Runtimes are updatable", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "actualValue": "nodejs4.3", + "lifecycle": "end-of-life" } }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Family' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E2533", + "severity": "ERROR", + "message": "Runtime 'nodejs4.3' was deprecated on '2020-03-05'. Creation was disabled on '2020-02-03', and updates were disabled on '2020-03-05'. Please consider updating to 'nodejs24.x'", + "source": "CFN_LINT", "entity": { - "logicalId": "ValidFargateSplunk", + "logicalId": "TimeoutInStringFunction", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.Family", - "category": "Best Practice", - "startLine": 31, + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 35, "startColumn": 7, - "endLine": 31, - "endColumn": 13, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", + "endLine": 35, + "endColumn": 14, + "ruleDescription": "Check if Lambda Function Runtimes are updatable", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "actualValue": "nodejs4.3", + "lifecycle": "end-of-life" } }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W3002", + "severity": "WARN", + "message": "This code may only work with 'package' cli command", + "source": "CFN_LINT", "entity": { - "logicalId": "ValidFargateSplunk", + "logicalId": "TimeoutInNumericsFunction", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.RequiresCompatibilities", + "propertyPath": "Properties.Code", "category": "Best Practice", - "startLine": 32, + "startLine": 26, "startColumn": 7, - "endLine": 32, - "endColumn": 30, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "endLine": 26, + "endColumn": 11, + "ruleDescription": "Warn when properties are configured to only work with the package command", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W3002", + "severity": "WARN", + "message": "This code may only work with 'package' cli command", + "source": "CFN_LINT", "entity": { - "logicalId": "ValidFargateSplunk", + "logicalId": "TimeoutInStringFunction", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.NetworkMode", + "propertyPath": "Properties.Code", "category": "Best Practice", "startLine": 34, "startColumn": 7, "endLine": 34, - "endColumn": 18, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "endColumn": 11, + "ruleDescription": "Warn when properties are configured to only work with the package command", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W9003", + "severity": "WARN", + "message": "'100' is not of type 'integer' - automatically coerced (string to integer)", + "source": "CFN_LINT", "entity": { - "logicalId": "ValidFargateSplunk", + "logicalId": "TimeoutInStringFunction", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.Cpu", + "propertyPath": "Properties.Timeout", "category": "Best Practice", - "startLine": 35, + "startLine": 36, "startColumn": 7, - "endLine": 35, - "endColumn": 10, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "endLine": 36, + "endColumn": 14, + "ruleDescription": "Property type coercion warning", + "phase": "SCHEMA" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Memory' is create-only; updating it will cause resource replacement", + "message": "Property 'Path' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ValidFargateSplunk", + "logicalId": "LambdaExecutionRole", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.Memory", + "propertyPath": "Properties.Path", "category": "Best Practice", - "startLine": 36, + "startLine": 20, "startColumn": 7, - "endLine": 36, - "endColumn": 13, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "endLine": 20, + "endColumn": 11, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -450,206 +453,204 @@ } }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", + "message": "Resource 'LambdaExecutionRole' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ValidFargateSplunk", + "logicalId": "LambdaExecutionRole", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.ContainerDefinitions", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 37, - "startColumn": 7, - "endLine": 37, - "endColumn": 27, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 8, + "startColumn": 5, + "endLine": 8, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Family' is create-only; updating it will cause resource replacement", + "message": "Resource 'TimeoutInNumericsFunction' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "NonFargateTask", + "logicalId": "TimeoutInNumericsFunction", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.Family", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 48, - "startColumn": 7, - "endLine": 48, - "endColumn": 13, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 23, + "startColumn": 5, + "endLine": 23, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", + "message": "Resource 'TimeoutInStringFunction' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "NonFargateTask", + "logicalId": "TimeoutInStringFunction", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.RequiresCompatibilities", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 49, - "startColumn": 7, - "endLine": 49, - "endColumn": 30, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 31, + "startColumn": 5, + "endLine": 31, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "good/custom/numeric-inequalities-small.yaml": { + "filePath": "good/custom/numeric-inequalities-small.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 3, + "counts": { + "fatal": 0, + "errors": 2, + "warnings": 3, + "informational": 4, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E2533", + "severity": "ERROR", + "message": "Runtime 'nodejs4.3' was deprecated on '2020-03-05'. Creation was disabled on '2020-02-03', and updates were disabled on '2020-03-05'. Please consider updating to 'nodejs24.x'", + "source": "CFN_LINT", "entity": { - "logicalId": "NonFargateTask", + "logicalId": "TimeoutInNumericsFunction", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.NetworkMode", - "category": "Best Practice", - "startLine": 51, + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 27, "startColumn": 7, - "endLine": 51, - "endColumn": 18, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", + "endLine": 27, + "endColumn": 14, + "ruleDescription": "Check if Lambda Function Runtimes are updatable", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "actualValue": "nodejs4.3", + "lifecycle": "end-of-life" } }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E2533", + "severity": "ERROR", + "message": "Runtime 'nodejs4.3' was deprecated on '2020-03-05'. Creation was disabled on '2020-02-03', and updates were disabled on '2020-03-05'. Please consider updating to 'nodejs24.x'", + "source": "CFN_LINT", "entity": { - "logicalId": "NonFargateTask", + "logicalId": "TimeoutInStringFunction", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.ContainerDefinitions", - "category": "Best Practice", - "startLine": 52, + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 35, "startColumn": 7, - "endLine": 52, - "endColumn": 27, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", + "endLine": 35, + "endColumn": 14, + "ruleDescription": "Check if Lambda Function Runtimes are updatable", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "actualValue": "nodejs4.3", + "lifecycle": "end-of-life" } }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Family' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W3002", + "severity": "WARN", + "message": "This code may only work with 'package' cli command", + "source": "CFN_LINT", "entity": { - "logicalId": "FargateNullPC", + "logicalId": "TimeoutInNumericsFunction", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.Family", + "propertyPath": "Properties.Code", "category": "Best Practice", - "startLine": 63, + "startLine": 26, "startColumn": 7, - "endLine": 63, - "endColumn": 13, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "endLine": 26, + "endColumn": 11, + "ruleDescription": "Warn when properties are configured to only work with the package command", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W3002", + "severity": "WARN", + "message": "This code may only work with 'package' cli command", + "source": "CFN_LINT", "entity": { - "logicalId": "FargateNullPC", + "logicalId": "TimeoutInStringFunction", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.RequiresCompatibilities", + "propertyPath": "Properties.Code", "category": "Best Practice", - "startLine": 64, + "startLine": 34, "startColumn": 7, - "endLine": 64, - "endColumn": 30, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "endLine": 34, + "endColumn": 11, + "ruleDescription": "Warn when properties are configured to only work with the package command", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W9003", + "severity": "WARN", + "message": "'9' is not of type 'integer' - automatically coerced (string to integer)", + "source": "CFN_LINT", "entity": { - "logicalId": "FargateNullPC", + "logicalId": "TimeoutInStringFunction", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.NetworkMode", + "propertyPath": "Properties.Timeout", "category": "Best Practice", - "startLine": 66, + "startLine": 36, "startColumn": 7, - "endLine": 66, - "endColumn": 18, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "endLine": 36, + "endColumn": 14, + "ruleDescription": "Property type coercion warning", + "phase": "SCHEMA" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", + "message": "Property 'Path' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FargateNullPC", + "logicalId": "LambdaExecutionRole", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.Cpu", + "propertyPath": "Properties.Path", "category": "Best Practice", - "startLine": 67, + "startLine": 20, "startColumn": 7, - "endLine": 67, - "endColumn": 10, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "endLine": 20, + "endColumn": 11, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -657,113 +658,262 @@ } }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Memory' is create-only; updating it will cause resource replacement", + "message": "Resource 'LambdaExecutionRole' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "FargateNullPC", + "logicalId": "LambdaExecutionRole", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.Memory", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 68, - "startColumn": 7, - "endLine": 68, - "endColumn": 13, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 8, + "startColumn": 5, + "endLine": 8, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'PlacementConstraints' is create-only; updating it will cause resource replacement", + "message": "Resource 'TimeoutInNumericsFunction' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "FargateNullPC", + "logicalId": "TimeoutInNumericsFunction", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.PlacementConstraints", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 69, - "startColumn": 7, - "endLine": 69, - "endColumn": 27, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Fn::If on condition 'IsProd'" - } + "startLine": 23, + "startColumn": 5, + "endLine": 23, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", + "message": "Resource 'TimeoutInStringFunction' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "FargateNullPC", + "logicalId": "TimeoutInStringFunction", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.ContainerDefinitions", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 70, + "startLine": 31, + "startColumn": 5, + "endLine": 31, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "good/decode/parsing.json": { + "filePath": "good/decode/parsing.json", + "status": "OK", + "metadata": { + "resourcesScanned": 0, + "counts": { + "fatal": 1, + "errors": 0, + "warnings": 1, + "informational": 0, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "F0001", + "severity": "FATAL", + "message": "Resources section must exist and be non-empty", + "source": "SCHEMA", + "category": "Structure", + "startLine": 8, + "startColumn": 3, + "endLine": 8, + "endColumn": 13, + "ruleDescription": "Resources section must exist and be non-empty", + "phase": "SCHEMA" + }, + { + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'VPN' is not referenced anywhere in the template", + "source": "CFN_LINT", + "entity": { + "logicalId": "VPN", + "entityType": "Parameter" + }, + "propertyPath": "Parameters/VPN", + "category": "Best Practice", + "startLine": 3, + "startColumn": 5, + "endLine": 3, + "endColumn": 9, + "ruleDescription": "Check if Parameters are Used", + "phase": "LINT" + } + ] + }, + "good/decode/yaml11_scalars.yaml": { + "filePath": "good/decode/yaml11_scalars.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 0, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [] + }, + "good/deletion_policies.yaml": { + "filePath": "good/deletion_policies.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 2, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 4, + "informational": 7, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "W2501", + "severity": "WARN", + "message": "Property 'MasterUserPassword' should not be a hardcoded string - use a parameter with NoEcho or a dynamic reference", + "source": "CFN_LINT", + "entity": { + "logicalId": "DB", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.MasterUserPassword", + "category": "Security", + "startLine": 12, "startColumn": 7, - "endLine": 70, - "endColumn": 27, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "endLine": 12, + "endColumn": 25, + "ruleDescription": "Check if Password Properties are correctly configured", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'TableName' is create-only; updating it will cause resource replacement", + "ruleId": "W3011", + "severity": "WARN", + "message": "Both 'UpdateReplacePolicy' and 'DeletionPolicy' are needed to protect resource from deletion", + "source": "CFN_LINT", + "entity": { + "logicalId": "Bucket", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" + }, + "category": "Best Practice", + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 9, + "ruleDescription": "Check resources with UpdateReplacePolicy/DeletionPolicy have both", + "phase": "LINT" + }, + { + "ruleId": "W3011", + "severity": "WARN", + "message": "Both 'UpdateReplacePolicy' and 'DeletionPolicy' are needed to protect resource from deletion", + "source": "CFN_LINT", + "entity": { + "logicalId": "DB", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "category": "Best Practice", + "startLine": 6, + "startColumn": 3, + "endLine": 6, + "endColumn": 5, + "ruleDescription": "Check resources with UpdateReplacePolicy/DeletionPolicy have both", + "phase": "LINT" + }, + { + "ruleId": "W9008", + "severity": "WARN", + "message": "RDS instance should have StorageEncrypted set to true", "source": "ENGINE", "entity": { - "logicalId": "PayPerRequestTable", + "logicalId": "DB", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.StorageEncrypted", + "suggestedFix": "Set StorageEncrypted to true", + "category": "Security", + "startLine": 9, + "startColumn": 5, + "endLine": 9, + "endColumn": 15, + "ruleDescription": "RDS instance should have StorageEncrypted", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "DB", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.TableName", "category": "Best Practice", - "startLine": 79, - "startColumn": 7, - "endLine": 79, - "endColumn": 16, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 6, + "startColumn": 3, + "endLine": 6, + "endColumn": 5, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "PayPerRequestTable", + "logicalId": "DB", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.KeySchema", + "propertyPath": "Properties.Engine", "category": "Best Practice", - "startLine": 81, + "startLine": 10, "startColumn": 7, - "endLine": 81, - "endColumn": 16, + "endLine": 10, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -773,19 +923,20 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'TableName' is create-only; updating it will cause resource replacement", + "message": "Property 'MasterUsername' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ProvisionedTable", + "logicalId": "DB", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.TableName", + "propertyPath": "Properties.MasterUsername", "category": "Best Practice", - "startLine": 92, + "startLine": 11, "startColumn": 7, - "endLine": 92, - "endColumn": 16, + "endLine": 11, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -795,40 +946,145 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'BackupRetentionPeriod' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ProvisionedTable", + "logicalId": "DB", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.KeySchema", + "propertyPath": "Properties.BackupRetentionPeriod", "category": "Best Practice", - "startLine": 97, + "startLine": 14, "startColumn": 7, - "endLine": 97, - "endColumn": 16, + "endLine": 14, + "endColumn": 28, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "conditional-create-only" } }, + { + "ruleId": "I9003", + "severity": "INFO", + "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", + "source": "ENGINE", + "category": "Best Practice", + "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "Bucket", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 9, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'DB' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "DB", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 9, + "startColumn": 5, + "endLine": 9, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "good/dynamodb_provisioned.yaml": { + "filePath": "good/dynamodb_provisioned.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 5, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "DDBTable", + "entityType": "Resource", + "resourceType": "AWS::DynamoDB::Table" + }, + "category": "Best Practice", + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 11, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "DDBTable", + "entityType": "Resource", + "resourceType": "AWS::DynamoDB::Table" + }, + "category": "Best Practice", + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 11, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, { "ruleId": "I9001", "severity": "INFO", "message": "Property 'TableName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DefaultWithThroughput", + "logicalId": "DDBTable", "entityType": "Resource", "resourceType": "AWS::DynamoDB::Table" }, "propertyPath": "Properties.TableName", "category": "Best Practice", - "startLine": 108, + "startLine": 6, "startColumn": 7, - "endLine": 108, + "endLine": 6, "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", @@ -842,15 +1098,15 @@ "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DefaultWithThroughput", + "logicalId": "DDBTable", "entityType": "Resource", "resourceType": "AWS::DynamoDB::Table" }, "propertyPath": "Properties.KeySchema", "category": "Best Practice", - "startLine": 112, + "startLine": 14, "startColumn": 7, - "endLine": 112, + "endLine": 14, "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", @@ -859,91 +1115,96 @@ } }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Family' is create-only; updating it will cause resource replacement", + "message": "Resource 'DDBTable' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "FargateIntCpu", + "logicalId": "DDBTable", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.Family", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 123, - "startColumn": 7, - "endLine": 123, - "endColumn": 13, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "good/dynamodb_valid_attributes.yaml": { + "filePath": "good/dynamodb_valid_attributes.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 5, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "FargateIntCpu", + "logicalId": "GoodTable", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 124, - "startColumn": 7, - "endLine": 124, - "endColumn": 30, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 12, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "FargateIntCpu", + "logicalId": "GoodTable", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 126, - "startColumn": 7, - "endLine": 126, - "endColumn": 18, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 12, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", + "message": "Property 'TableName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FargateIntCpu", + "logicalId": "GoodTable", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.Cpu", + "propertyPath": "Properties.TableName", "category": "Best Practice", - "startLine": 127, + "startLine": 6, "startColumn": 7, - "endLine": 127, - "endColumn": 10, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "endLine": 6, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -953,113 +1214,103 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Memory' is create-only; updating it will cause resource replacement", + "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FargateIntCpu", + "logicalId": "GoodTable", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.Memory", + "propertyPath": "Properties.KeySchema", "category": "Best Practice", - "startLine": 128, + "startLine": 13, "startColumn": 7, - "endLine": 128, - "endColumn": 13, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "endLine": 13, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", + "message": "Resource 'GoodTable' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "FargateIntCpu", + "logicalId": "GoodTable", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.ContainerDefinitions", - "category": "Best Practice", - "startLine": 129, - "startColumn": 7, - "endLine": 129, - "endColumn": 27, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "CorrelatedFargateThenEc2", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.RequiresCompatibilities", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 139, - "startColumn": 7, - "endLine": 139, - "endColumn": 30, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Fn::If on condition 'IsProd'" - } + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "good/ecs_awsvpc_valid.yaml": { + "filePath": "good/ecs_awsvpc_valid.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 3, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { "ruleId": "I9001", "severity": "INFO", "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "CorrelatedFargateThenEc2", + "logicalId": "Task", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 140, + "startLine": 6, "startColumn": 7, - "endLine": 140, + "endLine": 6, "endColumn": 18, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Fn::If on condition 'IsProd'" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", + "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "CorrelatedFargateThenEc2", + "logicalId": "Task", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Cpu", + "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 141, + "startLine": 7, "startColumn": 7, - "endLine": 141, - "endColumn": 10, + "endLine": 7, + "endColumn": 27, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", @@ -1068,44 +1319,60 @@ } }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Memory' is create-only; updating it will cause resource replacement", + "message": "Resource 'Task' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "CorrelatedFargateThenEc2", + "logicalId": "Task", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Memory", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 142, - "startColumn": 7, - "endLine": 142, - "endColumn": 13, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "good/ecs_fargate.yaml": { + "filePath": "good/ecs_fargate.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 2, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 9, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", + "message": "Property 'Family' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "CorrelatedFargateThenEc2", + "logicalId": "TaskDef", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.ContainerDefinitions", + "propertyPath": "Properties.Family", "category": "Best Practice", - "startLine": 143, + "startLine": 6, "startColumn": 7, - "endLine": 143, - "endColumn": 27, + "endLine": 6, + "endColumn": 13, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", @@ -1119,22 +1386,21 @@ "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "CorrelatedEc2ThenFargate", + "logicalId": "TaskDef", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 151, + "startLine": 7, "startColumn": 7, - "endLine": 151, + "endLine": 7, "endColumn": 30, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Fn::If on condition 'IsProd'" + "lifecycle": "create-only" } }, { @@ -1143,22 +1409,21 @@ "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "CorrelatedEc2ThenFargate", + "logicalId": "TaskDef", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 152, + "startLine": 9, "startColumn": 7, - "endLine": 152, + "endLine": 9, "endColumn": 18, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Fn::If on condition 'IsProd'" + "lifecycle": "create-only" } }, { @@ -1167,15 +1432,15 @@ "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "CorrelatedEc2ThenFargate", + "logicalId": "TaskDef", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Cpu", "category": "Best Practice", - "startLine": 153, + "startLine": 10, "startColumn": 7, - "endLine": 153, + "endLine": 10, "endColumn": 10, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -1190,15 +1455,15 @@ "message": "Property 'Memory' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "CorrelatedEc2ThenFargate", + "logicalId": "TaskDef", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Memory", "category": "Best Practice", - "startLine": 154, + "startLine": 11, "startColumn": 7, - "endLine": 154, + "endLine": 11, "endColumn": 13, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -1213,15 +1478,15 @@ "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "CorrelatedEc2ThenFargate", + "logicalId": "TaskDef", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 155, + "startLine": 12, "startColumn": 7, - "endLine": 155, + "endLine": 12, "endColumn": 27, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -1233,19 +1498,19 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'LaunchType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "CorrelatedProvisionedThenOnDemand", + "logicalId": "Service", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::ECS::Service" }, - "propertyPath": "Properties.KeySchema", + "propertyPath": "Properties.LaunchType", "category": "Best Practice", - "startLine": 166, + "startLine": 19, "startColumn": 7, - "endLine": 166, - "endColumn": 16, + "endLine": 19, + "endColumn": 17, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -1253,138 +1518,260 @@ } }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", + "message": "Resource 'TaskDef' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "CorrelatedOnDemandThenProvisioned", + "logicalId": "TaskDef", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.KeySchema", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 177, - "startColumn": 7, - "endLine": 177, - "endColumn": 16, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", + "message": "Resource 'Service' of type 'AWS::ECS::Service' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "CorrelatedFargateSizeThenEc2", + "logicalId": "Service", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::ECS::Service" }, - "propertyPath": "Properties.RequiresCompatibilities", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 187, - "startColumn": 7, - "endLine": 187, - "endColumn": 30, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Fn::If on condition 'IsProd'" - } + "startLine": 18, + "startColumn": 5, + "endLine": 18, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "good/ecs_fargate_ddb_valid.yaml": { + "filePath": "good/ecs_fargate_ddb_valid.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 14, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 81, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "CorrelatedFargateSizeThenEc2", + "logicalId": "PayPerRequestTable", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 188, - "startColumn": 7, - "endLine": 188, - "endColumn": 18, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Fn::If on condition 'IsProd'" - } + "startLine": 76, + "startColumn": 3, + "endLine": 76, + "endColumn": 21, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "CorrelatedFargateSizeThenEc2", + "logicalId": "PayPerRequestTable", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.Cpu", "category": "Best Practice", - "startLine": 189, - "startColumn": 7, - "endLine": 189, - "endColumn": 10, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Fn::If on condition 'IsProd'" - } + "startLine": 76, + "startColumn": 3, + "endLine": 76, + "endColumn": 21, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'Memory' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "CorrelatedFargateSizeThenEc2", + "logicalId": "ProvisionedTable", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.Memory", "category": "Best Practice", - "startLine": 190, - "startColumn": 7, - "endLine": 190, - "endColumn": 13, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 89, + "startColumn": 3, + "endLine": 89, + "endColumn": 19, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "ProvisionedTable", + "entityType": "Resource", + "resourceType": "AWS::DynamoDB::Table" + }, + "category": "Best Practice", + "startLine": 89, + "startColumn": 3, + "endLine": 89, + "endColumn": 19, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "DefaultWithThroughput", + "entityType": "Resource", + "resourceType": "AWS::DynamoDB::Table" + }, + "category": "Best Practice", + "startLine": 105, + "startColumn": 3, + "endLine": 105, + "endColumn": 24, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "DefaultWithThroughput", + "entityType": "Resource", + "resourceType": "AWS::DynamoDB::Table" + }, + "category": "Best Practice", + "startLine": 105, + "startColumn": 3, + "endLine": 105, + "endColumn": 24, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "CorrelatedProvisionedThenOnDemand", + "entityType": "Resource", + "resourceType": "AWS::DynamoDB::Table" + }, + "category": "Best Practice", + "startLine": 161, + "startColumn": 3, + "endLine": 161, + "endColumn": 36, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "CorrelatedProvisionedThenOnDemand", + "entityType": "Resource", + "resourceType": "AWS::DynamoDB::Table" + }, + "category": "Best Practice", + "startLine": 161, + "startColumn": 3, + "endLine": 161, + "endColumn": 36, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "CorrelatedOnDemandThenProvisioned", + "entityType": "Resource", + "resourceType": "AWS::DynamoDB::Table" + }, + "category": "Best Practice", + "startLine": 172, + "startColumn": 3, + "endLine": 172, + "endColumn": 36, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "CorrelatedOnDemandThenProvisioned", + "entityType": "Resource", + "resourceType": "AWS::DynamoDB::Table" + }, + "category": "Best Practice", + "startLine": 172, + "startColumn": 3, + "endLine": 172, + "endColumn": 36, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", + "message": "Property 'Family' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "CorrelatedFargateSizeThenEc2", + "logicalId": "ValidFargate", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.ContainerDefinitions", + "propertyPath": "Properties.Family", "category": "Best Practice", - "startLine": 191, + "startLine": 11, "startColumn": 7, - "endLine": 191, - "endColumn": 27, + "endLine": 11, + "endColumn": 13, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", @@ -1398,22 +1785,21 @@ "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "CorrelatedEc2SizeThenFargate", + "logicalId": "ValidFargate", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 199, + "startLine": 12, "startColumn": 7, - "endLine": 199, + "endLine": 12, "endColumn": 30, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Fn::If on condition 'IsProd'" + "lifecycle": "create-only" } }, { @@ -1422,22 +1808,21 @@ "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "CorrelatedEc2SizeThenFargate", + "logicalId": "ValidFargate", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 200, + "startLine": 14, "startColumn": 7, - "endLine": 200, + "endLine": 14, "endColumn": 18, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Fn::If on condition 'IsProd'" + "lifecycle": "create-only" } }, { @@ -1446,22 +1831,21 @@ "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "CorrelatedEc2SizeThenFargate", + "logicalId": "ValidFargate", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Cpu", "category": "Best Practice", - "startLine": 201, + "startLine": 15, "startColumn": 7, - "endLine": 201, + "endLine": 15, "endColumn": 10, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Fn::If on condition 'IsProd'" + "lifecycle": "create-only" } }, { @@ -1470,15 +1854,15 @@ "message": "Property 'Memory' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "CorrelatedEc2SizeThenFargate", + "logicalId": "ValidFargate", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Memory", "category": "Best Practice", - "startLine": 202, + "startLine": 16, "startColumn": 7, - "endLine": 202, + "endLine": 16, "endColumn": 13, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -1493,15 +1877,15 @@ "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "CorrelatedEc2SizeThenFargate", + "logicalId": "ValidFargate", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 203, + "startLine": 17, "startColumn": 7, - "endLine": 203, + "endLine": 17, "endColumn": 27, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -1511,319 +1895,273 @@ } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'ValidFargate' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", + "message": "Property 'Family' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ValidFargate", + "logicalId": "ValidFargateSplunk", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.Family", "category": "Best Practice", - "startLine": 10, - "startColumn": 5, - "endLine": 10, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 31, + "startColumn": 7, + "endLine": 31, + "endColumn": 13, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'ValidFargateSplunk' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", + "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { "logicalId": "ValidFargateSplunk", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 30, - "startColumn": 5, - "endLine": 30, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 32, + "startColumn": 7, + "endLine": 32, + "endColumn": 30, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'NonFargateTask' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", + "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "NonFargateTask", + "logicalId": "ValidFargateSplunk", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 47, - "startColumn": 5, - "endLine": 47, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 34, + "startColumn": 7, + "endLine": 34, + "endColumn": 18, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'FargateNullPC' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", + "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FargateNullPC", + "logicalId": "ValidFargateSplunk", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.Cpu", "category": "Best Practice", - "startLine": 62, - "startColumn": 5, - "endLine": 62, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 35, + "startColumn": 7, + "endLine": 35, + "endColumn": 10, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'PayPerRequestTable' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", + "message": "Property 'Memory' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "PayPerRequestTable", + "logicalId": "ValidFargateSplunk", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.Memory", "category": "Best Practice", - "startLine": 78, - "startColumn": 5, - "endLine": 78, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 36, + "startColumn": 7, + "endLine": 36, + "endColumn": 13, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'ProvisionedTable' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", + "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ProvisionedTable", + "logicalId": "ValidFargateSplunk", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 91, - "startColumn": 5, - "endLine": 91, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 37, + "startColumn": 7, + "endLine": 37, + "endColumn": 27, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'DefaultWithThroughput' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", + "message": "Property 'Family' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DefaultWithThroughput", + "logicalId": "NonFargateTask", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.Family", "category": "Best Practice", - "startLine": 107, - "startColumn": 5, - "endLine": 107, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 48, + "startColumn": 7, + "endLine": 48, + "endColumn": 13, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'FargateIntCpu' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", + "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FargateIntCpu", + "logicalId": "NonFargateTask", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 122, - "startColumn": 5, - "endLine": 122, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 49, + "startColumn": 7, + "endLine": 49, + "endColumn": 30, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'CorrelatedFargateThenEc2' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", + "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "CorrelatedFargateThenEc2", + "logicalId": "NonFargateTask", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 138, - "startColumn": 5, - "endLine": 138, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 51, + "startColumn": 7, + "endLine": 51, + "endColumn": 18, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'CorrelatedEc2ThenFargate' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", + "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "CorrelatedEc2ThenFargate", + "logicalId": "NonFargateTask", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 150, - "startColumn": 5, - "endLine": 150, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 52, + "startColumn": 7, + "endLine": 52, + "endColumn": 27, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'CorrelatedProvisionedThenOnDemand' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", + "message": "Property 'Family' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "CorrelatedProvisionedThenOnDemand", - "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 163, - "startColumn": 5, - "endLine": 163, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'CorrelatedOnDemandThenProvisioned' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "CorrelatedOnDemandThenProvisioned", - "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 174, - "startColumn": 5, - "endLine": 174, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'CorrelatedFargateSizeThenEc2' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "CorrelatedFargateSizeThenEc2", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 186, - "startColumn": 5, - "endLine": 186, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'CorrelatedEc2SizeThenFargate' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "CorrelatedEc2SizeThenFargate", + "logicalId": "FargateNullPC", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.Family", "category": "Best Practice", - "startLine": 198, - "startColumn": 5, - "endLine": 198, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "good/ecs_fargate_decimal_units.yaml": { - "filePath": "good/ecs_fargate_decimal_units.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 7, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 42, - "debug": 0 + "startLine": 63, + "startColumn": 7, + "endLine": 63, + "endColumn": 13, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { "ruleId": "I9001", "severity": "INFO", "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "QuarterVcpuDecimal", + "logicalId": "FargateNullPC", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 6, + "startLine": 64, "startColumn": 7, - "endLine": 6, + "endLine": 64, "endColumn": 30, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -1838,15 +2176,15 @@ "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "QuarterVcpuDecimal", + "logicalId": "FargateNullPC", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 7, + "startLine": 66, "startColumn": 7, - "endLine": 7, + "endLine": 66, "endColumn": 18, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -1861,15 +2199,15 @@ "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "QuarterVcpuDecimal", + "logicalId": "FargateNullPC", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Cpu", "category": "Best Practice", - "startLine": 8, + "startLine": 67, "startColumn": 7, - "endLine": 8, + "endLine": 67, "endColumn": 10, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -1884,15 +2222,15 @@ "message": "Property 'Memory' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "QuarterVcpuDecimal", + "logicalId": "FargateNullPC", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Memory", "category": "Best Practice", - "startLine": 9, + "startLine": 68, "startColumn": 7, - "endLine": 9, + "endLine": 68, "endColumn": 13, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -1904,42 +2242,43 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", + "message": "Property 'PlacementConstraints' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "QuarterVcpuDecimal", + "logicalId": "FargateNullPC", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.ContainerDefinitions", + "propertyPath": "Properties.PlacementConstraints", "category": "Best Practice", - "startLine": 10, + "startLine": 69, "startColumn": 7, - "endLine": 10, + "endLine": 69, "endColumn": 27, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "Fn::If on condition 'IsProd'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", + "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "HalfVcpuDecimal", + "logicalId": "FargateNullPC", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.RequiresCompatibilities", + "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 18, + "startLine": 70, "startColumn": 7, - "endLine": 18, - "endColumn": 30, + "endLine": 70, + "endColumn": 27, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", @@ -1950,20 +2289,19 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", + "message": "Property 'TableName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "HalfVcpuDecimal", + "logicalId": "PayPerRequestTable", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.NetworkMode", + "propertyPath": "Properties.TableName", "category": "Best Practice", - "startLine": 19, + "startLine": 79, "startColumn": 7, - "endLine": 19, - "endColumn": 18, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "endLine": 79, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -1973,43 +2311,41 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", + "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "HalfVcpuDecimal", + "logicalId": "PayPerRequestTable", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.Cpu", + "propertyPath": "Properties.KeySchema", "category": "Best Practice", - "startLine": 20, + "startLine": 81, "startColumn": 7, - "endLine": 20, - "endColumn": 10, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "endLine": 81, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Memory' is create-only; updating it will cause resource replacement", + "message": "Property 'TableName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "HalfVcpuDecimal", + "logicalId": "ProvisionedTable", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.Memory", + "propertyPath": "Properties.TableName", "category": "Best Practice", - "startLine": 21, + "startLine": 92, "startColumn": 7, - "endLine": 21, - "endColumn": 13, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "endLine": 92, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -2019,43 +2355,41 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", + "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "HalfVcpuDecimal", + "logicalId": "ProvisionedTable", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.ContainerDefinitions", + "propertyPath": "Properties.KeySchema", "category": "Best Practice", - "startLine": 22, + "startLine": 97, "startColumn": 7, - "endLine": 22, - "endColumn": 27, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "endLine": 97, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", + "message": "Property 'TableName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DecimalEquivalent", + "logicalId": "DefaultWithThroughput", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.RequiresCompatibilities", + "propertyPath": "Properties.TableName", "category": "Best Practice", - "startLine": 30, + "startLine": 108, "startColumn": 7, - "endLine": 30, - "endColumn": 30, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "endLine": 108, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -2065,42 +2399,41 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", + "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DecimalEquivalent", + "logicalId": "DefaultWithThroughput", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.NetworkMode", + "propertyPath": "Properties.KeySchema", "category": "Best Practice", - "startLine": 31, + "startLine": 112, "startColumn": 7, - "endLine": 31, - "endColumn": 18, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "endLine": 112, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", + "message": "Property 'Family' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DecimalEquivalent", + "logicalId": "FargateIntCpu", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Cpu", + "propertyPath": "Properties.Family", "category": "Best Practice", - "startLine": 32, + "startLine": 123, "startColumn": 7, - "endLine": 32, - "endColumn": 10, + "endLine": 123, + "endColumn": 13, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", @@ -2111,64 +2444,18 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Memory' is create-only; updating it will cause resource replacement", + "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DecimalEquivalent", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.Memory", - "category": "Best Practice", - "startLine": 33, - "startColumn": 7, - "endLine": 33, - "endColumn": 13, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "DecimalEquivalent", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.ContainerDefinitions", - "category": "Best Practice", - "startLine": 34, - "startColumn": 7, - "endLine": 34, - "endColumn": 27, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "PlusDecimalEquivalent", + "logicalId": "FargateIntCpu", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 42, + "startLine": 124, "startColumn": 7, - "endLine": 42, + "endLine": 124, "endColumn": 30, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -2183,15 +2470,15 @@ "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "PlusDecimalEquivalent", + "logicalId": "FargateIntCpu", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 43, + "startLine": 126, "startColumn": 7, - "endLine": 43, + "endLine": 126, "endColumn": 18, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -2206,15 +2493,15 @@ "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "PlusDecimalEquivalent", + "logicalId": "FargateIntCpu", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Cpu", "category": "Best Practice", - "startLine": 44, + "startLine": 127, "startColumn": 7, - "endLine": 44, + "endLine": 127, "endColumn": 10, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -2229,15 +2516,15 @@ "message": "Property 'Memory' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "PlusDecimalEquivalent", + "logicalId": "FargateIntCpu", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Memory", "category": "Best Practice", - "startLine": 45, + "startLine": 128, "startColumn": 7, - "endLine": 45, + "endLine": 128, "endColumn": 13, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -2252,15 +2539,15 @@ "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "PlusDecimalEquivalent", + "logicalId": "FargateIntCpu", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 46, + "startLine": 129, "startColumn": 7, - "endLine": 46, + "endLine": 129, "endColumn": 27, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -2275,21 +2562,22 @@ "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "LeadingZeroEquivalent", + "logicalId": "CorrelatedFargateThenEc2", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 54, + "startLine": 139, "startColumn": 7, - "endLine": 54, + "endLine": 139, "endColumn": 30, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "Fn::If on condition 'IsProd'" } }, { @@ -2298,21 +2586,22 @@ "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "LeadingZeroEquivalent", + "logicalId": "CorrelatedFargateThenEc2", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 55, + "startLine": 140, "startColumn": 7, - "endLine": 55, + "endLine": 140, "endColumn": 18, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "Fn::If on condition 'IsProd'" } }, { @@ -2321,15 +2610,15 @@ "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "LeadingZeroEquivalent", + "logicalId": "CorrelatedFargateThenEc2", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Cpu", "category": "Best Practice", - "startLine": 56, + "startLine": 141, "startColumn": 7, - "endLine": 56, + "endLine": 141, "endColumn": 10, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -2344,15 +2633,15 @@ "message": "Property 'Memory' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "LeadingZeroEquivalent", + "logicalId": "CorrelatedFargateThenEc2", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Memory", "category": "Best Practice", - "startLine": 57, + "startLine": 142, "startColumn": 7, - "endLine": 57, + "endLine": 142, "endColumn": 13, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -2367,15 +2656,15 @@ "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "LeadingZeroEquivalent", + "logicalId": "CorrelatedFargateThenEc2", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 58, + "startLine": 143, "startColumn": 7, - "endLine": 58, + "endLine": 143, "endColumn": 27, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -2390,21 +2679,22 @@ "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "LeadingDecimalPointEquivalent", + "logicalId": "CorrelatedEc2ThenFargate", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 66, + "startLine": 151, "startColumn": 7, - "endLine": 66, + "endLine": 151, "endColumn": 30, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "Fn::If on condition 'IsProd'" } }, { @@ -2413,21 +2703,22 @@ "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "LeadingDecimalPointEquivalent", + "logicalId": "CorrelatedEc2ThenFargate", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 67, + "startLine": 152, "startColumn": 7, - "endLine": 67, + "endLine": 152, "endColumn": 18, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "Fn::If on condition 'IsProd'" } }, { @@ -2436,15 +2727,15 @@ "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "LeadingDecimalPointEquivalent", + "logicalId": "CorrelatedEc2ThenFargate", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Cpu", "category": "Best Practice", - "startLine": 68, + "startLine": 153, "startColumn": 7, - "endLine": 68, + "endLine": 153, "endColumn": 10, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -2459,15 +2750,15 @@ "message": "Property 'Memory' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "LeadingDecimalPointEquivalent", + "logicalId": "CorrelatedEc2ThenFargate", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Memory", "category": "Best Practice", - "startLine": 69, + "startLine": 154, "startColumn": 7, - "endLine": 69, + "endLine": 154, "endColumn": 13, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -2482,15 +2773,15 @@ "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "LeadingDecimalPointEquivalent", + "logicalId": "CorrelatedEc2ThenFargate", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 70, + "startLine": 155, "startColumn": 7, - "endLine": 70, + "endLine": 155, "endColumn": 27, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -2499,27 +2790,72 @@ "lifecycle": "create-only" } }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "CorrelatedProvisionedThenOnDemand", + "entityType": "Resource", + "resourceType": "AWS::DynamoDB::Table" + }, + "propertyPath": "Properties.KeySchema", + "category": "Best Practice", + "startLine": 166, + "startColumn": 7, + "endLine": 166, + "endColumn": 16, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "CorrelatedOnDemandThenProvisioned", + "entityType": "Resource", + "resourceType": "AWS::DynamoDB::Table" + }, + "propertyPath": "Properties.KeySchema", + "category": "Best Practice", + "startLine": 177, + "startColumn": 7, + "endLine": 177, + "endColumn": 16, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } + }, { "ruleId": "I9001", "severity": "INFO", "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "TrailingDecimalPointEquivalent", + "logicalId": "CorrelatedFargateSizeThenEc2", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 78, + "startLine": 187, "startColumn": 7, - "endLine": 78, + "endLine": 187, "endColumn": 30, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "Fn::If on condition 'IsProd'" } }, { @@ -2528,21 +2864,22 @@ "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "TrailingDecimalPointEquivalent", + "logicalId": "CorrelatedFargateSizeThenEc2", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 79, + "startLine": 188, "startColumn": 7, - "endLine": 79, + "endLine": 188, "endColumn": 18, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "Fn::If on condition 'IsProd'" } }, { @@ -2551,21 +2888,22 @@ "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "TrailingDecimalPointEquivalent", + "logicalId": "CorrelatedFargateSizeThenEc2", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Cpu", "category": "Best Practice", - "startLine": 80, + "startLine": 189, "startColumn": 7, - "endLine": 80, + "endLine": 189, "endColumn": 10, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "Fn::If on condition 'IsProd'" } }, { @@ -2574,15 +2912,15 @@ "message": "Property 'Memory' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "TrailingDecimalPointEquivalent", + "logicalId": "CorrelatedFargateSizeThenEc2", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Memory", "category": "Best Practice", - "startLine": 81, + "startLine": 190, "startColumn": 7, - "endLine": 81, + "endLine": 190, "endColumn": 13, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -2597,15 +2935,15 @@ "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "TrailingDecimalPointEquivalent", + "logicalId": "CorrelatedFargateSizeThenEc2", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 82, + "startLine": 191, "startColumn": 7, - "endLine": 82, + "endLine": 191, "endColumn": 27, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -2615,61 +2953,139 @@ } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'QuarterVcpuDecimal' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", + "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "QuarterVcpuDecimal", + "logicalId": "CorrelatedEc2SizeThenFargate", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'HalfVcpuDecimal' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "HalfVcpuDecimal", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "startLine": 199, + "startColumn": 7, + "endLine": 199, + "endColumn": 30, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Fn::If on condition 'IsProd'" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "CorrelatedEc2SizeThenFargate", + "entityType": "Resource", + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 17, - "startColumn": 5, - "endLine": 17, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 200, + "startColumn": 7, + "endLine": 200, + "endColumn": 18, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Fn::If on condition 'IsProd'" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "CorrelatedEc2SizeThenFargate", + "entityType": "Resource", + "resourceType": "AWS::ECS::TaskDefinition" + }, + "propertyPath": "Properties.Cpu", + "category": "Best Practice", + "startLine": 201, + "startColumn": 7, + "endLine": 201, + "endColumn": 10, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Fn::If on condition 'IsProd'" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Memory' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "CorrelatedEc2SizeThenFargate", + "entityType": "Resource", + "resourceType": "AWS::ECS::TaskDefinition" + }, + "propertyPath": "Properties.Memory", + "category": "Best Practice", + "startLine": 202, + "startColumn": 7, + "endLine": 202, + "endColumn": 13, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "CorrelatedEc2SizeThenFargate", + "entityType": "Resource", + "resourceType": "AWS::ECS::TaskDefinition" + }, + "propertyPath": "Properties.ContainerDefinitions", + "category": "Best Practice", + "startLine": 203, + "startColumn": 7, + "endLine": 203, + "endColumn": 27, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'DecimalEquivalent' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", + "message": "Resource 'ValidFargate' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "DecimalEquivalent", + "logicalId": "ValidFargate", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 29, + "startLine": 10, "startColumn": 5, - "endLine": 29, + "endLine": 10, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -2677,19 +3093,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'PlusDecimalEquivalent' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", + "message": "Resource 'ValidFargateSplunk' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "PlusDecimalEquivalent", + "logicalId": "ValidFargateSplunk", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 41, + "startLine": 30, "startColumn": 5, - "endLine": 41, + "endLine": 30, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -2697,19 +3113,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'LeadingZeroEquivalent' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", + "message": "Resource 'NonFargateTask' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "LeadingZeroEquivalent", + "logicalId": "NonFargateTask", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 53, + "startLine": 47, "startColumn": 5, - "endLine": 53, + "endLine": 47, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -2717,19 +3133,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'LeadingDecimalPointEquivalent' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", + "message": "Resource 'FargateNullPC' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "LeadingDecimalPointEquivalent", + "logicalId": "FargateNullPC", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 65, + "startLine": 62, "startColumn": 5, - "endLine": 65, + "endLine": 62, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -2737,193 +3153,238 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'TrailingDecimalPointEquivalent' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", + "message": "Resource 'PayPerRequestTable' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "TrailingDecimalPointEquivalent", + "logicalId": "PayPerRequestTable", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 77, + "startLine": 78, "startColumn": 5, - "endLine": 77, + "endLine": 78, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" - } - ] - }, - "good/ecs_fargate_parameterized_cpu_memory.yaml": { - "filePath": "good/ecs_fargate_parameterized_cpu_memory.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 4, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 29, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "I1022", + "ruleId": "I9040", "severity": "INFO", - "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", - "source": "CFN_LINT", + "message": "Resource 'ProvisionedTable' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "JoinedTask", + "logicalId": "ProvisionedTable", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.Cpu.Fn::Join", - "category": "Intrinsic Function", - "startLine": 66, - "startColumn": 7, - "endLine": 66, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 91, + "startColumn": 5, + "endLine": 91, "endColumn": 15, - "ruleDescription": "Use Sub instead of Join", + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Family' is create-only; updating it will cause resource replacement", + "message": "Resource 'DefaultWithThroughput' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "TaskA", + "logicalId": "DefaultWithThroughput", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.Family", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 29, - "startColumn": 7, - "endLine": 29, - "endColumn": 13, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 107, + "startColumn": 5, + "endLine": 107, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", + "message": "Resource 'FargateIntCpu' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "TaskA", + "logicalId": "FargateIntCpu", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Cpu", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 30, - "startColumn": 7, - "endLine": 30, - "endColumn": 10, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter with AllowedValues" - } + "startLine": 122, + "startColumn": 5, + "endLine": 122, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Memory' is create-only; updating it will cause resource replacement", + "message": "Resource 'CorrelatedFargateThenEc2' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "TaskA", + "logicalId": "CorrelatedFargateThenEc2", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Memory", - "category": "Best Practice", - "startLine": 31, - "startColumn": 7, - "endLine": 31, - "endColumn": 13, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 138, + "startColumn": 5, + "endLine": 138, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", + "message": "Resource 'CorrelatedEc2ThenFargate' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "TaskA", + "logicalId": "CorrelatedEc2ThenFargate", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.NetworkMode", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 32, - "startColumn": 7, - "endLine": 32, - "endColumn": 18, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 150, + "startColumn": 5, + "endLine": 150, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", + "message": "Resource 'CorrelatedProvisionedThenOnDemand' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "TaskA", + "logicalId": "CorrelatedProvisionedThenOnDemand", + "entityType": "Resource", + "resourceType": "AWS::DynamoDB::Table" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 163, + "startColumn": 5, + "endLine": 163, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'CorrelatedOnDemandThenProvisioned' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "CorrelatedOnDemandThenProvisioned", + "entityType": "Resource", + "resourceType": "AWS::DynamoDB::Table" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 174, + "startColumn": 5, + "endLine": 174, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'CorrelatedFargateSizeThenEc2' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "CorrelatedFargateSizeThenEc2", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.RequiresCompatibilities", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 33, - "startColumn": 7, - "endLine": 33, - "endColumn": 30, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 186, + "startColumn": 5, + "endLine": 186, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'CorrelatedEc2SizeThenFargate' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "CorrelatedEc2SizeThenFargate", + "entityType": "Resource", + "resourceType": "AWS::ECS::TaskDefinition" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 198, + "startColumn": 5, + "endLine": 198, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "good/ecs_fargate_decimal_units.yaml": { + "filePath": "good/ecs_fargate_decimal_units.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 7, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 42, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", + "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "TaskA", + "logicalId": "QuarterVcpuDecimal", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.ContainerDefinitions", + "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 34, + "startLine": 6, "startColumn": 7, - "endLine": 34, - "endColumn": 27, + "endLine": 6, + "endColumn": 30, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", @@ -2934,19 +3395,19 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Family' is create-only; updating it will cause resource replacement", + "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "TaskB", + "logicalId": "QuarterVcpuDecimal", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Family", + "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 41, + "startLine": 7, "startColumn": 7, - "endLine": 41, - "endColumn": 13, + "endLine": 7, + "endColumn": 18, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", @@ -2960,22 +3421,21 @@ "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "TaskB", + "logicalId": "QuarterVcpuDecimal", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Cpu", "category": "Best Practice", - "startLine": 42, + "startLine": 8, "startColumn": 7, - "endLine": 42, + "endLine": 8, "endColumn": 10, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter with AllowedValues" + "lifecycle": "create-only" } }, { @@ -2984,15 +3444,15 @@ "message": "Property 'Memory' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "TaskB", + "logicalId": "QuarterVcpuDecimal", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Memory", "category": "Best Practice", - "startLine": 43, + "startLine": 9, "startColumn": 7, - "endLine": 43, + "endLine": 9, "endColumn": 13, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -3004,19 +3464,19 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", + "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "TaskB", + "logicalId": "QuarterVcpuDecimal", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.NetworkMode", + "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 44, + "startLine": 10, "startColumn": 7, - "endLine": 44, - "endColumn": 18, + "endLine": 10, + "endColumn": 27, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", @@ -3030,15 +3490,15 @@ "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "TaskB", + "logicalId": "HalfVcpuDecimal", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 45, + "startLine": 18, "startColumn": 7, - "endLine": 45, + "endLine": 18, "endColumn": 30, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -3050,19 +3510,19 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", + "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "TaskB", + "logicalId": "HalfVcpuDecimal", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.ContainerDefinitions", + "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 46, + "startLine": 19, "startColumn": 7, - "endLine": 46, - "endColumn": 27, + "endLine": 19, + "endColumn": 18, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", @@ -3073,19 +3533,19 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Family' is create-only; updating it will cause resource replacement", + "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MappedTask", + "logicalId": "HalfVcpuDecimal", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Family", + "propertyPath": "Properties.Cpu", "category": "Best Practice", - "startLine": 53, + "startLine": 20, "startColumn": 7, - "endLine": 53, - "endColumn": 13, + "endLine": 20, + "endColumn": 10, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", @@ -3096,67 +3556,65 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", + "message": "Property 'Memory' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MappedTask", + "logicalId": "HalfVcpuDecimal", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Cpu", + "propertyPath": "Properties.Memory", "category": "Best Practice", - "startLine": 54, + "startLine": 21, "startColumn": 7, - "endLine": 54, - "endColumn": 10, + "endLine": 21, + "endColumn": 13, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter with AllowedValues" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Memory' is create-only; updating it will cause resource replacement", + "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MappedTask", + "logicalId": "HalfVcpuDecimal", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Memory", + "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 55, + "startLine": 22, "startColumn": 7, - "endLine": 55, - "endColumn": 13, + "endLine": 22, + "endColumn": 27, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter with AllowedValues" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", + "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MappedTask", + "logicalId": "DecimalEquivalent", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.NetworkMode", + "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 56, + "startLine": 30, "startColumn": 7, - "endLine": 56, - "endColumn": 18, + "endLine": 30, + "endColumn": 30, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", @@ -3167,19 +3625,19 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", + "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MappedTask", + "logicalId": "DecimalEquivalent", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.RequiresCompatibilities", + "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 57, + "startLine": 31, "startColumn": 7, - "endLine": 57, - "endColumn": 30, + "endLine": 31, + "endColumn": 18, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", @@ -3190,19 +3648,19 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", + "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MappedTask", + "logicalId": "DecimalEquivalent", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.ContainerDefinitions", + "propertyPath": "Properties.Cpu", "category": "Best Practice", - "startLine": 58, + "startLine": 32, "startColumn": 7, - "endLine": 58, - "endColumn": 27, + "endLine": 32, + "endColumn": 10, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", @@ -3213,18 +3671,18 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Family' is create-only; updating it will cause resource replacement", + "message": "Property 'Memory' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "JoinedTask", + "logicalId": "DecimalEquivalent", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Family", + "propertyPath": "Properties.Memory", "category": "Best Practice", - "startLine": 65, + "startLine": 33, "startColumn": 7, - "endLine": 65, + "endLine": 33, "endColumn": 13, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -3236,43 +3694,42 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", + "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "JoinedTask", + "logicalId": "DecimalEquivalent", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Cpu", + "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 66, + "startLine": 34, "startColumn": 7, - "endLine": 66, - "endColumn": 10, + "endLine": 34, + "endColumn": 27, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter with AllowedValues" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Memory' is create-only; updating it will cause resource replacement", + "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "JoinedTask", + "logicalId": "PlusDecimalEquivalent", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Memory", + "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 67, + "startLine": 42, "startColumn": 7, - "endLine": 67, - "endColumn": 13, + "endLine": 42, + "endColumn": 30, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", @@ -3286,15 +3743,15 @@ "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "JoinedTask", + "logicalId": "PlusDecimalEquivalent", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 68, + "startLine": 43, "startColumn": 7, - "endLine": 68, + "endLine": 43, "endColumn": 18, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -3306,19 +3763,19 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", + "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "JoinedTask", + "logicalId": "PlusDecimalEquivalent", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.RequiresCompatibilities", + "propertyPath": "Properties.Cpu", "category": "Best Practice", - "startLine": 69, + "startLine": 44, "startColumn": 7, - "endLine": 69, - "endColumn": 30, + "endLine": 44, + "endColumn": 10, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", @@ -3329,19 +3786,19 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", + "message": "Property 'Memory' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "JoinedTask", + "logicalId": "PlusDecimalEquivalent", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.ContainerDefinitions", + "propertyPath": "Properties.Memory", "category": "Best Practice", - "startLine": 70, + "startLine": 45, "startColumn": 7, - "endLine": 70, - "endColumn": 27, + "endLine": 45, + "endColumn": 13, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", @@ -3349,121 +3806,22 @@ "lifecycle": "create-only" } }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'TaskA' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "TaskA", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 28, - "startColumn": 5, - "endLine": 28, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'TaskB' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "TaskB", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 40, - "startColumn": 5, - "endLine": 40, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'MappedTask' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "MappedTask", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 52, - "startColumn": 5, - "endLine": 52, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'JoinedTask' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "JoinedTask", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 64, - "startColumn": 5, - "endLine": 64, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "good/ecs_fargate_units_and_sizes.yaml": { - "filePath": "good/ecs_fargate_units_and_sizes.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 7, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 43, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Family' is create-only; updating it will cause resource replacement", + "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "QuarterVcpuHalfGb", + "logicalId": "PlusDecimalEquivalent", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Family", + "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 8, + "startLine": 46, "startColumn": 7, - "endLine": 8, - "endColumn": 13, + "endLine": 46, + "endColumn": 27, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", @@ -3477,15 +3835,15 @@ "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "QuarterVcpuHalfGb", + "logicalId": "LeadingZeroEquivalent", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 9, + "startLine": 54, "startColumn": 7, - "endLine": 9, + "endLine": 54, "endColumn": 30, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -3500,15 +3858,15 @@ "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "QuarterVcpuHalfGb", + "logicalId": "LeadingZeroEquivalent", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 10, + "startLine": 55, "startColumn": 7, - "endLine": 10, + "endLine": 55, "endColumn": 18, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -3523,15 +3881,15 @@ "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "QuarterVcpuHalfGb", + "logicalId": "LeadingZeroEquivalent", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Cpu", "category": "Best Practice", - "startLine": 11, + "startLine": 56, "startColumn": 7, - "endLine": 11, + "endLine": 56, "endColumn": 10, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -3546,15 +3904,15 @@ "message": "Property 'Memory' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "QuarterVcpuHalfGb", + "logicalId": "LeadingZeroEquivalent", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Memory", "category": "Best Practice", - "startLine": 12, + "startLine": 57, "startColumn": 7, - "endLine": 12, + "endLine": 57, "endColumn": 13, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -3569,15 +3927,15 @@ "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "QuarterVcpuHalfGb", + "logicalId": "LeadingZeroEquivalent", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 16, + "startLine": 58, "startColumn": 7, - "endLine": 16, + "endLine": 58, "endColumn": 27, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -3589,41 +3947,18 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Family' is create-only; updating it will cause resource replacement", + "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "EightVcpuSixtyGb", + "logicalId": "LeadingDecimalPointEquivalent", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Family", + "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 24, + "startLine": 66, "startColumn": 7, - "endLine": 24, - "endColumn": 13, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "EightVcpuSixtyGb", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.RequiresCompatibilities", - "category": "Best Practice", - "startLine": 25, - "startColumn": 7, - "endLine": 25, + "endLine": 66, "endColumn": 30, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -3638,15 +3973,15 @@ "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "EightVcpuSixtyGb", + "logicalId": "LeadingDecimalPointEquivalent", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 26, + "startLine": 67, "startColumn": 7, - "endLine": 26, + "endLine": 67, "endColumn": 18, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -3661,15 +3996,15 @@ "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "EightVcpuSixtyGb", + "logicalId": "LeadingDecimalPointEquivalent", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Cpu", "category": "Best Practice", - "startLine": 27, + "startLine": 68, "startColumn": 7, - "endLine": 27, + "endLine": 68, "endColumn": 10, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -3684,15 +4019,15 @@ "message": "Property 'Memory' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "EightVcpuSixtyGb", + "logicalId": "LeadingDecimalPointEquivalent", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Memory", "category": "Best Practice", - "startLine": 28, + "startLine": 69, "startColumn": 7, - "endLine": 28, + "endLine": 69, "endColumn": 13, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -3707,15 +4042,15 @@ "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "EightVcpuSixtyGb", + "logicalId": "LeadingDecimalPointEquivalent", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 32, + "startLine": 70, "startColumn": 7, - "endLine": 32, + "endLine": 70, "endColumn": 27, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -3724,44 +4059,21 @@ "lifecycle": "create-only" } }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Family' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "SixteenVcpuFortyGb", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.Family", - "category": "Best Practice", - "startLine": 40, - "startColumn": 7, - "endLine": 40, - "endColumn": 13, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, { "ruleId": "I9001", "severity": "INFO", "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SixteenVcpuFortyGb", + "logicalId": "TrailingDecimalPointEquivalent", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 41, + "startLine": 78, "startColumn": 7, - "endLine": 41, + "endLine": 78, "endColumn": 30, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -3776,15 +4088,15 @@ "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SixteenVcpuFortyGb", + "logicalId": "TrailingDecimalPointEquivalent", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 42, + "startLine": 79, "startColumn": 7, - "endLine": 42, + "endLine": 79, "endColumn": 18, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -3799,15 +4111,15 @@ "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SixteenVcpuFortyGb", + "logicalId": "TrailingDecimalPointEquivalent", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Cpu", "category": "Best Practice", - "startLine": 43, + "startLine": 80, "startColumn": 7, - "endLine": 43, + "endLine": 80, "endColumn": 10, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -3822,15 +4134,15 @@ "message": "Property 'Memory' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SixteenVcpuFortyGb", + "logicalId": "TrailingDecimalPointEquivalent", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Memory", "category": "Best Practice", - "startLine": 44, + "startLine": 81, "startColumn": 7, - "endLine": 44, + "endLine": 81, "endColumn": 13, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -3845,15 +4157,15 @@ "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SixteenVcpuFortyGb", + "logicalId": "TrailingDecimalPointEquivalent", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 48, + "startLine": 82, "startColumn": 7, - "endLine": 48, + "endLine": 82, "endColumn": 27, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -3863,205 +4175,199 @@ } }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Family' is create-only; updating it will cause resource replacement", + "message": "Resource 'QuarterVcpuDecimal' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ThirtyTwoVcpuSixtyGb", + "logicalId": "QuarterVcpuDecimal", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Family", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 56, - "startColumn": 7, - "endLine": 56, - "endColumn": 13, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", + "message": "Resource 'HalfVcpuDecimal' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ThirtyTwoVcpuSixtyGb", + "logicalId": "HalfVcpuDecimal", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.RequiresCompatibilities", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 57, - "startColumn": 7, - "endLine": 57, - "endColumn": 30, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 17, + "startColumn": 5, + "endLine": 17, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", + "message": "Resource 'DecimalEquivalent' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ThirtyTwoVcpuSixtyGb", + "logicalId": "DecimalEquivalent", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.NetworkMode", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 58, - "startColumn": 7, - "endLine": 58, - "endColumn": 18, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 29, + "startColumn": 5, + "endLine": 29, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", + "message": "Resource 'PlusDecimalEquivalent' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ThirtyTwoVcpuSixtyGb", + "logicalId": "PlusDecimalEquivalent", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Cpu", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 59, - "startColumn": 7, - "endLine": 59, - "endColumn": 10, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 41, + "startColumn": 5, + "endLine": 41, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Memory' is create-only; updating it will cause resource replacement", + "message": "Resource 'LeadingZeroEquivalent' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ThirtyTwoVcpuSixtyGb", + "logicalId": "LeadingZeroEquivalent", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Memory", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 60, - "startColumn": 7, - "endLine": 60, - "endColumn": 13, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 53, + "startColumn": 5, + "endLine": 53, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", + "message": "Resource 'LeadingDecimalPointEquivalent' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ThirtyTwoVcpuSixtyGb", + "logicalId": "LeadingDecimalPointEquivalent", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.ContainerDefinitions", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 64, - "startColumn": 7, - "endLine": 64, - "endColumn": 27, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 65, + "startColumn": 5, + "endLine": 65, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Family' is create-only; updating it will cause resource replacement", + "message": "Resource 'TrailingDecimalPointEquivalent' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ThirtyTwoVcpuOneTwentyGb", + "logicalId": "TrailingDecimalPointEquivalent", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Family", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 72, - "startColumn": 7, - "endLine": 72, - "endColumn": 13, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 77, + "startColumn": 5, + "endLine": 77, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "good/ecs_fargate_parameterized_cpu_memory.yaml": { + "filePath": "good/ecs_fargate_parameterized_cpu_memory.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 4, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 29, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9001", + "ruleId": "I1022", "severity": "INFO", - "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", + "source": "CFN_LINT", "entity": { - "logicalId": "ThirtyTwoVcpuOneTwentyGb", + "logicalId": "JoinedTask", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.RequiresCompatibilities", - "category": "Best Practice", - "startLine": 73, + "propertyPath": "Properties.Cpu.Fn::Join", + "category": "Intrinsic Function", + "startLine": 66, "startColumn": 7, - "endLine": 73, - "endColumn": 30, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "endLine": 66, + "endColumn": 15, + "ruleDescription": "Use Sub instead of Join", + "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", + "message": "Property 'Family' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ThirtyTwoVcpuOneTwentyGb", + "logicalId": "TaskA", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.NetworkMode", + "propertyPath": "Properties.Family", "category": "Best Practice", - "startLine": 74, + "startLine": 29, "startColumn": 7, - "endLine": 74, - "endColumn": 18, + "endLine": 29, + "endColumn": 13, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", @@ -4075,21 +4381,22 @@ "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ThirtyTwoVcpuOneTwentyGb", + "logicalId": "TaskA", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Cpu", "category": "Best Practice", - "startLine": 75, + "startLine": 30, "startColumn": 7, - "endLine": 75, + "endLine": 30, "endColumn": 10, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "parameter with AllowedValues" } }, { @@ -4098,15 +4405,15 @@ "message": "Property 'Memory' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ThirtyTwoVcpuOneTwentyGb", + "logicalId": "TaskA", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Memory", "category": "Best Practice", - "startLine": 76, + "startLine": 31, "startColumn": 7, - "endLine": 76, + "endLine": 31, "endColumn": 13, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -4118,19 +4425,19 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", + "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ThirtyTwoVcpuOneTwentyGb", + "logicalId": "TaskA", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.ContainerDefinitions", + "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 80, + "startLine": 32, "startColumn": 7, - "endLine": 80, - "endColumn": 27, + "endLine": 32, + "endColumn": 18, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", @@ -4141,19 +4448,19 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Family' is create-only; updating it will cause resource replacement", + "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ThirtyTwoVcpuTwoFortyFourGb", + "logicalId": "TaskA", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Family", + "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 88, + "startLine": 33, "startColumn": 7, - "endLine": 88, - "endColumn": 13, + "endLine": 33, + "endColumn": 30, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", @@ -4164,19 +4471,19 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", + "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ThirtyTwoVcpuTwoFortyFourGb", + "logicalId": "TaskA", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.RequiresCompatibilities", + "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 89, + "startLine": 34, "startColumn": 7, - "endLine": 89, - "endColumn": 30, + "endLine": 34, + "endColumn": 27, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", @@ -4187,19 +4494,19 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", + "message": "Property 'Family' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ThirtyTwoVcpuTwoFortyFourGb", + "logicalId": "TaskB", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.NetworkMode", + "propertyPath": "Properties.Family", "category": "Best Practice", - "startLine": 90, + "startLine": 41, "startColumn": 7, - "endLine": 90, - "endColumn": 18, + "endLine": 41, + "endColumn": 13, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", @@ -4213,21 +4520,22 @@ "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ThirtyTwoVcpuTwoFortyFourGb", + "logicalId": "TaskB", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Cpu", "category": "Best Practice", - "startLine": 91, + "startLine": 42, "startColumn": 7, - "endLine": 91, + "endLine": 42, "endColumn": 10, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "parameter with AllowedValues" } }, { @@ -4236,15 +4544,15 @@ "message": "Property 'Memory' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ThirtyTwoVcpuTwoFortyFourGb", + "logicalId": "TaskB", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Memory", "category": "Best Practice", - "startLine": 92, + "startLine": 43, "startColumn": 7, - "endLine": 92, + "endLine": 43, "endColumn": 13, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -4256,19 +4564,19 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", + "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ThirtyTwoVcpuTwoFortyFourGb", + "logicalId": "TaskB", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.ContainerDefinitions", + "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 96, + "startLine": 44, "startColumn": 7, - "endLine": 96, - "endColumn": 27, + "endLine": 44, + "endColumn": 18, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", @@ -4279,19 +4587,19 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Family' is create-only; updating it will cause resource replacement", + "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConditionalRequiredProperties", + "logicalId": "TaskB", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Family", + "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 105, + "startLine": 45, "startColumn": 7, - "endLine": 105, - "endColumn": 13, + "endLine": 45, + "endColumn": 30, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", @@ -4302,19 +4610,19 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", + "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConditionalRequiredProperties", + "logicalId": "TaskB", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.RequiresCompatibilities", + "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 106, + "startLine": 46, "startColumn": 7, - "endLine": 106, - "endColumn": 30, + "endLine": 46, + "endColumn": 27, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", @@ -4325,25 +4633,24 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", + "message": "Property 'Family' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConditionalRequiredProperties", + "logicalId": "MappedTask", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.NetworkMode", + "propertyPath": "Properties.Family", "category": "Best Practice", - "startLine": 107, + "startLine": 53, "startColumn": 7, - "endLine": 107, - "endColumn": 18, + "endLine": 53, + "endColumn": 13, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Fn::If on condition 'UseAlternateSize'" + "lifecycle": "create-only" } }, { @@ -4352,22 +4659,22 @@ "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConditionalRequiredProperties", + "logicalId": "MappedTask", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Cpu", "category": "Best Practice", - "startLine": 108, + "startLine": 54, "startColumn": 7, - "endLine": 108, + "endLine": 54, "endColumn": 10, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "Fn::If on condition 'UseAlternateSize'" + "resolutionSource": "parameter with AllowedValues" } }, { @@ -4376,105 +4683,108 @@ "message": "Property 'Memory' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConditionalRequiredProperties", + "logicalId": "MappedTask", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Memory", "category": "Best Practice", - "startLine": 109, + "startLine": 55, "startColumn": 7, - "endLine": 109, + "endLine": 55, "endColumn": 13, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "Fn::If on condition 'UseAlternateSize'" + "resolutionSource": "parameter with AllowedValues" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'PlacementConstraints' is create-only; updating it will cause resource replacement", + "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConditionalRequiredProperties", + "logicalId": "MappedTask", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.PlacementConstraints", + "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 110, + "startLine": 56, "startColumn": 7, - "endLine": 110, - "endColumn": 27, + "endLine": 56, + "endColumn": 18, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Fn::If on condition 'UseAlternateSize'" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", + "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConditionalRequiredProperties", + "logicalId": "MappedTask", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.ContainerDefinitions", + "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 114, + "startLine": 57, "startColumn": 7, - "endLine": 114, - "endColumn": 27, + "endLine": 57, + "endColumn": 30, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "MappedTask", + "entityType": "Resource", + "resourceType": "AWS::ECS::TaskDefinition" + }, + "propertyPath": "Properties.ContainerDefinitions", + "category": "Best Practice", + "startLine": 58, + "startColumn": 7, + "endLine": 58, + "endColumn": 27, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only" } - } - ] - }, - "good/ecs_fargate_valid.yaml": { - "filePath": "good/ecs_fargate_valid.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 7, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { "ruleId": "I9001", "severity": "INFO", "message": "Property 'Family' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "TaskDef", + "logicalId": "JoinedTask", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Family", "category": "Best Practice", - "startLine": 6, + "startLine": 65, "startColumn": 7, - "endLine": 6, + "endLine": 65, "endColumn": 13, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -4489,21 +4799,22 @@ "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "TaskDef", + "logicalId": "JoinedTask", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Cpu", "category": "Best Practice", - "startLine": 7, + "startLine": 66, "startColumn": 7, - "endLine": 7, + "endLine": 66, "endColumn": 10, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "parameter with AllowedValues" } }, { @@ -4512,15 +4823,15 @@ "message": "Property 'Memory' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "TaskDef", + "logicalId": "JoinedTask", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Memory", "category": "Best Practice", - "startLine": 8, + "startLine": 67, "startColumn": 7, - "endLine": 8, + "endLine": 67, "endColumn": 13, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -4535,15 +4846,15 @@ "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "TaskDef", + "logicalId": "JoinedTask", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 9, + "startLine": 68, "startColumn": 7, - "endLine": 9, + "endLine": 68, "endColumn": 18, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -4558,15 +4869,15 @@ "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "TaskDef", + "logicalId": "JoinedTask", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 10, + "startLine": 69, "startColumn": 7, - "endLine": 10, + "endLine": 69, "endColumn": 30, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -4581,15 +4892,15 @@ "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "TaskDef", + "logicalId": "JoinedTask", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 12, + "startLine": 70, "startColumn": 7, - "endLine": 12, + "endLine": 70, "endColumn": 27, "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", @@ -4601,74 +4912,95 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'TaskDef' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", + "message": "Resource 'TaskA' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "TaskDef", + "logicalId": "TaskA", "entityType": "Resource", "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 5, + "startLine": 28, "startColumn": 5, - "endLine": 5, + "endLine": 28, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" - } - ] - }, - "good/elb_https_empty_sslcertificateid.yaml": { - "filePath": "good/elb_https_empty_sslcertificateid.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 1, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'ELB' of type 'AWS::ElasticLoadBalancing::LoadBalancer' supports Tags but none are configured", + "message": "Resource 'TaskB' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ELB", + "logicalId": "TaskB", "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancing::LoadBalancer" + "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 7, + "startLine": 40, "startColumn": 5, - "endLine": 7, + "endLine": 40, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'MappedTask' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "MappedTask", + "entityType": "Resource", + "resourceType": "AWS::ECS::TaskDefinition" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 52, + "startColumn": 5, + "endLine": 52, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'JoinedTask' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "JoinedTask", + "entityType": "Resource", + "resourceType": "AWS::ECS::TaskDefinition" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 64, + "startColumn": 5, + "endLine": 64, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "good/enum_case_insensitive_casing.yaml": { - "filePath": "good/enum_case_insensitive_casing.yaml", + "good/ecs_fargate_units_and_sizes.yaml": { + "filePath": "good/ecs_fargate_units_and_sizes.yaml", "status": "OK", "metadata": { - "resourcesScanned": 2, + "resourcesScanned": 7, "counts": { "fatal": 0, "errors": 0, "warnings": 0, - "informational": 6, + "informational": 43, "debug": 0 }, "suppressed": 0, @@ -4679,19 +5011,20 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Type' is create-only; updating it will cause resource replacement", + "message": "Property 'Family' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "LowercaseType", + "logicalId": "QuarterVcpuHalfGb", "entityType": "Resource", - "resourceType": "AWS::Batch::ComputeEnvironment" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Type", + "propertyPath": "Properties.Family", "category": "Best Practice", - "startLine": 13, + "startLine": 8, "startColumn": 7, - "endLine": 13, - "endColumn": 11, + "endLine": 8, + "endColumn": 13, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -4701,63 +5034,66 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ComputeResources.Subnets' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "LowercaseType", + "logicalId": "QuarterVcpuHalfGb", "entityType": "Resource", - "resourceType": "AWS::Batch::ComputeEnvironment" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.ComputeResources.Subnets", + "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 16, - "startColumn": 9, - "endLine": 16, - "endColumn": 16, + "startLine": 9, + "startColumn": 7, + "endLine": 9, + "endColumn": 30, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ComputeResources.Type' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "LowercaseType", + "logicalId": "QuarterVcpuHalfGb", "entityType": "Resource", - "resourceType": "AWS::Batch::ComputeEnvironment" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.ComputeResources.Type", + "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 18, - "startColumn": 9, - "endLine": 18, - "endColumn": 13, + "startLine": 10, + "startColumn": 7, + "endLine": 10, + "endColumn": 18, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Tags' is create-only; updating it will cause resource replacement", + "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "LowercaseType", + "logicalId": "QuarterVcpuHalfGb", "entityType": "Resource", - "resourceType": "AWS::Batch::ComputeEnvironment" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Tags", + "propertyPath": "Properties.Cpu", "category": "Best Practice", - "startLine": 20, + "startLine": 11, "startColumn": 7, - "endLine": 20, - "endColumn": 11, + "endLine": 11, + "endColumn": 10, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -4767,19 +5103,20 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Type' is create-only; updating it will cause resource replacement", + "message": "Property 'Memory' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MixedCaseType", + "logicalId": "QuarterVcpuHalfGb", "entityType": "Resource", - "resourceType": "AWS::Batch::ComputeEnvironment" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Type", + "propertyPath": "Properties.Memory", "category": "Best Practice", - "startLine": 25, + "startLine": 12, "startColumn": 7, - "endLine": 25, - "endColumn": 11, + "endLine": 12, + "endColumn": 13, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -4789,60 +5126,43 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Tags' is create-only; updating it will cause resource replacement", + "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MixedCaseType", + "logicalId": "QuarterVcpuHalfGb", "entityType": "Resource", - "resourceType": "AWS::Batch::ComputeEnvironment" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Tags", + "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 27, + "startLine": 16, "startColumn": 7, - "endLine": 27, - "endColumn": 11, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", + "endLine": 16, + "endColumn": 27, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", "context": { "lifecycle": "create-only" } - } - ] - }, - "good/functions/dynamic_reference_embedded.yaml": { - "filePath": "good/functions/dynamic_reference_embedded.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 4, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 8, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", + "message": "Property 'Family' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Sg", + "logicalId": "EightVcpuSixtyGb", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.GroupDescription", + "propertyPath": "Properties.Family", "category": "Best Practice", - "startLine": 11, + "startLine": 24, "startColumn": 7, - "endLine": 11, - "endColumn": 23, + "endLine": 24, + "endColumn": 13, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -4852,543 +5172,457 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'GroupName' is create-only; updating it will cause resource replacement", + "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Sg", + "logicalId": "EightVcpuSixtyGb", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.GroupName", + "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 12, + "startLine": 25, "startColumn": 7, - "endLine": 12, - "endColumn": 16, + "endLine": 25, + "endColumn": 30, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "dynamic (dynamic reference: prefix-{{resolve:ssm:/network/sg-name}})" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", + "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Bucket", + "logicalId": "EightVcpuSixtyGb", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.BucketName", + "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 19, + "startLine": 26, "startColumn": 7, - "endLine": 19, - "endColumn": 17, + "endLine": 26, + "endColumn": 18, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "dynamic (dynamic reference: {{resolve:ssm:/config/bucket-name}})" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Instance", + "logicalId": "EightVcpuSixtyGb", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Properties.Cpu", "category": "Best Practice", - "startLine": 34, + "startLine": 27, "startColumn": 7, - "endLine": 34, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 27, + "endColumn": 10, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "dynamic (dynamic reference: prefix-{{resolve:ssm:/ec2/ami-id}})" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'Memory' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Instance", + "logicalId": "EightVcpuSixtyGb", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.InstanceType", + "propertyPath": "Properties.Memory", "category": "Best Practice", - "startLine": 35, + "startLine": 28, "startColumn": 7, - "endLine": 35, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 28, + "endColumn": 13, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only" } }, { - "ruleId": "I9003", - "severity": "INFO", - "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", - "source": "ENGINE", - "category": "Best Practice", - "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", - "phase": "LINT" - }, - { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'ScheduledRule' of type 'AWS::Events::Rule' supports Tags but none are configured", + "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ScheduledRule", + "logicalId": "EightVcpuSixtyGb", "entityType": "Resource", - "resourceType": "AWS::Events::Rule" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 25, - "startColumn": 5, - "endLine": 25, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 32, + "startColumn": 7, + "endLine": 32, + "endColumn": 27, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'Instance' of type 'AWS::EC2::Instance' supports Tags but none are configured", + "message": "Property 'Family' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Instance", + "logicalId": "SixteenVcpuFortyGb", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.Family", "category": "Best Practice", - "startLine": 33, - "startColumn": 5, - "endLine": 33, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "good/functions/foreach.yaml": { - "filePath": "good/functions/foreach.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 3, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 3, - "debug": 0 + "startLine": 40, + "startColumn": 7, + "endLine": 40, + "endColumn": 13, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'S3BucketA' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "S3BucketA", + "logicalId": "SixteenVcpuFortyGb", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 10, - "startColumn": 1, - "endLine": 10, - "endColumn": 10, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 41, + "startColumn": 7, + "endLine": 41, + "endColumn": 30, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'S3BucketB' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "S3BucketB", + "logicalId": "SixteenVcpuFortyGb", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 10, - "startColumn": 1, - "endLine": 10, - "endColumn": 10, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 42, + "startColumn": 7, + "endLine": 42, + "endColumn": 18, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'S3BucketC' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "S3BucketC", + "logicalId": "SixteenVcpuFortyGb", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.Cpu", "category": "Best Practice", - "startLine": 10, - "startColumn": 1, - "endLine": 10, + "startLine": 43, + "startColumn": 7, + "endLine": 43, "endColumn": 10, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "good/functions/get_stack_output.yaml": { - "filePath": "good/functions/get_stack_output.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 10, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 10, - "debug": 0 + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'Topic1' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Property 'Memory' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Topic1", + "logicalId": "SixteenVcpuFortyGb", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.Memory", "category": "Best Practice", - "startLine": 15, - "startColumn": 5, - "endLine": 15, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 44, + "startColumn": 7, + "endLine": 44, + "endColumn": 13, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'Topic2' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Topic2", + "logicalId": "SixteenVcpuFortyGb", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 23, - "startColumn": 5, - "endLine": 23, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 48, + "startColumn": 7, + "endLine": 48, + "endColumn": 27, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'Topic3' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Property 'Family' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Topic3", + "logicalId": "ThirtyTwoVcpuSixtyGb", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.Family", "category": "Best Practice", - "startLine": 33, - "startColumn": 5, - "endLine": 33, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 56, + "startColumn": 7, + "endLine": 56, + "endColumn": 13, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'Topic4' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Topic4", + "logicalId": "ThirtyTwoVcpuSixtyGb", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 44, - "startColumn": 5, - "endLine": 44, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 57, + "startColumn": 7, + "endLine": 57, + "endColumn": 30, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'Topic5' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Topic5", + "logicalId": "ThirtyTwoVcpuSixtyGb", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 55, - "startColumn": 5, - "endLine": 55, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 58, + "startColumn": 7, + "endLine": 58, + "endColumn": 18, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'Topic6' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Topic6", + "logicalId": "ThirtyTwoVcpuSixtyGb", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.Cpu", "category": "Best Practice", - "startLine": 65, - "startColumn": 5, - "endLine": 65, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 59, + "startColumn": 7, + "endLine": 59, + "endColumn": 10, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'Topic7' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Property 'Memory' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Topic7", + "logicalId": "ThirtyTwoVcpuSixtyGb", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.Memory", "category": "Best Practice", - "startLine": 74, - "startColumn": 5, - "endLine": 74, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 60, + "startColumn": 7, + "endLine": 60, + "endColumn": 13, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'Topic8' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Topic8", + "logicalId": "ThirtyTwoVcpuSixtyGb", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 83, - "startColumn": 5, - "endLine": 83, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 64, + "startColumn": 7, + "endLine": 64, + "endColumn": 27, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'Topic9' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Property 'Family' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Topic9", + "logicalId": "ThirtyTwoVcpuOneTwentyGb", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.Family", "category": "Best Practice", - "startLine": 95, - "startColumn": 5, - "endLine": 95, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 72, + "startColumn": 7, + "endLine": 72, + "endColumn": 13, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'Topic10' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Topic10", + "logicalId": "ThirtyTwoVcpuOneTwentyGb", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 106, - "startColumn": 5, - "endLine": 106, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "good/functions/ref.yaml": { - "filePath": "good/functions/ref.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 0, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [] - }, - "good/functions/relationship_conditions.yaml": { - "filePath": "good/functions/relationship_conditions.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 3, - "counts": { - "fatal": 1, - "errors": 1, - "warnings": 0, - "informational": 4, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "F3003", - "severity": "FATAL", - "message": "'Role' is a required property", - "source": "SCHEMA", - "entity": { - "logicalId": "AMIIDLookup", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "Properties", - "suggestedFix": "Add the required property 'Role'", - "category": "Schema", - "startLine": 36, - "startColumn": 5, - "endLine": 36, - "endColumn": 15, - "conditionScenario": { - "isPrimary": false - }, - "ruleDescription": "Required property missing", - "phase": "SCHEMA" - }, - { - "ruleId": "E2533", - "severity": "ERROR", - "message": "Runtime 'nodejs4.3' was deprecated on '2020-03-05'. Creation was disabled on '2020-02-03', and updates were disabled on '2020-03-05'. Please consider updating to 'nodejs24.x'", - "source": "CFN_LINT", - "entity": { - "logicalId": "AMIIDLookup", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 46, + "startLine": 73, "startColumn": 7, - "endLine": 46, - "endColumn": 14, - "ruleDescription": "Check if Lambda Function Runtimes are updatable", + "endLine": 73, + "endColumn": 30, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "actualValue": "nodejs4.3", - "lifecycle": "end-of-life" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Path' is create-only; updating it will cause resource replacement", + "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "LambdaExecutionRole", + "logicalId": "ThirtyTwoVcpuOneTwentyGb", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Path", + "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 26, + "startLine": 74, "startColumn": 7, - "endLine": 26, - "endColumn": 11, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "endLine": 74, + "endColumn": 18, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -5398,19 +5632,20 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Path' is create-only; updating it will cause resource replacement", + "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "InstanceProfile", + "logicalId": "ThirtyTwoVcpuOneTwentyGb", "entityType": "Resource", - "resourceType": "AWS::IAM::InstanceProfile" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Path", + "propertyPath": "Properties.Cpu", "category": "Best Practice", - "startLine": 31, + "startLine": 75, "startColumn": 7, - "endLine": 31, - "endColumn": 11, + "endLine": 75, + "endColumn": 10, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -5418,229 +5653,160 @@ } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'LambdaExecutionRole' of type 'AWS::IAM::Role' supports Tags but none are configured", + "message": "Property 'Memory' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "LambdaExecutionRole", + "logicalId": "ThirtyTwoVcpuOneTwentyGb", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.Memory", "category": "Best Practice", - "startLine": 14, - "startColumn": 5, - "endLine": 14, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 76, + "startColumn": 7, + "endLine": 76, + "endColumn": 13, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'AMIIDLookup' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "AMIIDLookup", + "logicalId": "ThirtyTwoVcpuOneTwentyGb", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 36, - "startColumn": 5, - "endLine": 36, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "good/functions/relationship_conditions_sam.yaml": { - "filePath": "good/functions/relationship_conditions_sam.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 3, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 1, - "informational": 4, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "W2531", - "severity": "WARN", - "message": "Runtime 'provided.al2' was deprecated on '2026-07-31'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'provided.al2023'", - "source": "CFN_LINT", - "entity": { - "logicalId": "FunctionC", - "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" - }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 36, + "startLine": 80, "startColumn": 7, - "endLine": 36, - "endColumn": 14, - "ruleDescription": "Check if EOL Lambda Function Runtimes are used", + "endLine": 80, + "endColumn": 27, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "actualValue": "provided.al2", - "lifecycle": "deprecated" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ApplicationId' is create-only; updating it will cause resource replacement", + "message": "Property 'Family' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConfigEnvironment", + "logicalId": "ThirtyTwoVcpuTwoFortyFourGb", "entityType": "Resource", - "resourceType": "AWS::AppConfig::Environment" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.ApplicationId", + "propertyPath": "Properties.Family", "category": "Best Practice", - "startLine": 31, + "startLine": 88, "startColumn": 7, - "endLine": 31, - "endColumn": 20, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-appconfig.git", + "endLine": 88, + "endColumn": 13, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'ConfigApplication'" + "lifecycle": "create-only" } }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'ConfigApplication' of type 'AWS::AppConfig::Application' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "ConfigApplication", - "entityType": "Resource", - "resourceType": "AWS::AppConfig::Application" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 25, - "startColumn": 5, - "endLine": 25, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'ConfigEnvironment' of type 'AWS::AppConfig::Environment' supports Tags but none are configured", + "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConfigEnvironment", + "logicalId": "ThirtyTwoVcpuTwoFortyFourGb", "entityType": "Resource", - "resourceType": "AWS::AppConfig::Environment" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 30, - "startColumn": 5, - "endLine": 30, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 89, + "startColumn": 7, + "endLine": 89, + "endColumn": 30, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'FunctionC' of type 'AWS::Serverless::Function' supports Tags but none are configured", + "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FunctionC", + "logicalId": "ThirtyTwoVcpuTwoFortyFourGb", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 35, - "startColumn": 5, - "endLine": 35, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "good/functions/select_string_index.yaml": { - "filePath": "good/functions/select_string_index.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 3, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 10, - "debug": 0 + "startLine": 90, + "startColumn": 7, + "endLine": 90, + "endColumn": 18, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SubnetA", + "logicalId": "ThirtyTwoVcpuTwoFortyFourGb", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.Cpu", "category": "Best Practice", - "startLine": 10, + "startLine": 91, "startColumn": 7, - "endLine": 10, - "endColumn": 12, + "endLine": 91, + "endColumn": 10, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'Vpc'" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Property 'Memory' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SubnetA", + "logicalId": "ThirtyTwoVcpuTwoFortyFourGb", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Properties.Memory", "category": "Best Practice", - "startLine": 11, + "startLine": 92, "startColumn": 7, - "endLine": 11, - "endColumn": 16, + "endLine": 92, + "endColumn": 13, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -5650,65 +5816,66 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", + "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SubnetA", + "logicalId": "ThirtyTwoVcpuTwoFortyFourGb", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.AvailabilityZone", + "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 12, + "startLine": 96, "startColumn": 7, - "endLine": 12, - "endColumn": 23, + "endLine": 96, + "endColumn": 27, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "dynamic (Select on non-list value)" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "message": "Property 'Family' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SubnetB", + "logicalId": "ConditionalRequiredProperties", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.Family", "category": "Best Practice", - "startLine": 19, + "startLine": 105, "startColumn": 7, - "endLine": 19, - "endColumn": 12, + "endLine": 105, + "endColumn": 13, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'Vpc'" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SubnetB", + "logicalId": "ConditionalRequiredProperties", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 20, + "startLine": 106, "startColumn": 7, - "endLine": 20, - "endColumn": 16, + "endLine": 106, + "endColumn": 30, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -5718,120 +5885,134 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", + "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SubnetB", + "logicalId": "ConditionalRequiredProperties", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.AvailabilityZone", + "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 21, + "startLine": 107, "startColumn": 7, - "endLine": 21, - "endColumn": 23, + "endLine": 107, + "endColumn": 18, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "dynamic (Select on non-list value)" + "resolutionSource": "Fn::If on condition 'UseAlternateSize'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Vpc", + "logicalId": "ConditionalRequiredProperties", "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Properties.Cpu", "category": "Best Practice", - "startLine": 28, + "startLine": 108, "startColumn": 7, - "endLine": 28, - "endColumn": 16, + "endLine": 108, + "endColumn": 10, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "Fn::If on condition 'UseAlternateSize'" } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'SubnetA' of type 'AWS::EC2::Subnet' supports Tags but none are configured", + "message": "Property 'Memory' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SubnetA", + "logicalId": "ConditionalRequiredProperties", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.Memory", "category": "Best Practice", - "startLine": 9, - "startColumn": 5, - "endLine": 9, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 109, + "startColumn": 7, + "endLine": 109, + "endColumn": 13, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Fn::If on condition 'UseAlternateSize'" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'SubnetB' of type 'AWS::EC2::Subnet' supports Tags but none are configured", + "message": "Property 'PlacementConstraints' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SubnetB", + "logicalId": "ConditionalRequiredProperties", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.PlacementConstraints", "category": "Best Practice", - "startLine": 18, - "startColumn": 5, - "endLine": 18, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 110, + "startColumn": 7, + "endLine": 110, + "endColumn": 27, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Fn::If on condition 'UseAlternateSize'" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'Vpc' of type 'AWS::EC2::VPC' supports Tags but none are configured", + "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Vpc", + "logicalId": "ConditionalRequiredProperties", "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 27, - "startColumn": 5, - "endLine": 27, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 114, + "startColumn": 7, + "endLine": 114, + "endColumn": 27, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } } ] }, - "good/functions/split_get_stack_output.yaml": { - "filePath": "good/functions/split_get_stack_output.yaml", + "good/ecs_fargate_valid.yaml": { + "filePath": "good/ecs_fargate_valid.yaml", "status": "OK", "metadata": { - "resourcesScanned": 3, + "resourcesScanned": 1, "counts": { "fatal": 0, "errors": 0, "warnings": 0, - "informational": 3, + "informational": 7, "debug": 0 }, "suppressed": 0, @@ -5840,77 +6021,214 @@ }, "diagnostics": [ { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Property 'Family' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Bucket", + "logicalId": "TaskDef", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.Family", "category": "Best Practice", "startLine": 6, - "startColumn": 5, + "startColumn": 7, "endLine": 6, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "endColumn": 13, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "TaskDef", + "entityType": "Resource", + "resourceType": "AWS::ECS::TaskDefinition" + }, + "propertyPath": "Properties.Cpu", + "category": "Best Practice", + "startLine": 7, + "startColumn": 7, + "endLine": 7, + "endColumn": 10, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Memory' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "TaskDef", + "entityType": "Resource", + "resourceType": "AWS::ECS::TaskDefinition" + }, + "propertyPath": "Properties.Memory", + "category": "Best Practice", + "startLine": 8, + "startColumn": 7, + "endLine": 8, + "endColumn": 13, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "TaskDef", + "entityType": "Resource", + "resourceType": "AWS::ECS::TaskDefinition" + }, + "propertyPath": "Properties.NetworkMode", + "category": "Best Practice", + "startLine": 9, + "startColumn": 7, + "endLine": 9, + "endColumn": 18, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "TaskDef", + "entityType": "Resource", + "resourceType": "AWS::ECS::TaskDefinition" + }, + "propertyPath": "Properties.RequiresCompatibilities", + "category": "Best Practice", + "startLine": 10, + "startColumn": 7, + "endLine": 10, + "endColumn": 30, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "TaskDef", + "entityType": "Resource", + "resourceType": "AWS::ECS::TaskDefinition" + }, + "propertyPath": "Properties.ContainerDefinitions", + "category": "Best Practice", + "startLine": 12, + "startColumn": 7, + "endLine": 12, + "endColumn": 27, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'AllHeaders' of type 'AWS::SSM::Parameter' supports Tags but none are configured", + "message": "Resource 'TaskDef' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "AllHeaders", + "logicalId": "TaskDef", "entityType": "Resource", - "resourceType": "AWS::SSM::Parameter" + "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 21, + "startLine": 5, "startColumn": 5, - "endLine": 21, + "endLine": 5, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "good/elb_https_empty_sslcertificateid.yaml": { + "filePath": "good/elb_https_empty_sslcertificateid.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 1, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'FirstHeader' of type 'AWS::SSM::Parameter' supports Tags but none are configured", + "message": "Resource 'ELB' of type 'AWS::ElasticLoadBalancing::LoadBalancer' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "FirstHeader", + "logicalId": "ELB", "entityType": "Resource", - "resourceType": "AWS::SSM::Parameter" + "resourceType": "AWS::ElasticLoadBalancing::LoadBalancer" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 34, + "startLine": 7, "startColumn": 5, - "endLine": 34, + "endLine": 7, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "good/functions/sub.yaml": { - "filePath": "good/functions/sub.yaml", + "good/enum_case_insensitive_casing.yaml": { + "filePath": "good/enum_case_insensitive_casing.yaml", "status": "OK", "metadata": { - "resourcesScanned": 7, + "resourcesScanned": 2, "counts": { - "fatal": 3, - "errors": 2, - "warnings": 2, - "informational": 16, + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 6, "debug": 0 }, "suppressed": 0, @@ -5919,520 +6237,411 @@ }, "diagnostics": [ { - "ruleId": "F3002", - "severity": "FATAL", - "message": "Additional properties are not allowed ('ProductName' was unexpected)", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Type' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "MyStack", + "logicalId": "LowercaseType", "entityType": "Resource", - "resourceType": "AWS::CloudFormation::Stack" + "resourceType": "AWS::Batch::ComputeEnvironment" }, - "propertyPath": "Properties.ProductName", - "category": "Schema", - "startLine": 67, + "propertyPath": "Properties.Type", + "category": "Best Practice", + "startLine": 13, "startColumn": 7, - "endLine": 67, - "endColumn": 18, - "ruleDescription": "Additional properties are not allowed", + "endLine": 13, + "endColumn": 11, + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "property": "ProductName", - "extra": { - "allowed_properties": [ - "NotificationARNs", - "Parameters", - "StackId", - "Tags", - "TemplateURL", - "TimeoutInMinutes" - ] - } + "lifecycle": "create-only" } }, { - "ruleId": "F3002", - "severity": "FATAL", - "message": "Additional properties are not allowed ('ProvisioningArtifactName' was unexpected)", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ComputeResources.Subnets' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "MyStack", + "logicalId": "LowercaseType", "entityType": "Resource", - "resourceType": "AWS::CloudFormation::Stack" + "resourceType": "AWS::Batch::ComputeEnvironment" }, - "propertyPath": "Properties.ProvisioningArtifactName", - "category": "Schema", - "startLine": 68, - "startColumn": 7, - "endLine": 68, - "endColumn": 31, - "ruleDescription": "Additional properties are not allowed", + "propertyPath": "Properties.ComputeResources.Subnets", + "category": "Best Practice", + "startLine": 16, + "startColumn": 9, + "endLine": 16, + "endColumn": 16, + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "property": "ProvisioningArtifactName", - "extra": { - "allowed_properties": [ - "NotificationARNs", - "Parameters", - "StackId", - "Tags", - "TemplateURL", - "TimeoutInMinutes" - ] - } + "lifecycle": "conditional-create-only" } }, { - "ruleId": "F3003", - "severity": "FATAL", - "message": "'TemplateURL' is a required property", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ComputeResources.Type' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "MyStack", + "logicalId": "LowercaseType", "entityType": "Resource", - "resourceType": "AWS::CloudFormation::Stack" + "resourceType": "AWS::Batch::ComputeEnvironment" }, - "propertyPath": "Properties", - "suggestedFix": "Add the required property 'TemplateURL'", - "category": "Schema", - "startLine": 66, - "startColumn": 5, - "endLine": 66, - "endColumn": 15, - "ruleDescription": "Required property missing", - "phase": "SCHEMA" + "propertyPath": "Properties.ComputeResources.Type", + "category": "Best Practice", + "startLine": 18, + "startColumn": 9, + "endLine": 18, + "endColumn": 13, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'String' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Tags' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "myInstance", + "logicalId": "LowercaseType", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::Batch::ComputeEnvironment" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 33, + "propertyPath": "Properties.Tags", + "category": "Best Practice", + "startLine": 20, "startColumn": 7, - "endLine": 33, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", + "endLine": 20, + "endColumn": 11, + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "actualValue": "String" + "lifecycle": "create-only" } }, { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-123456' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Type' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "LaunchConfiguration", + "logicalId": "MixedCaseType", "entityType": "Resource", - "resourceType": "AWS::AutoScaling::LaunchConfiguration" + "resourceType": "AWS::Batch::ComputeEnvironment" }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 57, + "propertyPath": "Properties.Type", + "category": "Best Practice", + "startLine": 25, "startColumn": 7, - "endLine": 57, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", - "ruleDescription": "Validate AMI id format", + "endLine": 25, + "endColumn": 11, + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "actualValue": "ami-123456" + "lifecycle": "create-only" } }, { - "ruleId": "W3002", - "severity": "WARN", - "message": "This code may only work with 'package' cli command", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Tags' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "mySubStack", + "logicalId": "MixedCaseType", "entityType": "Resource", - "resourceType": "AWS::CloudFormation::Stack" + "resourceType": "AWS::Batch::ComputeEnvironment" }, - "propertyPath": "Properties.TemplateURL", + "propertyPath": "Properties.Tags", "category": "Best Practice", - "startLine": 44, + "startLine": 27, "startColumn": 7, - "endLine": 44, - "endColumn": 18, - "ruleDescription": "Warn when properties are configured to only work with the package command", - "phase": "LINT" + "endLine": 27, + "endColumn": 11, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + } + ] + }, + "good/functions/dynamic_reference_embedded.yaml": { + "filePath": "good/functions/dynamic_reference_embedded.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 4, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 8, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "W3697", - "severity": "WARN", - "message": "Resource type 'AWS::AutoScaling::LaunchConfiguration' is from a service in maintenance mode since 2024-10-01. Consider migrating to an alternative", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "LaunchConfiguration", + "logicalId": "Sg", "entityType": "Resource", - "resourceType": "AWS::AutoScaling::LaunchConfiguration" + "resourceType": "AWS::EC2::SecurityGroup" }, - "category": "Deprecation", - "startLine": 54, - "startColumn": 3, - "endLine": 54, - "endColumn": 22, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", - "ruleDescription": "Resource type is from a service in maintenance mode", - "phase": "SCHEMA" + "propertyPath": "Properties.GroupDescription", + "category": "Best Practice", + "startLine": 11, + "startColumn": 7, + "endLine": 11, + "endColumn": 23, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'GroupName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "mySubStack", + "logicalId": "Sg", "entityType": "Resource", - "resourceType": "AWS::CloudFormation::Stack" + "resourceType": "AWS::EC2::SecurityGroup" }, + "propertyPath": "Properties.GroupName", "category": "Best Practice", - "startLine": 41, - "startColumn": 3, - "endLine": 41, - "endColumn": 13, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 12, + "startColumn": 7, + "endLine": 12, + "endColumn": 16, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "dynamic (dynamic reference: prefix-{{resolve:ssm:/network/sg-name}})" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "mySubStack", - "entityType": "Resource", - "resourceType": "AWS::CloudFormation::Stack" - }, - "category": "Best Practice", - "startLine": 41, - "startColumn": 3, - "endLine": 41, - "endColumn": 13, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "MyStack", - "entityType": "Resource", - "resourceType": "AWS::CloudFormation::Stack" - }, - "category": "Best Practice", - "startLine": 64, - "startColumn": 3, - "endLine": 64, - "endColumn": 10, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "MyStack", - "entityType": "Resource", - "resourceType": "AWS::CloudFormation::Stack" - }, - "category": "Best Practice", - "startLine": 64, - "startColumn": 3, - "endLine": 64, - "endColumn": 10, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "myInstance", + "logicalId": "Bucket", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Properties.BucketName", "category": "Best Practice", - "startLine": 33, + "startLine": 19, "startColumn": 7, - "endLine": 33, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 19, + "endColumn": 17, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "dynamic (dynamic reference: {{resolve:ssm:/config/bucket-name}})" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "myInstance", + "logicalId": "Instance", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.UserData", + "propertyPath": "Properties.ImageId", "category": "Best Practice", "startLine": 34, "startColumn": 7, "endLine": 34, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only", - "resolutionSource": "dynamic (Base64 with unresolvable argument)" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Name' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "myAlb", - "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancingV2::LoadBalancer" - }, - "propertyPath": "Properties.Name", - "category": "Best Practice", - "startLine": 52, - "startColumn": 7, - "endLine": 52, - "endColumn": 11, - "documentationUrl": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-loadbalancer.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "LaunchConfiguration", - "entityType": "Resource", - "resourceType": "AWS::AutoScaling::LaunchConfiguration" - }, - "propertyPath": "Properties.ImageId", - "category": "Best Practice", - "startLine": 57, - "startColumn": 7, - "endLine": 57, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "dynamic (dynamic reference: prefix-{{resolve:ssm:/ec2/ami-id}})" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'InstanceType' is create-only; updating it will cause resource replacement", + "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "LaunchConfiguration", + "logicalId": "Instance", "entityType": "Resource", - "resourceType": "AWS::AutoScaling::LaunchConfiguration" + "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 58, + "startLine": 35, "startColumn": 7, - "endLine": 58, + "endLine": 35, "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } }, { - "ruleId": "I9001", + "ruleId": "I9003", "severity": "INFO", - "message": "Property 'UserData' is create-only; updating it will cause resource replacement", + "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", "source": "ENGINE", - "entity": { - "logicalId": "LaunchConfiguration", - "entityType": "Resource", - "resourceType": "AWS::AutoScaling::LaunchConfiguration" - }, - "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 59, - "startColumn": 7, - "endLine": 59, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "dynamic (Base64 with unresolvable argument)" - } + "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Resource 'ScheduledRule' of type 'AWS::Events::Rule' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "myVPc2", + "logicalId": "ScheduledRule", "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" + "resourceType": "AWS::Events::Rule" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 72, - "startColumn": 7, - "endLine": 72, - "endColumn": 16, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "dynamic (Sub:${myCidr}1)" - } + "startLine": 25, + "startColumn": 5, + "endLine": 25, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'myInstance' of type 'AWS::EC2::Instance' supports Tags but none are configured", + "message": "Resource 'Instance' of type 'AWS::EC2::Instance' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "myInstance", + "logicalId": "Instance", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 32, + "startLine": 33, "startColumn": 5, - "endLine": 32, + "endLine": 33, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "good/functions/foreach.yaml": { + "filePath": "good/functions/foreach.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 3, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 3, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'mySubStack' of type 'AWS::CloudFormation::Stack' supports Tags but none are configured", + "message": "Resource 'S3BucketA' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "mySubStack", + "logicalId": "S3BucketA", "entityType": "Resource", - "resourceType": "AWS::CloudFormation::Stack" + "resourceType": "AWS::S3::Bucket" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 43, - "startColumn": 5, - "endLine": 43, - "endColumn": 15, + "startLine": 10, + "startColumn": 1, + "endLine": 10, + "endColumn": 10, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'myAlb' of type 'AWS::ElasticLoadBalancingV2::LoadBalancer' supports Tags but none are configured", + "message": "Resource 'S3BucketB' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "myAlb", + "logicalId": "S3BucketB", "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancingV2::LoadBalancer" + "resourceType": "AWS::S3::Bucket" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 51, - "startColumn": 5, - "endLine": 51, - "endColumn": 15, + "startLine": 10, + "startColumn": 1, + "endLine": 10, + "endColumn": 10, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'MyStack' of type 'AWS::CloudFormation::Stack' supports Tags but none are configured", + "message": "Resource 'S3BucketC' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "MyStack", + "logicalId": "S3BucketC", "entityType": "Resource", - "resourceType": "AWS::CloudFormation::Stack" + "resourceType": "AWS::S3::Bucket" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 66, - "startColumn": 5, - "endLine": 66, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'myVPc2' of type 'AWS::EC2::VPC' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "myVPc2", - "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 71, - "startColumn": 5, - "endLine": 71, - "endColumn": 15, + "startLine": 10, + "startColumn": 1, + "endLine": 10, + "endColumn": 10, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "good/functions/sub_needed.yaml": { - "filePath": "good/functions/sub_needed.yaml", + "good/functions/get_stack_output.yaml": { + "filePath": "good/functions/get_stack_output.yaml", "status": "OK", "metadata": { - "resourcesScanned": 6, + "resourcesScanned": 10, "counts": { - "fatal": 3, + "fatal": 0, "errors": 0, - "warnings": 4, - "informational": 9, + "warnings": 0, + "informational": 10, "debug": 0 }, "suppressed": 0, @@ -6441,271 +6650,327 @@ }, "diagnostics": [ { - "ruleId": "F1020", - "severity": "FATAL", - "message": "Fn::GetAtt references non-existent resource 'GreetingLambda'", - "source": "SCHEMA", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Topic1' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "GreetingRequest", + "logicalId": "Topic1", "entityType": "Resource", - "resourceType": "AWS::ApiGateway::Method" + "resourceType": "AWS::SNS::Topic" }, - "suggestedFix": "Check that the GetAtt target resource exists in the template", - "category": "Intrinsic Function", - "startLine": 86, - "startColumn": 3, - "endLine": 86, - "endColumn": 18, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway.git", - "ruleDescription": "Ref/GetAtt target must exist", - "phase": "SCHEMA" + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 15, + "startColumn": 5, + "endLine": 15, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "F1020", - "severity": "FATAL", - "message": "'GreetingResource' is not one of ['AMIId', 'AWS::AccountId', 'AWS::NoValue', 'AWS::NotificationARNs', 'AWS::Partition', 'AWS::Region', 'AWS::StackId', 'AWS::StackName', 'AWS::URLSuffix', 'GreetingRequest', 'IOTPolicies', 'Key', 'MyContentBucket', 'TestGoodStateMachine1', 'myPolicy', 'myPolicy2']", - "source": "SCHEMA", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Topic2' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "GreetingRequest", + "logicalId": "Topic2", "entityType": "Resource", - "resourceType": "AWS::ApiGateway::Method" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ResourceId", - "suggestedFix": "Check that the Ref target exists as a resource, parameter, or pseudo-parameter", - "category": "Intrinsic Function", - "startLine": 114, - "startColumn": 7, - "endLine": 114, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway.git", - "ruleDescription": "Ref/GetAtt target must exist", - "phase": "SCHEMA", - "context": { - "resolutionSource": "dynamic (unknown ref target: GreetingResource)" - } + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 23, + "startColumn": 5, + "endLine": 23, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "F1020", - "severity": "FATAL", - "message": "'GreetingApi' is not one of ['AMIId', 'AWS::AccountId', 'AWS::NoValue', 'AWS::NotificationARNs', 'AWS::Partition', 'AWS::Region', 'AWS::StackId', 'AWS::StackName', 'AWS::URLSuffix', 'GreetingRequest', 'IOTPolicies', 'Key', 'MyContentBucket', 'TestGoodStateMachine1', 'myPolicy', 'myPolicy2']", - "source": "SCHEMA", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Topic3' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "GreetingRequest", + "logicalId": "Topic3", "entityType": "Resource", - "resourceType": "AWS::ApiGateway::Method" - }, - "propertyPath": "Properties.RestApiId", - "suggestedFix": "Check that the Ref target exists as a resource, parameter, or pseudo-parameter", - "category": "Intrinsic Function", - "startLine": 115, - "startColumn": 7, - "endLine": 115, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway.git", - "ruleDescription": "Ref/GetAtt target must exist", - "phase": "SCHEMA", - "context": { - "resolutionSource": "dynamic (unknown ref target: GreetingApi)" - } - }, - { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'MyContentBucket' is not referenced anywhere in the template", - "source": "CFN_LINT", - "entity": { - "logicalId": "MyContentBucket", - "entityType": "Parameter" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Parameters/MyContentBucket", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 4, - "startColumn": 3, - "endLine": 4, - "endColumn": 18, - "ruleDescription": "Check if Parameters are Used", + "startLine": 33, + "startColumn": 5, + "endLine": 33, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'AMIId' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Topic4' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "AMIId", - "entityType": "Parameter" + "logicalId": "Topic4", + "entityType": "Resource", + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Parameters/AMIId", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 7, - "startColumn": 3, - "endLine": 7, - "endColumn": 8, - "ruleDescription": "Check if Parameters are Used", + "startLine": 44, + "startColumn": 5, + "endLine": 44, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "W9002", - "severity": "WARN", - "message": "Property 'RoleArn' has a hardcoded ARN - use Ref, GetAtt, or a parameter instead", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Topic5' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "TestGoodStateMachine1", + "logicalId": "Topic5", "entityType": "Resource", - "resourceType": "AWS::StepFunctions::StateMachine" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.RoleArn", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 156, - "startColumn": 7, - "endLine": 156, - "endColumn": 14, - "ruleDescription": "Hardcoded ARN property", + "startLine": 55, + "startColumn": 5, + "endLine": 55, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "W9013", - "severity": "WARN", - "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Topic6' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "TestGoodStateMachine1", + "logicalId": "Topic6", "entityType": "Resource", - "resourceType": "AWS::StepFunctions::StateMachine" + "resourceType": "AWS::SNS::Topic" }, - "category": "Security", - "startLine": 137, - "startColumn": 3, - "endLine": 137, - "endColumn": 24, - "ruleDescription": "Hardcoded account ID in ARN", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 65, + "startColumn": 5, + "endLine": 65, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "I1022", + "ruleId": "I9040", "severity": "INFO", - "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", - "source": "CFN_LINT", + "message": "Resource 'Topic7' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "GreetingRequest", + "logicalId": "Topic7", "entityType": "Resource", - "resourceType": "AWS::ApiGateway::Method" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.Integration.Uri.Fn::Join", - "category": "Intrinsic Function", - "startLine": 95, - "startColumn": 11, - "endLine": 95, - "endColumn": 19, - "ruleDescription": "Use Sub instead of Join", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 74, + "startColumn": 5, + "endLine": 74, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "I1022", + "ruleId": "I9040", "severity": "INFO", - "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", - "source": "CFN_LINT", + "message": "Resource 'Topic8' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "GreetingRequest", + "logicalId": "Topic8", "entityType": "Resource", - "resourceType": "AWS::ApiGateway::Method" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.Integration.RequestTemplates.application/json.Fn::Join", - "category": "Intrinsic Function", - "startLine": 107, - "startColumn": 13, - "endLine": 107, - "endColumn": 21, - "ruleDescription": "Use Sub instead of Join", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 83, + "startColumn": 5, + "endLine": 83, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'HttpMethod' is create-only; updating it will cause resource replacement", + "message": "Resource 'Topic9' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "GreetingRequest", + "logicalId": "Topic9", "entityType": "Resource", - "resourceType": "AWS::ApiGateway::Method" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.HttpMethod", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 90, - "startColumn": 7, - "endLine": 90, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 95, + "startColumn": 5, + "endLine": 95, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'ResourceId' is create-only; updating it will cause resource replacement", + "message": "Resource 'Topic10' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "GreetingRequest", + "logicalId": "Topic10", "entityType": "Resource", - "resourceType": "AWS::ApiGateway::Method" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ResourceId", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 114, + "startLine": 106, + "startColumn": 5, + "endLine": 106, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "good/functions/ref.yaml": { + "filePath": "good/functions/ref.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 0, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [] + }, + "good/functions/relationship_conditions.yaml": { + "filePath": "good/functions/relationship_conditions.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 3, + "counts": { + "fatal": 1, + "errors": 1, + "warnings": 0, + "informational": 4, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "F3003", + "severity": "FATAL", + "message": "'Role' is a required property", + "source": "SCHEMA", + "entity": { + "logicalId": "AMIIDLookup", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties", + "suggestedFix": "Add the required property 'Role'", + "category": "Schema", + "startLine": 36, + "startColumn": 5, + "endLine": 36, + "endColumn": 15, + "conditionScenario": { + "isPrimary": false + }, + "ruleDescription": "Required property missing", + "phase": "SCHEMA" + }, + { + "ruleId": "E2533", + "severity": "ERROR", + "message": "Runtime 'nodejs4.3' was deprecated on '2020-03-05'. Creation was disabled on '2020-02-03', and updates were disabled on '2020-03-05'. Please consider updating to 'nodejs24.x'", + "source": "CFN_LINT", + "entity": { + "logicalId": "AMIIDLookup", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 46, "startColumn": 7, - "endLine": 114, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway.git", - "ruleDescription": "Create-only property updated triggers resource replacement", + "endLine": 46, + "endColumn": 14, + "ruleDescription": "Check if Lambda Function Runtimes are updatable", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "dynamic (unknown ref target: GreetingResource)" + "actualValue": "nodejs4.3", + "lifecycle": "end-of-life" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'RestApiId' is create-only; updating it will cause resource replacement", + "message": "Property 'Path' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "GreetingRequest", + "logicalId": "LambdaExecutionRole", "entityType": "Resource", - "resourceType": "AWS::ApiGateway::Method" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.RestApiId", + "propertyPath": "Properties.Path", "category": "Best Practice", - "startLine": 115, + "startLine": 26, "startColumn": 7, - "endLine": 115, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway.git", + "endLine": 26, + "endColumn": 11, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "dynamic (unknown ref target: GreetingApi)" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'PolicyName' is create-only; updating it will cause resource replacement", + "message": "Property 'Path' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "IOTPolicies", + "logicalId": "InstanceProfile", "entityType": "Resource", - "resourceType": "AWS::IoT::Policy" + "resourceType": "AWS::IAM::InstanceProfile" }, - "propertyPath": "Properties.PolicyName", + "propertyPath": "Properties.Path", "category": "Best Practice", - "startLine": 121, + "startLine": 31, "startColumn": 7, - "endLine": 121, - "endColumn": 17, + "endLine": 31, + "endColumn": 11, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -6715,39 +6980,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Key' of type 'AWS::ApiGateway::ApiKey' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "Key", - "entityType": "Resource", - "resourceType": "AWS::ApiGateway::ApiKey" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 84, - "startColumn": 5, - "endLine": 84, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'IOTPolicies' of type 'AWS::IoT::Policy' supports Tags but none are configured", + "message": "Resource 'LambdaExecutionRole' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "IOTPolicies", + "logicalId": "LambdaExecutionRole", "entityType": "Resource", - "resourceType": "AWS::IoT::Policy" + "resourceType": "AWS::IAM::Role" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 120, + "startLine": 14, "startColumn": 5, - "endLine": 120, + "endLine": 14, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -6755,35 +7000,35 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'TestGoodStateMachine1' of type 'AWS::StepFunctions::StateMachine' supports Tags but none are configured", + "message": "Resource 'AMIIDLookup' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "TestGoodStateMachine1", + "logicalId": "AMIIDLookup", "entityType": "Resource", - "resourceType": "AWS::StepFunctions::StateMachine" + "resourceType": "AWS::Lambda::Function" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 139, + "startLine": 36, "startColumn": 5, - "endLine": 139, + "endLine": 36, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "good/functions/sub_needed_custom_excludes.yaml": { - "filePath": "good/functions/sub_needed_custom_excludes.yaml", + "good/functions/relationship_conditions_sam.yaml": { + "filePath": "good/functions/relationship_conditions_sam.yaml", "status": "OK", "metadata": { - "resourcesScanned": 1, + "resourcesScanned": 3, "counts": { - "fatal": 1, - "errors": 1, + "fatal": 0, + "errors": 0, "warnings": 1, - "informational": 2, + "informational": 4, "debug": 0 }, "suppressed": 0, @@ -6792,132 +7037,116 @@ }, "diagnostics": [ { - "ruleId": "F3031", - "severity": "FATAL", - "message": "'TestRole-${Stage}' does not match pattern '^[\\w+=,.@-]+$'", - "source": "SCHEMA", + "ruleId": "W2531", + "severity": "WARN", + "message": "Runtime 'provided.al2' was deprecated on '2026-07-31'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'provided.al2023'", + "source": "CFN_LINT", "entity": { - "logicalId": "TestRole", + "logicalId": "FunctionC", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::Serverless::Function" }, - "propertyPath": "Properties.RoleName", - "category": "Schema", - "startLine": 10, + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 36, "startColumn": 7, - "endLine": 10, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", - "ruleDescription": "Value does not match pattern", - "phase": "SCHEMA", - "context": { - "actualValue": "TestRole-${Stage}", - "expectedConstraint": "^[\\w+=,.@-]+$" + "endLine": 36, + "endColumn": 14, + "ruleDescription": "Check if EOL Lambda Function Runtimes are used", + "phase": "SCHEMA", + "context": { + "actualValue": "provided.al2", + "lifecycle": "deprecated" } }, { - "ruleId": "E1029", - "severity": "ERROR", - "message": "Found an embedded parameter '${Stage}' outside of an 'Fn::Sub' at Properties.RoleName", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ApplicationId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "TestRole", + "logicalId": "ConfigEnvironment", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::AppConfig::Environment" }, - "propertyPath": "Properties.RoleName", - "suggestedFix": "Wrap the string with Fn::Sub", - "category": "Intrinsic Function", - "startLine": 10, + "propertyPath": "Properties.ApplicationId", + "category": "Best Practice", + "startLine": 31, "startColumn": 7, - "endLine": 10, - "endColumn": 15, - "ruleDescription": "Substitution variable ${X} requires Fn::Sub", - "phase": "LINT" + "endLine": 31, + "endColumn": 20, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-appconfig.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'ConfigApplication'" + } }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'Stage' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'ConfigApplication' of type 'AWS::AppConfig::Application' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Stage", - "entityType": "Parameter" + "logicalId": "ConfigApplication", + "entityType": "Resource", + "resourceType": "AWS::AppConfig::Application" }, - "propertyPath": "Parameters/Stage", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 4, - "startColumn": 3, - "endLine": 4, - "endColumn": 8, - "ruleDescription": "Check if Parameters are Used", + "startLine": 25, + "startColumn": 5, + "endLine": 25, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'RoleName' is create-only; updating it will cause resource replacement", + "message": "Resource 'ConfigEnvironment' of type 'AWS::AppConfig::Environment' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "TestRole", + "logicalId": "ConfigEnvironment", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::AppConfig::Environment" }, - "propertyPath": "Properties.RoleName", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 10, - "startColumn": 7, - "endLine": 10, + "startLine": 30, + "startColumn": 5, + "endLine": 30, "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'TestRole' of type 'AWS::IAM::Role' supports Tags but none are configured", + "message": "Resource 'FunctionC' of type 'AWS::Serverless::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "TestRole", + "logicalId": "FunctionC", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::Serverless::Function" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 9, + "startLine": 35, "startColumn": 5, - "endLine": 9, + "endLine": 35, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "good/functions/sub_needed_transform.yaml": { - "filePath": "good/functions/sub_needed_transform.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 0, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [] - }, - "good/functions_findinmap.yaml": { - "filePath": "good/functions_findinmap.yaml", + "good/functions/select_string_index.yaml": { + "filePath": "good/functions/select_string_index.yaml", "status": "OK", "metadata": { "resourcesScanned": 3, @@ -6925,7 +7154,7 @@ "fatal": 0, "errors": 0, "warnings": 0, - "informational": 6, + "informational": 10, "debug": 0 }, "suppressed": 0, @@ -6936,282 +7165,155 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "myInstance1", + "logicalId": "SubnetA", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 14, + "startLine": 10, "startColumn": 7, - "endLine": 14, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 10, + "endColumn": 12, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "dynamic (FindInMap with dynamic map name)" + "resolutionSource": "Ref to 'Vpc'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "myInstance2", + "logicalId": "SubnetA", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 18, + "startLine": 11, "startColumn": 7, - "endLine": 18, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 11, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "dynamic (FindInMap with dynamic map name)" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "myInstance3", + "logicalId": "SubnetA", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Properties.AvailabilityZone", "category": "Best Practice", - "startLine": 26, + "startLine": 12, "startColumn": 7, - "endLine": 26, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 12, + "endColumn": 23, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "dynamic (FindInMap with dynamic map name)" + "resolutionSource": "dynamic (Select on non-list value)" } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'myInstance1' of type 'AWS::EC2::Instance' supports Tags but none are configured", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "myInstance1", + "logicalId": "SubnetB", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 13, - "startColumn": 5, - "endLine": 13, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 19, + "startColumn": 7, + "endLine": 19, + "endColumn": 12, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'Vpc'" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'myInstance2' of type 'AWS::EC2::Instance' supports Tags but none are configured", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "myInstance2", + "logicalId": "SubnetB", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 17, - "startColumn": 5, - "endLine": 17, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 20, + "startColumn": 7, + "endLine": 20, + "endColumn": 16, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'myInstance3' of type 'AWS::EC2::Instance' supports Tags but none are configured", + "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "myInstance3", + "logicalId": "SubnetB", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.AvailabilityZone", "category": "Best Practice", - "startLine": 25, - "startColumn": 5, - "endLine": 25, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "good/functions_findinmap_default_value.yaml": { - "filePath": "good/functions_findinmap_default_value.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 9, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 5, - "informational": 18, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "W3696", - "severity": "WARN", - "message": "Resource type 'AWS::AppMesh::Mesh' is from a service that will be shut down on 2026-09-30. Plan to migrate to an alternative", - "source": "CFN_LINT", - "entity": { - "logicalId": "Mesh0", - "entityType": "Resource", - "resourceType": "AWS::AppMesh::Mesh" - }, - "category": "Deprecation", - "startLine": 43, - "startColumn": 3, - "endLine": 43, - "endColumn": 8, - "ruleDescription": "Resource type is from a service that is sunsetting", - "phase": "SCHEMA" - }, - { - "ruleId": "W3696", - "severity": "WARN", - "message": "Resource type 'AWS::AppMesh::Mesh' is from a service that will be shut down on 2026-09-30. Plan to migrate to an alternative", - "source": "CFN_LINT", - "entity": { - "logicalId": "Mesh1", - "entityType": "Resource", - "resourceType": "AWS::AppMesh::Mesh" - }, - "category": "Deprecation", - "startLine": 59, - "startColumn": 3, - "endLine": 59, - "endColumn": 8, - "ruleDescription": "Resource type is from a service that is sunsetting", - "phase": "SCHEMA" - }, - { - "ruleId": "W3696", - "severity": "WARN", - "message": "Resource type 'AWS::AppMesh::Mesh' is from a service that will be shut down on 2026-09-30. Plan to migrate to an alternative", - "source": "CFN_LINT", - "entity": { - "logicalId": "Mesh2", - "entityType": "Resource", - "resourceType": "AWS::AppMesh::Mesh" - }, - "category": "Deprecation", - "startLine": 70, - "startColumn": 3, - "endLine": 70, - "endColumn": 8, - "ruleDescription": "Resource type is from a service that is sunsetting", - "phase": "SCHEMA" - }, - { - "ruleId": "W3696", - "severity": "WARN", - "message": "Resource type 'AWS::AppMesh::Mesh' is from a service that will be shut down on 2026-09-30. Plan to migrate to an alternative", - "source": "CFN_LINT", - "entity": { - "logicalId": "Mesh3", - "entityType": "Resource", - "resourceType": "AWS::AppMesh::Mesh" - }, - "category": "Deprecation", - "startLine": 81, - "startColumn": 3, - "endLine": 81, - "endColumn": 8, - "ruleDescription": "Resource type is from a service that is sunsetting", - "phase": "SCHEMA" - }, - { - "ruleId": "W3696", - "severity": "WARN", - "message": "Resource type 'AWS::AppMesh::Mesh' is from a service that will be shut down on 2026-09-30. Plan to migrate to an alternative", - "source": "CFN_LINT", - "entity": { - "logicalId": "Mesh4", - "entityType": "Resource", - "resourceType": "AWS::AppMesh::Mesh" - }, - "category": "Deprecation", - "startLine": 93, - "startColumn": 3, - "endLine": 93, - "endColumn": 8, - "ruleDescription": "Resource type is from a service that is sunsetting", - "phase": "SCHEMA" - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ClusterName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Cluster0", - "entityType": "Resource", - "resourceType": "AWS::ECS::Cluster" - }, - "propertyPath": "Properties.ClusterName", - "category": "Best Practice", - "startLine": 14, + "startLine": 21, "startColumn": 7, - "endLine": 14, - "endColumn": 18, + "endLine": 21, + "endColumn": 23, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "dynamic (Select on non-list value)" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ClusterName' is create-only; updating it will cause resource replacement", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Cluster1", + "logicalId": "Vpc", "entityType": "Resource", - "resourceType": "AWS::ECS::Cluster" + "resourceType": "AWS::EC2::VPC" }, - "propertyPath": "Properties.ClusterName", + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 22, + "startLine": 28, "startColumn": 7, - "endLine": 22, - "endColumn": 18, + "endLine": 28, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -7219,521 +7321,513 @@ } }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'ClusterName' is create-only; updating it will cause resource replacement", + "message": "Resource 'SubnetA' of type 'AWS::EC2::Subnet' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Cluster2", + "logicalId": "SubnetA", "entityType": "Resource", - "resourceType": "AWS::ECS::Cluster" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.ClusterName", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 30, - "startColumn": 7, - "endLine": 30, - "endColumn": 18, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 9, + "startColumn": 5, + "endLine": 9, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'ClusterName' is create-only; updating it will cause resource replacement", + "message": "Resource 'SubnetB' of type 'AWS::EC2::Subnet' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Cluster3", + "logicalId": "SubnetB", "entityType": "Resource", - "resourceType": "AWS::ECS::Cluster" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.ClusterName", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 38, - "startColumn": 7, - "endLine": 38, - "endColumn": 18, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 18, + "startColumn": 5, + "endLine": 18, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'MeshName' is create-only; updating it will cause resource replacement", + "message": "Resource 'Vpc' of type 'AWS::EC2::VPC' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Mesh0", + "logicalId": "Vpc", "entityType": "Resource", - "resourceType": "AWS::AppMesh::Mesh" + "resourceType": "AWS::EC2::VPC" }, - "propertyPath": "Properties.MeshName", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 46, - "startColumn": 7, - "endLine": 46, + "startLine": 27, + "startColumn": 5, + "endLine": 27, "endColumn": 15, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "good/functions/split_get_stack_output.yaml": { + "filePath": "good/functions/split_get_stack_output.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 3, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 3, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'MeshName' is create-only; updating it will cause resource replacement", + "message": "Resource 'Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Mesh1", + "logicalId": "Bucket", "entityType": "Resource", - "resourceType": "AWS::AppMesh::Mesh" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.MeshName", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 62, - "startColumn": 7, - "endLine": 62, + "startLine": 6, + "startColumn": 5, + "endLine": 6, "endColumn": 15, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'MeshName' is create-only; updating it will cause resource replacement", + "message": "Resource 'AllHeaders' of type 'AWS::SSM::Parameter' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Mesh2", + "logicalId": "AllHeaders", "entityType": "Resource", - "resourceType": "AWS::AppMesh::Mesh" + "resourceType": "AWS::SSM::Parameter" }, - "propertyPath": "Properties.MeshName", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 73, - "startColumn": 7, - "endLine": 73, + "startLine": 21, + "startColumn": 5, + "endLine": 21, "endColumn": 15, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'MeshName' is create-only; updating it will cause resource replacement", + "message": "Resource 'FirstHeader' of type 'AWS::SSM::Parameter' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Mesh3", + "logicalId": "FirstHeader", "entityType": "Resource", - "resourceType": "AWS::AppMesh::Mesh" + "resourceType": "AWS::SSM::Parameter" }, - "propertyPath": "Properties.MeshName", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 84, - "startColumn": 7, - "endLine": 84, + "startLine": 34, + "startColumn": 5, + "endLine": 34, "endColumn": 15, - "ruleDescription": "Create-only property updated triggers resource replacement", + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "good/functions/sub.yaml": { + "filePath": "good/functions/sub.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 7, + "counts": { + "fatal": 3, + "errors": 2, + "warnings": 2, + "informational": 16, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "F3002", + "severity": "FATAL", + "message": "Additional properties are not allowed ('ProductName' was unexpected)", + "source": "SCHEMA", + "entity": { + "logicalId": "MyStack", + "entityType": "Resource", + "resourceType": "AWS::CloudFormation::Stack" + }, + "propertyPath": "Properties.ProductName", + "category": "Schema", + "startLine": 67, + "startColumn": 7, + "endLine": 67, + "endColumn": 18, + "ruleDescription": "Additional properties are not allowed", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "property": "ProductName", + "extra": { + "allowed_properties": [ + "NotificationARNs", + "Parameters", + "StackId", + "Tags", + "TemplateURL", + "TimeoutInMinutes" + ] + } } }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'MeshName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "F3002", + "severity": "FATAL", + "message": "Additional properties are not allowed ('ProvisioningArtifactName' was unexpected)", + "source": "SCHEMA", "entity": { - "logicalId": "Mesh4", + "logicalId": "MyStack", "entityType": "Resource", - "resourceType": "AWS::AppMesh::Mesh" + "resourceType": "AWS::CloudFormation::Stack" }, - "propertyPath": "Properties.MeshName", - "category": "Best Practice", - "startLine": 96, + "propertyPath": "Properties.ProvisioningArtifactName", + "category": "Schema", + "startLine": 68, "startColumn": 7, - "endLine": 96, - "endColumn": 15, - "ruleDescription": "Create-only property updated triggers resource replacement", + "endLine": 68, + "endColumn": 31, + "ruleDescription": "Additional properties are not allowed", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "property": "ProvisioningArtifactName", + "extra": { + "allowed_properties": [ + "NotificationARNs", + "Parameters", + "StackId", + "Tags", + "TemplateURL", + "TimeoutInMinutes" + ] + } } }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Cluster0' of type 'AWS::ECS::Cluster' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "F3003", + "severity": "FATAL", + "message": "'TemplateURL' is a required property", + "source": "SCHEMA", "entity": { - "logicalId": "Cluster0", + "logicalId": "MyStack", "entityType": "Resource", - "resourceType": "AWS::ECS::Cluster" + "resourceType": "AWS::CloudFormation::Stack" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 13, + "propertyPath": "Properties", + "suggestedFix": "Add the required property 'TemplateURL'", + "category": "Schema", + "startLine": 66, "startColumn": 5, - "endLine": 13, + "endLine": 66, "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "ruleDescription": "Required property missing", + "phase": "SCHEMA" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Cluster1' of type 'AWS::ECS::Cluster' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'String' does not match format 'AWS::EC2::Image.Id'", + "source": "CFN_LINT", "entity": { - "logicalId": "Cluster1", + "logicalId": "myInstance", "entityType": "Resource", - "resourceType": "AWS::ECS::Cluster" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 21, - "startColumn": 5, - "endLine": 21, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 33, + "startColumn": 7, + "endLine": 33, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "String" + } }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Cluster2' of type 'AWS::ECS::Cluster' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-123456' does not match format 'AWS::EC2::Image.Id'", + "source": "CFN_LINT", "entity": { - "logicalId": "Cluster2", + "logicalId": "LaunchConfiguration", "entityType": "Resource", - "resourceType": "AWS::ECS::Cluster" + "resourceType": "AWS::AutoScaling::LaunchConfiguration" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 29, - "startColumn": 5, - "endLine": 29, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 57, + "startColumn": 7, + "endLine": 57, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-123456" + } }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Cluster3' of type 'AWS::ECS::Cluster' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W3002", + "severity": "WARN", + "message": "This code may only work with 'package' cli command", + "source": "CFN_LINT", "entity": { - "logicalId": "Cluster3", + "logicalId": "mySubStack", "entityType": "Resource", - "resourceType": "AWS::ECS::Cluster" + "resourceType": "AWS::CloudFormation::Stack" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.TemplateURL", "category": "Best Practice", - "startLine": 37, - "startColumn": 5, - "endLine": 37, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "startLine": 44, + "startColumn": 7, + "endLine": 44, + "endColumn": 18, + "ruleDescription": "Warn when properties are configured to only work with the package command", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Mesh0' of type 'AWS::AppMesh::Mesh' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W3697", + "severity": "WARN", + "message": "Resource type 'AWS::AutoScaling::LaunchConfiguration' is from a service in maintenance mode since 2024-10-01. Consider migrating to an alternative", + "source": "CFN_LINT", "entity": { - "logicalId": "Mesh0", + "logicalId": "LaunchConfiguration", "entityType": "Resource", - "resourceType": "AWS::AppMesh::Mesh" + "resourceType": "AWS::AutoScaling::LaunchConfiguration" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 45, - "startColumn": 5, - "endLine": 45, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "category": "Deprecation", + "startLine": 54, + "startColumn": 3, + "endLine": 54, + "endColumn": 22, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", + "ruleDescription": "Resource type is from a service in maintenance mode", + "phase": "SCHEMA" }, { - "ruleId": "I9040", + "ruleId": "I3011", "severity": "INFO", - "message": "Resource 'Mesh1' of type 'AWS::AppMesh::Mesh' supports Tags but none are configured", - "source": "ENGINE", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "Mesh1", + "logicalId": "mySubStack", "entityType": "Resource", - "resourceType": "AWS::AppMesh::Mesh" + "resourceType": "AWS::CloudFormation::Stack" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 61, - "startColumn": 5, - "endLine": 61, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "startLine": 41, + "startColumn": 3, + "endLine": 41, + "endColumn": 13, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "I9040", + "ruleId": "I3011", "severity": "INFO", - "message": "Resource 'Mesh2' of type 'AWS::AppMesh::Mesh' supports Tags but none are configured", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "Mesh2", + "logicalId": "mySubStack", "entityType": "Resource", - "resourceType": "AWS::AppMesh::Mesh" + "resourceType": "AWS::CloudFormation::Stack" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 72, - "startColumn": 5, - "endLine": 72, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "startLine": 41, + "startColumn": 3, + "endLine": 41, + "endColumn": 13, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "I9040", + "ruleId": "I3011", "severity": "INFO", - "message": "Resource 'Mesh3' of type 'AWS::AppMesh::Mesh' supports Tags but none are configured", - "source": "ENGINE", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "Mesh3", + "logicalId": "MyStack", "entityType": "Resource", - "resourceType": "AWS::AppMesh::Mesh" + "resourceType": "AWS::CloudFormation::Stack" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 83, - "startColumn": 5, - "endLine": 83, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "startLine": 64, + "startColumn": 3, + "endLine": 64, + "endColumn": 10, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "I9040", + "ruleId": "I3011", "severity": "INFO", - "message": "Resource 'Mesh4' of type 'AWS::AppMesh::Mesh' supports Tags but none are configured", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "Mesh4", + "logicalId": "MyStack", "entityType": "Resource", - "resourceType": "AWS::AppMesh::Mesh" + "resourceType": "AWS::CloudFormation::Stack" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 95, - "startColumn": 5, - "endLine": 95, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "startLine": 64, + "startColumn": 3, + "endLine": 64, + "endColumn": 10, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" - } - ] - }, - "good/functions_findinmap_enhanced.yaml": { - "filePath": "good/functions_findinmap_enhanced.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 6, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 2, - "informational": 17, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "E7001", - "severity": "ERROR", - "message": "Mapping 'MapName'.'TopKey1' key '{\"To\":\"Json\",\"String\":\"Function\"}' does not match format '^[a-zA-Z0-9]+$'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "MapName", - "entityType": "Mapping" + "logicalId": "myInstance", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Mappings/MapName/TopKey1/{\"To\":\"Json\",\"String\":\"Function\"}", - "category": "Structure", - "startLine": 15, + "propertyPath": "Properties.ImageId", + "category": "Best Practice", + "startLine": 33, "startColumn": 7, - "endLine": 15, - "endColumn": 40, - "ruleDescription": "Mappings are appropriately configured", - "phase": "LINT" + "endLine": 33, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W3696", - "severity": "WARN", - "message": "Resource type 'AWS::AppMesh::Mesh' is from a service that will be shut down on 2026-09-30. Plan to migrate to an alternative", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Mesh", + "logicalId": "myInstance", "entityType": "Resource", - "resourceType": "AWS::AppMesh::Mesh" + "resourceType": "AWS::EC2::Instance" }, - "category": "Deprecation", - "startLine": 20, - "startColumn": 3, - "endLine": 20, - "endColumn": 7, - "ruleDescription": "Resource type is from a service that is sunsetting", - "phase": "SCHEMA" + "propertyPath": "Properties.UserData", + "category": "Best Practice", + "startLine": 34, + "startColumn": 7, + "endLine": 34, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only", + "resolutionSource": "dynamic (Base64 with unresolvable argument)" + } }, { - "ruleId": "W3696", - "severity": "WARN", - "message": "Resource type 'AWS::AppMesh::Mesh' is from a service that will be shut down on 2026-09-30. Plan to migrate to an alternative", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Name' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Mesh2", + "logicalId": "myAlb", "entityType": "Resource", - "resourceType": "AWS::AppMesh::Mesh" + "resourceType": "AWS::ElasticLoadBalancingV2::LoadBalancer" }, - "category": "Deprecation", - "startLine": 33, - "startColumn": 3, - "endLine": 33, - "endColumn": 8, - "ruleDescription": "Resource type is from a service that is sunsetting", - "phase": "SCHEMA" + "propertyPath": "Properties.Name", + "category": "Best Practice", + "startLine": 52, + "startColumn": 7, + "endLine": 52, + "endColumn": 11, + "documentationUrl": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-loadbalancer.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I1022", + "ruleId": "I9001", "severity": "INFO", - "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", - "source": "CFN_LINT", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Cluster", + "logicalId": "LaunchConfiguration", "entityType": "Resource", - "resourceType": "AWS::ECS::Cluster" + "resourceType": "AWS::AutoScaling::LaunchConfiguration" }, - "propertyPath": "Properties.ClusterName.Fn::FindInMap.1.Fn::Join", - "category": "Intrinsic Function", - "startLine": 52, - "startColumn": 11, - "endLine": 52, - "endColumn": 19, - "ruleDescription": "Use Sub instead of Join", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Best Practice", + "startLine": 57, + "startColumn": 7, + "endLine": 57, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I1022", + "ruleId": "I9001", "severity": "INFO", - "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", - "source": "CFN_LINT", + "message": "Property 'InstanceType' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Cluster", - "entityType": "Resource", - "resourceType": "AWS::ECS::Cluster" - }, - "propertyPath": "Properties.ClusterName.Fn::FindInMap.2.Fn::Join", - "category": "Intrinsic Function", - "startLine": 56, - "startColumn": 11, - "endLine": 56, - "endColumn": 19, - "ruleDescription": "Use Sub instead of Join", - "phase": "LINT" - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "Queue", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "category": "Best Practice", - "startLine": 59, - "startColumn": 3, - "endLine": 59, - "endColumn": 8, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "Queue", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "category": "Best Practice", - "startLine": 59, - "startColumn": 3, - "endLine": 59, - "endColumn": 8, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I3013", - "severity": "INFO", - "message": "'MessageRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "Queue", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "propertyPath": "Properties", - "category": "Best Practice", - "startLine": 61, - "startColumn": 5, - "endLine": 61, - "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", - "phase": "LINT" - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'MeshName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Mesh", + "logicalId": "LaunchConfiguration", "entityType": "Resource", - "resourceType": "AWS::AppMesh::Mesh" + "resourceType": "AWS::AutoScaling::LaunchConfiguration" }, - "propertyPath": "Properties.MeshName", + "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 23, + "startLine": 58, "startColumn": 7, - "endLine": 23, - "endColumn": 15, + "endLine": 58, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -7743,151 +7837,66 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'MeshName' is create-only; updating it will cause resource replacement", + "message": "Property 'UserData' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Mesh2", + "logicalId": "LaunchConfiguration", "entityType": "Resource", - "resourceType": "AWS::AppMesh::Mesh" + "resourceType": "AWS::AutoScaling::LaunchConfiguration" }, - "propertyPath": "Properties.MeshName", + "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 36, + "startLine": 59, "startColumn": 7, - "endLine": 36, + "endLine": 59, "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "Fn::If on condition 'IsProd'" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ClusterName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Cluster", - "entityType": "Resource", - "resourceType": "AWS::ECS::Cluster" - }, - "propertyPath": "Properties.ClusterName", - "category": "Best Practice", - "startLine": 49, - "startColumn": 7, - "endLine": 49, - "endColumn": 18, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" + "resolutionSource": "dynamic (Base64 with unresolvable argument)" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'QueueName' is create-only; updating it will cause resource replacement", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Queue", + "logicalId": "myVPc2", "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" + "resourceType": "AWS::EC2::VPC" }, - "propertyPath": "Properties.QueueName", + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 62, + "startLine": 72, "startColumn": 7, - "endLine": 62, + "endLine": 72, "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sqs.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ClusterName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Cluster2", - "entityType": "Resource", - "resourceType": "AWS::ECS::Cluster" - }, - "propertyPath": "Properties.ClusterName", - "category": "Best Practice", - "startLine": 81, - "startColumn": 7, - "endLine": 81, - "endColumn": 18, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ClusterName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Cluster3", - "entityType": "Resource", - "resourceType": "AWS::ECS::Cluster" - }, - "propertyPath": "Properties.ClusterName", - "category": "Best Practice", - "startLine": 103, - "startColumn": 7, - "endLine": 103, - "endColumn": 18, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "dynamic (Sub:${myCidr}1)" } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Mesh' of type 'AWS::AppMesh::Mesh' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "Mesh", - "entityType": "Resource", - "resourceType": "AWS::AppMesh::Mesh" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 22, - "startColumn": 5, - "endLine": 22, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Mesh2' of type 'AWS::AppMesh::Mesh' supports Tags but none are configured", + "message": "Resource 'myInstance' of type 'AWS::EC2::Instance' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Mesh2", + "logicalId": "myInstance", "entityType": "Resource", - "resourceType": "AWS::AppMesh::Mesh" + "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 35, + "startLine": 32, "startColumn": 5, - "endLine": 35, + "endLine": 32, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -7895,19 +7904,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Cluster' of type 'AWS::ECS::Cluster' supports Tags but none are configured", + "message": "Resource 'mySubStack' of type 'AWS::CloudFormation::Stack' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Cluster", + "logicalId": "mySubStack", "entityType": "Resource", - "resourceType": "AWS::ECS::Cluster" + "resourceType": "AWS::CloudFormation::Stack" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 48, + "startLine": 43, "startColumn": 5, - "endLine": 48, + "endLine": 43, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -7915,19 +7924,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Queue' of type 'AWS::SQS::Queue' supports Tags but none are configured", + "message": "Resource 'myAlb' of type 'AWS::ElasticLoadBalancingV2::LoadBalancer' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Queue", + "logicalId": "myAlb", "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" + "resourceType": "AWS::ElasticLoadBalancingV2::LoadBalancer" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 61, + "startLine": 51, "startColumn": 5, - "endLine": 61, + "endLine": 51, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -7935,19 +7944,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Cluster2' of type 'AWS::ECS::Cluster' supports Tags but none are configured", + "message": "Resource 'MyStack' of type 'AWS::CloudFormation::Stack' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Cluster2", + "logicalId": "MyStack", "entityType": "Resource", - "resourceType": "AWS::ECS::Cluster" + "resourceType": "AWS::CloudFormation::Stack" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 80, + "startLine": 66, "startColumn": 5, - "endLine": 80, + "endLine": 66, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -7955,35 +7964,35 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Cluster3' of type 'AWS::ECS::Cluster' supports Tags but none are configured", + "message": "Resource 'myVPc2' of type 'AWS::EC2::VPC' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Cluster3", + "logicalId": "myVPc2", "entityType": "Resource", - "resourceType": "AWS::ECS::Cluster" + "resourceType": "AWS::EC2::VPC" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 102, + "startLine": 71, "startColumn": 5, - "endLine": 102, + "endLine": 71, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "good/generic.yaml": { - "filePath": "good/generic.yaml", + "good/functions/sub_needed.yaml": { + "filePath": "good/functions/sub_needed.yaml", "status": "OK", "metadata": { - "resourcesScanned": 13, + "resourcesScanned": 6, "counts": { - "fatal": 0, + "fatal": 3, "errors": 0, - "warnings": 3, - "informational": 25, + "warnings": 4, + "informational": 9, "debug": 0 }, "suppressed": 0, @@ -7992,41 +8001,126 @@ }, "diagnostics": [ { - "ruleId": "W9010", - "severity": "WARN", - "message": "Hardcoded AMI ID - use a parameter or mapping for portability", - "source": "ENGINE", + "ruleId": "F1020", + "severity": "FATAL", + "message": "Fn::GetAtt references non-existent resource 'GreetingLambda'", + "source": "SCHEMA", "entity": { - "logicalId": "MyEC2Instance", + "logicalId": "GreetingRequest", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::ApiGateway::Method" }, - "propertyPath": "Properties.ImageId", - "category": "Security", - "startLine": 75, + "suggestedFix": "Check that the GetAtt target resource exists in the template", + "category": "Intrinsic Function", + "startLine": 86, + "startColumn": 3, + "endLine": 86, + "endColumn": 18, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway.git", + "ruleDescription": "Ref/GetAtt target must exist", + "phase": "SCHEMA" + }, + { + "ruleId": "F1020", + "severity": "FATAL", + "message": "'GreetingResource' is not one of ['AMIId', 'AWS::AccountId', 'AWS::NoValue', 'AWS::NotificationARNs', 'AWS::Partition', 'AWS::Region', 'AWS::StackId', 'AWS::StackName', 'AWS::URLSuffix', 'GreetingRequest', 'IOTPolicies', 'Key', 'MyContentBucket', 'TestGoodStateMachine1', 'myPolicy', 'myPolicy2']", + "source": "SCHEMA", + "entity": { + "logicalId": "GreetingRequest", + "entityType": "Resource", + "resourceType": "AWS::ApiGateway::Method" + }, + "propertyPath": "Properties.ResourceId", + "suggestedFix": "Check that the Ref target exists as a resource, parameter, or pseudo-parameter", + "category": "Intrinsic Function", + "startLine": 114, "startColumn": 7, - "endLine": 75, - "endColumn": 14, - "ruleDescription": "Hardcoded AMI ID", + "endLine": 114, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway.git", + "ruleDescription": "Ref/GetAtt target must exist", + "phase": "SCHEMA", + "context": { + "resolutionSource": "dynamic (unknown ref target: GreetingResource)" + } + }, + { + "ruleId": "F1020", + "severity": "FATAL", + "message": "'GreetingApi' is not one of ['AMIId', 'AWS::AccountId', 'AWS::NoValue', 'AWS::NotificationARNs', 'AWS::Partition', 'AWS::Region', 'AWS::StackId', 'AWS::StackName', 'AWS::URLSuffix', 'GreetingRequest', 'IOTPolicies', 'Key', 'MyContentBucket', 'TestGoodStateMachine1', 'myPolicy', 'myPolicy2']", + "source": "SCHEMA", + "entity": { + "logicalId": "GreetingRequest", + "entityType": "Resource", + "resourceType": "AWS::ApiGateway::Method" + }, + "propertyPath": "Properties.RestApiId", + "suggestedFix": "Check that the Ref target exists as a resource, parameter, or pseudo-parameter", + "category": "Intrinsic Function", + "startLine": 115, + "startColumn": 7, + "endLine": 115, + "endColumn": 16, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway.git", + "ruleDescription": "Ref/GetAtt target must exist", + "phase": "SCHEMA", + "context": { + "resolutionSource": "dynamic (unknown ref target: GreetingApi)" + } + }, + { + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'MyContentBucket' is not referenced anywhere in the template", + "source": "CFN_LINT", + "entity": { + "logicalId": "MyContentBucket", + "entityType": "Parameter" + }, + "propertyPath": "Parameters/MyContentBucket", + "category": "Best Practice", + "startLine": 4, + "startColumn": 3, + "endLine": 4, + "endColumn": 18, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W9010", + "ruleId": "W2001", "severity": "WARN", - "message": "Hardcoded AMI ID - use a parameter or mapping for portability", + "message": "Parameter 'AMIId' is not referenced anywhere in the template", + "source": "CFN_LINT", + "entity": { + "logicalId": "AMIId", + "entityType": "Parameter" + }, + "propertyPath": "Parameters/AMIId", + "category": "Best Practice", + "startLine": 7, + "startColumn": 3, + "endLine": 7, + "endColumn": 8, + "ruleDescription": "Check if Parameters are Used", + "phase": "LINT" + }, + { + "ruleId": "W9002", + "severity": "WARN", + "message": "Property 'RoleArn' has a hardcoded ARN - use Ref, GetAtt, or a parameter instead", "source": "ENGINE", "entity": { - "logicalId": "MyEC2Instance1", + "logicalId": "TestGoodStateMachine1", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::StepFunctions::StateMachine" }, - "propertyPath": "Properties.ImageId", - "category": "Security", - "startLine": 95, + "propertyPath": "Properties.RoleArn", + "category": "Best Practice", + "startLine": 156, "startColumn": 7, - "endLine": 95, + "endLine": 156, "endColumn": 14, - "ruleDescription": "Hardcoded AMI ID", + "ruleDescription": "Hardcoded ARN property", "phase": "LINT" }, { @@ -8035,35 +8129,73 @@ "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", "source": "ENGINE", "entity": { - "logicalId": "LambdaFunction", + "logicalId": "TestGoodStateMachine1", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::StepFunctions::StateMachine" }, "category": "Security", - "startLine": 160, + "startLine": 137, "startColumn": 3, - "endLine": 160, - "endColumn": 17, + "endLine": 137, + "endColumn": 24, "ruleDescription": "Hardcoded account ID in ARN", "phase": "LINT" }, + { + "ruleId": "I1022", + "severity": "INFO", + "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", + "source": "CFN_LINT", + "entity": { + "logicalId": "GreetingRequest", + "entityType": "Resource", + "resourceType": "AWS::ApiGateway::Method" + }, + "propertyPath": "Properties.Integration.Uri.Fn::Join", + "category": "Intrinsic Function", + "startLine": 95, + "startColumn": 11, + "endLine": 95, + "endColumn": 19, + "ruleDescription": "Use Sub instead of Join", + "phase": "LINT" + }, + { + "ruleId": "I1022", + "severity": "INFO", + "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", + "source": "CFN_LINT", + "entity": { + "logicalId": "GreetingRequest", + "entityType": "Resource", + "resourceType": "AWS::ApiGateway::Method" + }, + "propertyPath": "Properties.Integration.RequestTemplates.application/json.Fn::Join", + "category": "Intrinsic Function", + "startLine": 107, + "startColumn": 13, + "endLine": 107, + "endColumn": 21, + "ruleDescription": "Use Sub instead of Join", + "phase": "LINT" + }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Path' is create-only; updating it will cause resource replacement", + "message": "Property 'HttpMethod' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "RootRole", + "logicalId": "GreetingRequest", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::ApiGateway::Method" }, - "propertyPath": "Properties.Path", + "propertyPath": "Properties.HttpMethod", "category": "Best Practice", - "startLine": 45, + "startLine": 90, "startColumn": 7, - "endLine": 45, - "endColumn": 11, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "endLine": 90, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -8073,134 +8205,231 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Path' is create-only; updating it will cause resource replacement", + "message": "Property 'ResourceId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "RootInstanceProfile", + "logicalId": "GreetingRequest", "entityType": "Resource", - "resourceType": "AWS::IAM::InstanceProfile" + "resourceType": "AWS::ApiGateway::Method" }, - "propertyPath": "Properties.Path", + "propertyPath": "Properties.ResourceId", "category": "Best Practice", - "startLine": 69, + "startLine": 114, "startColumn": 7, - "endLine": 69, - "endColumn": 11, + "endLine": 114, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "dynamic (unknown ref target: GreetingResource)" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "message": "Property 'RestApiId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MyEC2Instance", + "logicalId": "GreetingRequest", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::ApiGateway::Method" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Properties.RestApiId", "category": "Best Practice", - "startLine": 75, + "startLine": 115, "startColumn": 7, - "endLine": 75, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 115, + "endColumn": 16, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "dynamic (unknown ref target: GreetingApi)" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'PolicyName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MyEC2Instance", + "logicalId": "IOTPolicies", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::IoT::Policy" }, - "propertyPath": "Properties.InstanceType", + "propertyPath": "Properties.PolicyName", "category": "Best Practice", - "startLine": 76, + "startLine": 121, "startColumn": 7, - "endLine": 76, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 121, + "endColumn": 17, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only" } }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'KeyName' is create-only; updating it will cause resource replacement", + "message": "Resource 'Key' of type 'AWS::ApiGateway::ApiKey' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "MyEC2Instance", + "logicalId": "Key", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::ApiGateway::ApiKey" }, - "propertyPath": "Properties.KeyName", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 77, - "startColumn": 7, - "endLine": 77, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 84, + "startColumn": 5, + "endLine": 84, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'BlockDeviceMappings' is conditionally create-only; updating it may cause resource replacement", + "message": "Resource 'IOTPolicies' of type 'AWS::IoT::Policy' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "MyEC2Instance", + "logicalId": "IOTPolicies", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::IoT::Policy" }, - "propertyPath": "Properties.BlockDeviceMappings", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 79, + "startLine": 120, + "startColumn": 5, + "endLine": 120, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'TestGoodStateMachine1' of type 'AWS::StepFunctions::StateMachine' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "TestGoodStateMachine1", + "entityType": "Resource", + "resourceType": "AWS::StepFunctions::StateMachine" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 139, + "startColumn": 5, + "endLine": 139, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "good/functions/sub_needed_custom_excludes.yaml": { + "filePath": "good/functions/sub_needed_custom_excludes.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 1, + "errors": 1, + "warnings": 1, + "informational": 2, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "F3031", + "severity": "FATAL", + "message": "'TestRole-${Stage}' does not match pattern '^[\\w+=,.@-]+$'", + "source": "SCHEMA", + "entity": { + "logicalId": "TestRole", + "entityType": "Resource", + "resourceType": "AWS::IAM::Role" + }, + "propertyPath": "Properties.RoleName", + "category": "Schema", + "startLine": 10, "startColumn": 7, - "endLine": 79, - "endColumn": 26, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", + "endLine": 10, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "ruleDescription": "Value does not match pattern", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "actualValue": "TestRole-${Stage}", + "expectedConstraint": "^[\\w+=,.@-]+$" } }, + { + "ruleId": "E1029", + "severity": "ERROR", + "message": "Found an embedded parameter '${Stage}' outside of an 'Fn::Sub' at Properties.RoleName", + "source": "CFN_LINT", + "entity": { + "logicalId": "TestRole", + "entityType": "Resource", + "resourceType": "AWS::IAM::Role" + }, + "propertyPath": "Properties.RoleName", + "suggestedFix": "Wrap the string with Fn::Sub", + "category": "Intrinsic Function", + "startLine": 10, + "startColumn": 7, + "endLine": 10, + "endColumn": 15, + "ruleDescription": "Substitution variable ${X} requires Fn::Sub", + "phase": "LINT" + }, + { + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'Stage' is not referenced anywhere in the template", + "source": "CFN_LINT", + "entity": { + "logicalId": "Stage", + "entityType": "Parameter" + }, + "propertyPath": "Parameters/Stage", + "category": "Best Practice", + "startLine": 4, + "startColumn": 3, + "endLine": 4, + "endColumn": 8, + "ruleDescription": "Check if Parameters are Used", + "phase": "LINT" + }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'NetworkInterfaces' is create-only; updating it will cause resource replacement", + "message": "Property 'RoleName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MyEC2Instance", + "logicalId": "TestRole", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.NetworkInterfaces", + "propertyPath": "Properties.RoleName", "category": "Best Practice", - "startLine": 86, + "startLine": 10, "startColumn": 7, - "endLine": 86, - "endColumn": 24, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 10, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -8208,137 +8437,319 @@ } }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", + "message": "Resource 'TestRole' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "MyEC2Instance", + "logicalId": "TestRole", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.UserData", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 88, - "startColumn": 7, - "endLine": 88, + "startLine": 9, + "startColumn": 5, + "endLine": 9, "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "good/functions/sub_needed_transform.yaml": { + "filePath": "good/functions/sub_needed_transform.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 0, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [] + }, + "good/functions_findinmap.yaml": { + "filePath": "good/functions_findinmap.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 3, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 6, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { "ruleId": "I9001", "severity": "INFO", "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MyEC2Instance1", + "logicalId": "myInstance1", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 95, + "startLine": 14, "startColumn": 7, - "endLine": 95, + "endLine": 14, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "dynamic (FindInMap with dynamic map name)" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MyEC2Instance1", + "logicalId": "myInstance2", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.InstanceType", + "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 96, + "startLine": 18, "startColumn": 7, - "endLine": 96, - "endColumn": 19, + "endLine": 18, + "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only", + "resolutionSource": "dynamic (FindInMap with dynamic map name)" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'KeyName' is create-only; updating it will cause resource replacement", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MyEC2Instance1", + "logicalId": "myInstance3", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.KeyName", + "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 97, + "startLine": 26, "startColumn": 7, - "endLine": 97, + "endLine": 26, "endColumn": 14, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "dynamic (FindInMap with dynamic map name)" } }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'BlockDeviceMappings' is conditionally create-only; updating it may cause resource replacement", + "message": "Resource 'myInstance1' of type 'AWS::EC2::Instance' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "MyEC2Instance1", + "logicalId": "myInstance1", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.BlockDeviceMappings", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 98, - "startColumn": 7, - "endLine": 98, - "endColumn": 26, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 13, + "startColumn": 5, + "endLine": 13, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'NetworkInterfaces' is create-only; updating it will cause resource replacement", + "message": "Resource 'myInstance2' of type 'AWS::EC2::Instance' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "MyEC2Instance1", + "logicalId": "myInstance2", "entityType": "Resource", "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.NetworkInterfaces", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 106, + "startLine": 17, + "startColumn": 5, + "endLine": 17, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'myInstance3' of type 'AWS::EC2::Instance' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "myInstance3", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 25, + "startColumn": 5, + "endLine": 25, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "good/functions_findinmap_default_value.yaml": { + "filePath": "good/functions_findinmap_default_value.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 9, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 5, + "informational": 18, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "W3696", + "severity": "WARN", + "message": "Resource type 'AWS::AppMesh::Mesh' is from a service that will be shut down on 2026-09-30. Plan to migrate to an alternative", + "source": "CFN_LINT", + "entity": { + "logicalId": "Mesh0", + "entityType": "Resource", + "resourceType": "AWS::AppMesh::Mesh" + }, + "category": "Deprecation", + "startLine": 43, + "startColumn": 3, + "endLine": 43, + "endColumn": 8, + "ruleDescription": "Resource type is from a service that is sunsetting", + "phase": "SCHEMA" + }, + { + "ruleId": "W3696", + "severity": "WARN", + "message": "Resource type 'AWS::AppMesh::Mesh' is from a service that will be shut down on 2026-09-30. Plan to migrate to an alternative", + "source": "CFN_LINT", + "entity": { + "logicalId": "Mesh1", + "entityType": "Resource", + "resourceType": "AWS::AppMesh::Mesh" + }, + "category": "Deprecation", + "startLine": 59, + "startColumn": 3, + "endLine": 59, + "endColumn": 8, + "ruleDescription": "Resource type is from a service that is sunsetting", + "phase": "SCHEMA" + }, + { + "ruleId": "W3696", + "severity": "WARN", + "message": "Resource type 'AWS::AppMesh::Mesh' is from a service that will be shut down on 2026-09-30. Plan to migrate to an alternative", + "source": "CFN_LINT", + "entity": { + "logicalId": "Mesh2", + "entityType": "Resource", + "resourceType": "AWS::AppMesh::Mesh" + }, + "category": "Deprecation", + "startLine": 70, + "startColumn": 3, + "endLine": 70, + "endColumn": 8, + "ruleDescription": "Resource type is from a service that is sunsetting", + "phase": "SCHEMA" + }, + { + "ruleId": "W3696", + "severity": "WARN", + "message": "Resource type 'AWS::AppMesh::Mesh' is from a service that will be shut down on 2026-09-30. Plan to migrate to an alternative", + "source": "CFN_LINT", + "entity": { + "logicalId": "Mesh3", + "entityType": "Resource", + "resourceType": "AWS::AppMesh::Mesh" + }, + "category": "Deprecation", + "startLine": 81, + "startColumn": 3, + "endLine": 81, + "endColumn": 8, + "ruleDescription": "Resource type is from a service that is sunsetting", + "phase": "SCHEMA" + }, + { + "ruleId": "W3696", + "severity": "WARN", + "message": "Resource type 'AWS::AppMesh::Mesh' is from a service that will be shut down on 2026-09-30. Plan to migrate to an alternative", + "source": "CFN_LINT", + "entity": { + "logicalId": "Mesh4", + "entityType": "Resource", + "resourceType": "AWS::AppMesh::Mesh" + }, + "category": "Deprecation", + "startLine": 93, + "startColumn": 3, + "endLine": 93, + "endColumn": 8, + "ruleDescription": "Resource type is from a service that is sunsetting", + "phase": "SCHEMA" + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ClusterName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "Cluster0", + "entityType": "Resource", + "resourceType": "AWS::ECS::Cluster" + }, + "propertyPath": "Properties.ClusterName", + "category": "Best Practice", + "startLine": 14, "startColumn": 7, - "endLine": 106, - "endColumn": 24, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 14, + "endColumn": 18, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -8348,117 +8759,195 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'ClusterName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MyEC2Instance1", + "logicalId": "Cluster1", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::ECS::Cluster" }, - "propertyPath": "Properties.UserData", + "propertyPath": "Properties.ClusterName", "category": "Best Practice", - "startLine": 113, + "startLine": 22, "startColumn": 7, - "endLine": 113, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 22, + "endColumn": 18, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'AvailabilityZones' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'ClusterName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ElasticLoadBalancer", + "logicalId": "Cluster2", "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancing::LoadBalancer" + "resourceType": "AWS::ECS::Cluster" }, - "propertyPath": "Properties.AvailabilityZones", + "propertyPath": "Properties.ClusterName", "category": "Best Practice", - "startLine": 124, + "startLine": 30, "startColumn": 7, - "endLine": 124, - "endColumn": 24, - "documentationUrl": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb.html", + "endLine": 30, + "endColumn": 18, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'HealthCheck' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'ClusterName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ElasticLoadBalancer", + "logicalId": "Cluster3", "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancing::LoadBalancer" + "resourceType": "AWS::ECS::Cluster" }, - "propertyPath": "Properties.HealthCheck", + "propertyPath": "Properties.ClusterName", "category": "Best Practice", - "startLine": 133, + "startLine": 38, "startColumn": 7, - "endLine": 133, + "endLine": 38, "endColumn": 18, - "documentationUrl": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only" } }, { - "ruleId": "I9003", - "severity": "INFO", - "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", - "source": "ENGINE", - "category": "Best Practice", - "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", - "phase": "LINT" - }, - { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'RootRole' of type 'AWS::IAM::Role' supports Tags but none are configured", + "message": "Property 'MeshName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "RootRole", + "logicalId": "Mesh0", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::AppMesh::Mesh" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.MeshName", "category": "Best Practice", - "startLine": 35, - "startColumn": 5, - "endLine": 35, + "startLine": 46, + "startColumn": 7, + "endLine": 46, "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'MeshName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "Mesh1", + "entityType": "Resource", + "resourceType": "AWS::AppMesh::Mesh" + }, + "propertyPath": "Properties.MeshName", + "category": "Best Practice", + "startLine": 62, + "startColumn": 7, + "endLine": 62, + "endColumn": 15, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'MeshName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "Mesh2", + "entityType": "Resource", + "resourceType": "AWS::AppMesh::Mesh" + }, + "propertyPath": "Properties.MeshName", + "category": "Best Practice", + "startLine": 73, + "startColumn": 7, + "endLine": 73, + "endColumn": 15, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'MeshName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "Mesh3", + "entityType": "Resource", + "resourceType": "AWS::AppMesh::Mesh" + }, + "propertyPath": "Properties.MeshName", + "category": "Best Practice", + "startLine": 84, + "startColumn": 7, + "endLine": 84, + "endColumn": 15, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'MeshName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "Mesh4", + "entityType": "Resource", + "resourceType": "AWS::AppMesh::Mesh" + }, + "propertyPath": "Properties.MeshName", + "category": "Best Practice", + "startLine": 96, + "startColumn": 7, + "endLine": 96, + "endColumn": 15, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'MyEC2Instance' of type 'AWS::EC2::Instance' supports Tags but none are configured", + "message": "Resource 'Cluster0' of type 'AWS::ECS::Cluster' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "MyEC2Instance", + "logicalId": "Cluster0", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::ECS::Cluster" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 74, + "startLine": 13, "startColumn": 5, - "endLine": 74, + "endLine": 13, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -8466,39 +8955,39 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'mySnsTopic' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Cluster1' of type 'AWS::ECS::Cluster' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "mySnsTopic", + "logicalId": "Cluster1", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::ECS::Cluster" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 90, - "startColumn": 3, - "endLine": 90, - "endColumn": 13, + "startLine": 21, + "startColumn": 5, + "endLine": 21, + "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'MyEC2Instance1' of type 'AWS::EC2::Instance' supports Tags but none are configured", + "message": "Resource 'Cluster2' of type 'AWS::ECS::Cluster' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "MyEC2Instance1", + "logicalId": "Cluster2", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::ECS::Cluster" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 94, + "startLine": 29, "startColumn": 5, - "endLine": 94, + "endLine": 29, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -8506,19 +8995,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'ElasticIP' of type 'AWS::EC2::EIP' supports Tags but none are configured", + "message": "Resource 'Cluster3' of type 'AWS::ECS::Cluster' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ElasticIP", + "logicalId": "Cluster3", "entityType": "Resource", - "resourceType": "AWS::EC2::EIP" + "resourceType": "AWS::ECS::Cluster" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 119, + "startLine": 37, "startColumn": 5, - "endLine": 119, + "endLine": 37, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -8526,19 +9015,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'ElasticLoadBalancer' of type 'AWS::ElasticLoadBalancing::LoadBalancer' supports Tags but none are configured", + "message": "Resource 'Mesh0' of type 'AWS::AppMesh::Mesh' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ElasticLoadBalancer", + "logicalId": "Mesh0", "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancing::LoadBalancer" + "resourceType": "AWS::AppMesh::Mesh" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 123, + "startLine": 45, "startColumn": 5, - "endLine": 123, + "endLine": 45, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -8546,19 +9035,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'IamPipeline' of type 'AWS::CloudFormation::Stack' supports Tags but none are configured", + "message": "Resource 'Mesh1' of type 'AWS::AppMesh::Mesh' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "IamPipeline", + "logicalId": "Mesh1", "entityType": "Resource", - "resourceType": "AWS::CloudFormation::Stack" + "resourceType": "AWS::AppMesh::Mesh" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 144, + "startLine": 61, "startColumn": 5, - "endLine": 144, + "endLine": 61, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -8566,58 +9055,39 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'LambdaFunction' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "message": "Resource 'Mesh2' of type 'AWS::AppMesh::Mesh' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "LambdaFunction", + "logicalId": "Mesh2", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::AppMesh::Mesh" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 162, + "startLine": 72, "startColumn": 5, - "endLine": 162, + "endLine": 72, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" - } - ] - }, - "good/getatt_provisioned_product_outputs.yaml": { - "filePath": "good/getatt_provisioned_product_outputs.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 2, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 2, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'ProvisionedProduct' of type 'AWS::ServiceCatalog::CloudFormationProvisionedProduct' supports Tags but none are configured", + "message": "Resource 'Mesh3' of type 'AWS::AppMesh::Mesh' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ProvisionedProduct", + "logicalId": "Mesh3", "entityType": "Resource", - "resourceType": "AWS::ServiceCatalog::CloudFormationProvisionedProduct" + "resourceType": "AWS::AppMesh::Mesh" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 8, + "startLine": 83, "startColumn": 5, - "endLine": 8, + "endLine": 83, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -8625,35 +9095,35 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Topic' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Mesh4' of type 'AWS::AppMesh::Mesh' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Topic", + "logicalId": "Mesh4", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::AppMesh::Mesh" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 13, + "startLine": 95, "startColumn": 5, - "endLine": 13, + "endLine": 95, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "good/getatt_ref_typed_nested_attribute.yaml": { - "filePath": "good/getatt_ref_typed_nested_attribute.yaml", + "good/functions_findinmap_enhanced.yaml": { + "filePath": "good/functions_findinmap_enhanced.yaml", "status": "OK", "metadata": { - "resourcesScanned": 2, + "resourcesScanned": 6, "counts": { "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 7, + "errors": 1, + "warnings": 2, + "informational": 17, "debug": 0 }, "suppressed": 0, @@ -8662,181 +9132,168 @@ }, "diagnostics": [ { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "E7001", + "severity": "ERROR", + "message": "Mapping 'MapName'.'TopKey1' key '{\"To\":\"Json\",\"String\":\"Function\"}' does not match format '^[a-zA-Z0-9]+$'", + "source": "CFN_LINT", "entity": { - "logicalId": "Database", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "logicalId": "MapName", + "entityType": "Mapping" }, - "propertyPath": "Properties.Engine", - "category": "Best Practice", - "startLine": 11, + "propertyPath": "Mappings/MapName/TopKey1/{\"To\":\"Json\",\"String\":\"Function\"}", + "category": "Structure", + "startLine": 15, "startColumn": 7, - "endLine": 11, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "endLine": 15, + "endColumn": 40, + "ruleDescription": "Mappings are appropriately configured", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'MasterUsername' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W3696", + "severity": "WARN", + "message": "Resource type 'AWS::AppMesh::Mesh' is from a service that will be shut down on 2026-09-30. Plan to migrate to an alternative", + "source": "CFN_LINT", "entity": { - "logicalId": "Database", + "logicalId": "Mesh", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::AppMesh::Mesh" }, - "propertyPath": "Properties.MasterUsername", - "category": "Best Practice", - "startLine": 14, - "startColumn": 7, - "endLine": 14, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "category": "Deprecation", + "startLine": 20, + "startColumn": 3, + "endLine": 20, + "endColumn": 7, + "ruleDescription": "Resource type is from a service that is sunsetting", + "phase": "SCHEMA" }, { - "ruleId": "I9001", + "ruleId": "W3696", + "severity": "WARN", + "message": "Resource type 'AWS::AppMesh::Mesh' is from a service that will be shut down on 2026-09-30. Plan to migrate to an alternative", + "source": "CFN_LINT", + "entity": { + "logicalId": "Mesh2", + "entityType": "Resource", + "resourceType": "AWS::AppMesh::Mesh" + }, + "category": "Deprecation", + "startLine": 33, + "startColumn": 3, + "endLine": 33, + "endColumn": 8, + "ruleDescription": "Resource type is from a service that is sunsetting", + "phase": "SCHEMA" + }, + { + "ruleId": "I1022", "severity": "INFO", - "message": "Property 'StorageEncrypted' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", + "source": "CFN_LINT", "entity": { - "logicalId": "Database", + "logicalId": "Cluster", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::ECS::Cluster" }, - "propertyPath": "Properties.StorageEncrypted", - "category": "Best Practice", - "startLine": 16, - "startColumn": 7, - "endLine": 16, - "endColumn": 23, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "propertyPath": "Properties.ClusterName.Fn::FindInMap.1.Fn::Join", + "category": "Intrinsic Function", + "startLine": 52, + "startColumn": 11, + "endLine": 52, + "endColumn": 19, + "ruleDescription": "Use Sub instead of Join", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I1022", "severity": "INFO", - "message": "Property 'BackupRetentionPeriod' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", + "source": "CFN_LINT", "entity": { - "logicalId": "Database", + "logicalId": "Cluster", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::ECS::Cluster" }, - "propertyPath": "Properties.BackupRetentionPeriod", - "category": "Best Practice", - "startLine": 17, - "startColumn": 7, - "endLine": 17, - "endColumn": 28, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "propertyPath": "Properties.ClusterName.Fn::FindInMap.2.Fn::Join", + "category": "Intrinsic Function", + "startLine": 56, + "startColumn": 11, + "endLine": 56, + "endColumn": 19, + "ruleDescription": "Use Sub instead of Join", + "phase": "LINT" }, { - "ruleId": "I9003", + "ruleId": "I3011", "severity": "INFO", - "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", - "source": "ENGINE", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "Queue", + "entityType": "Resource", + "resourceType": "AWS::SQS::Queue" + }, "category": "Best Practice", - "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", + "startLine": 59, + "startColumn": 3, + "endLine": 59, + "endColumn": 8, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "I9040", + "ruleId": "I3011", "severity": "INFO", - "message": "Resource 'Database' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "Database", + "logicalId": "Queue", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 10, - "startColumn": 5, - "endLine": 10, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "startLine": 59, + "startColumn": 3, + "endLine": 59, + "endColumn": 8, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "I9040", + "ruleId": "I3013", "severity": "INFO", - "message": "Resource 'Parameter' of type 'AWS::SSM::Parameter' supports Tags but none are configured", - "source": "ENGINE", + "message": "'MessageRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "Parameter", + "logicalId": "Queue", "entityType": "Resource", - "resourceType": "AWS::SSM::Parameter" + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties", "category": "Best Practice", - "startLine": 22, + "startLine": 61, "startColumn": 5, - "endLine": 22, + "endLine": 61, "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check resources with auto expiring content have explicit retention period", "phase": "LINT" - } - ] - }, - "good/getazs_resolves_current_regions.yaml": { - "filePath": "good/getazs_resolves_current_regions.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 2, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 8, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "message": "Property 'MeshName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SubnetApEast2", + "logicalId": "Mesh", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::AppMesh::Mesh" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.MeshName", "category": "Best Practice", - "startLine": 10, + "startLine": 23, "startColumn": 7, - "endLine": 10, - "endColumn": 12, + "endLine": 23, + "endColumn": 15, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -8846,41 +9303,42 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Property 'MeshName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SubnetApEast2", + "logicalId": "Mesh2", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::AppMesh::Mesh" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Properties.MeshName", "category": "Best Practice", - "startLine": 11, + "startLine": 36, "startColumn": 7, - "endLine": 11, - "endColumn": 16, + "endLine": 36, + "endColumn": 15, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "Fn::If on condition 'IsProd'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", + "message": "Property 'ClusterName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SubnetApEast2", + "logicalId": "Cluster", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::ECS::Cluster" }, - "propertyPath": "Properties.AvailabilityZone", + "propertyPath": "Properties.ClusterName", "category": "Best Practice", - "startLine": 12, + "startLine": 49, "startColumn": 7, - "endLine": 12, - "endColumn": 23, + "endLine": 49, + "endColumn": 18, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -8890,19 +9348,20 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "message": "Property 'QueueName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SubnetMxCentral1", + "logicalId": "Queue", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.QueueName", "category": "Best Practice", - "startLine": 16, + "startLine": 62, "startColumn": 7, - "endLine": 16, - "endColumn": 12, + "endLine": 62, + "endColumn": 16, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sqs.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -8912,19 +9371,19 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Property 'ClusterName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SubnetMxCentral1", + "logicalId": "Cluster2", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::ECS::Cluster" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Properties.ClusterName", "category": "Best Practice", - "startLine": 17, + "startLine": 81, "startColumn": 7, - "endLine": 17, - "endColumn": 16, + "endLine": 81, + "endColumn": 18, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -8934,19 +9393,19 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", + "message": "Property 'ClusterName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SubnetMxCentral1", + "logicalId": "Cluster3", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::ECS::Cluster" }, - "propertyPath": "Properties.AvailabilityZone", + "propertyPath": "Properties.ClusterName", "category": "Best Practice", - "startLine": 18, + "startLine": 103, "startColumn": 7, - "endLine": 18, - "endColumn": 23, + "endLine": 103, + "endColumn": 18, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -8956,19 +9415,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'SubnetApEast2' of type 'AWS::EC2::Subnet' supports Tags but none are configured", + "message": "Resource 'Mesh' of type 'AWS::AppMesh::Mesh' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "SubnetApEast2", + "logicalId": "Mesh", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::AppMesh::Mesh" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 9, + "startLine": 22, "startColumn": 5, - "endLine": 9, + "endLine": 22, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -8976,149 +9435,115 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'SubnetMxCentral1' of type 'AWS::EC2::Subnet' supports Tags but none are configured", + "message": "Resource 'Mesh2' of type 'AWS::AppMesh::Mesh' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "SubnetMxCentral1", + "logicalId": "Mesh2", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::AppMesh::Mesh" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 15, + "startLine": 35, "startColumn": 5, - "endLine": 15, + "endLine": 35, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" - } - ] - }, - "good/good_conditions_valid_refs.yaml": { - "filePath": "good/good_conditions_valid_refs.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 1, - "informational": 1, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "W8001", - "severity": "WARN", - "message": "Condition 'IsDev' is not used by any resource or Fn::If", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Cluster' of type 'AWS::ECS::Cluster' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "IsDev", - "entityType": "Condition" + "logicalId": "Cluster", + "entityType": "Resource", + "resourceType": "AWS::ECS::Cluster" }, - "propertyPath": "Conditions/IsDev", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 13, - "startColumn": 3, - "endLine": 13, - "endColumn": 8, - "ruleDescription": "Check if Conditions are Used", + "startLine": 48, + "startColumn": 5, + "endLine": 48, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'ProdBucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Resource 'Queue' of type 'AWS::SQS::Queue' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ProdBucket", + "logicalId": "Queue", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::SQS::Queue" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 22, - "startColumn": 3, - "endLine": 22, - "endColumn": 13, + "startLine": 61, + "startColumn": 5, + "endLine": 61, + "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" - } - ] - }, - "good/iam_conditional_resource_arns.yaml": { - "filePath": "good/iam_conditional_resource_arns.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 2, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 0, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [] - }, - "good/iam_intrinsic_resource_arns.yaml": { - "filePath": "good/iam_intrinsic_resource_arns.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 3, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 1, - "debug": 0 + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Cluster2' of type 'AWS::ECS::Cluster' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "Cluster2", + "entityType": "Resource", + "resourceType": "AWS::ECS::Cluster" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 80, + "startColumn": 5, + "endLine": 80, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'SomeBucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Resource 'Cluster3' of type 'AWS::ECS::Cluster' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "SomeBucket", + "logicalId": "Cluster3", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::ECS::Cluster" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 10, - "startColumn": 3, - "endLine": 10, - "endColumn": 13, + "startLine": 102, + "startColumn": 5, + "endLine": 102, + "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "good/iam_intrinsic_resource_arns_schema_valid.yaml": { - "filePath": "good/iam_intrinsic_resource_arns_schema_valid.yaml", + "good/generic.yaml": { + "filePath": "good/generic.yaml", "status": "OK", "metadata": { - "resourcesScanned": 5, + "resourcesScanned": 13, "counts": { "fatal": 0, "errors": 0, - "warnings": 0, - "informational": 8, + "warnings": 3, + "informational": 25, "debug": 0 }, "suppressed": 0, @@ -9127,65 +9552,79 @@ }, "diagnostics": [ { - "ruleId": "I1022", - "severity": "INFO", - "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", - "source": "CFN_LINT", + "ruleId": "W9010", + "severity": "WARN", + "message": "Hardcoded AMI ID - use a parameter or mapping for portability", + "source": "ENGINE", "entity": { - "logicalId": "PolicyWithJoinResource", + "logicalId": "MyEC2Instance", "entityType": "Resource", - "resourceType": "AWS::IAM::Policy" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.PolicyDocument.Statement.0.Resource.Fn::Join", - "category": "Intrinsic Function", - "startLine": 48, - "startColumn": 15, - "endLine": 48, - "endColumn": 23, - "ruleDescription": "Use Sub instead of Join", + "propertyPath": "Properties.ImageId", + "category": "Security", + "startLine": 75, + "startColumn": 7, + "endLine": 75, + "endColumn": 14, + "ruleDescription": "Hardcoded AMI ID", "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'RoleName' is create-only; updating it will cause resource replacement", + "ruleId": "W9010", + "severity": "WARN", + "message": "Hardcoded AMI ID - use a parameter or mapping for portability", "source": "ENGINE", "entity": { - "logicalId": "RoleInlinePolicy", + "logicalId": "MyEC2Instance1", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.RoleName", - "category": "Best Practice", - "startLine": 17, + "propertyPath": "Properties.ImageId", + "category": "Security", + "startLine": 95, "startColumn": 7, - "endLine": 17, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "endLine": 95, + "endColumn": 14, + "ruleDescription": "Hardcoded AMI ID", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'UserName' is create-only; updating it will cause resource replacement", + "ruleId": "W9013", + "severity": "WARN", + "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", "source": "ENGINE", "entity": { - "logicalId": "PolicyWithRefResource", + "logicalId": "LambdaFunction", "entityType": "Resource", - "resourceType": "AWS::IAM::UserPolicy" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.UserName", - "category": "Best Practice", - "startLine": 65, - "startColumn": 7, - "endLine": 65, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", - "ruleDescription": "Create-only property updated triggers resource replacement", + "category": "Security", + "startLine": 160, + "startColumn": 3, + "endLine": 160, + "endColumn": 17, + "ruleDescription": "Hardcoded account ID in ARN", + "phase": "LINT" + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Path' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "RootRole", + "entityType": "Resource", + "resourceType": "AWS::IAM::Role" + }, + "propertyPath": "Properties.Path", + "category": "Best Practice", + "startLine": 45, + "startColumn": 7, + "endLine": 45, + "endColumn": 11, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only" @@ -9194,20 +9633,19 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'PolicyName' is create-only; updating it will cause resource replacement", + "message": "Property 'Path' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "PolicyWithRefResource", + "logicalId": "RootInstanceProfile", "entityType": "Resource", - "resourceType": "AWS::IAM::UserPolicy" + "resourceType": "AWS::IAM::InstanceProfile" }, - "propertyPath": "Properties.PolicyName", + "propertyPath": "Properties.Path", "category": "Best Practice", - "startLine": 66, + "startLine": 69, "startColumn": 7, - "endLine": 66, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "endLine": 69, + "endColumn": 11, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -9217,44 +9655,66 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'InstanceArn' is create-only; updating it will cause resource replacement", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SSOPermissionSet", + "logicalId": "MyEC2Instance", "entityType": "Resource", - "resourceType": "AWS::SSO::PermissionSet" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.InstanceArn", + "propertyPath": "Properties.ImageId", + "category": "Best Practice", + "startLine": 75, + "startColumn": 7, + "endLine": 75, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "MyEC2Instance", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Properties.InstanceType", "category": "Best Practice", "startLine": 76, "startColumn": 7, "endLine": 76, - "endColumn": 18, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sso/aws-sso-permissionset", + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter 'SsoInstanceArn' (type String)" + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Name' is create-only; updating it will cause resource replacement", + "message": "Property 'KeyName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SSOPermissionSet", + "logicalId": "MyEC2Instance", "entityType": "Resource", - "resourceType": "AWS::SSO::PermissionSet" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Name", + "propertyPath": "Properties.KeyName", "category": "Best Practice", "startLine": 77, "startColumn": 7, "endLine": 77, - "endColumn": 11, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sso/aws-sso-permissionset", + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -9262,173 +9722,283 @@ } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'RoleInlinePolicy' of type 'AWS::IAM::Role' supports Tags but none are configured", + "message": "Property 'BlockDeviceMappings' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "RoleInlinePolicy", + "logicalId": "MyEC2Instance", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.BlockDeviceMappings", "category": "Best Practice", - "startLine": 16, - "startColumn": 5, - "endLine": 16, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 79, + "startColumn": 7, + "endLine": 79, + "endColumn": 26, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'SSOPermissionSet' of type 'AWS::SSO::PermissionSet' supports Tags but none are configured", + "message": "Property 'NetworkInterfaces' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SSOPermissionSet", + "logicalId": "MyEC2Instance", "entityType": "Resource", - "resourceType": "AWS::SSO::PermissionSet" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.NetworkInterfaces", "category": "Best Practice", - "startLine": 75, - "startColumn": 5, - "endLine": 75, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "good/iam_valid.yaml": { - "filePath": "good/iam_valid.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 2, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 1, - "debug": 0 + "startLine": 86, + "startColumn": 7, + "endLine": 86, + "endColumn": 24, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'Role' of type 'AWS::IAM::Role' supports Tags but none are configured", + "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Role", + "logicalId": "MyEC2Instance", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 18, - "startColumn": 5, - "endLine": 18, + "startLine": 88, + "startColumn": 7, + "endLine": 88, "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "good/kms_key_identifier_forms.yaml": { - "filePath": "good/kms_key_identifier_forms.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 7, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 3, - "informational": 7, - "debug": 0 + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "W9013", - "severity": "WARN", - "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "TopicKeyArn", + "logicalId": "MyEC2Instance1", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::EC2::Instance" }, - "category": "Security", - "startLine": 8, - "startColumn": 3, - "endLine": 8, + "propertyPath": "Properties.ImageId", + "category": "Best Practice", + "startLine": 95, + "startColumn": 7, + "endLine": 95, "endColumn": 14, - "ruleDescription": "Hardcoded account ID in ARN", - "phase": "LINT" + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W9013", - "severity": "WARN", - "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "TopicAliasArn", + "logicalId": "MyEC2Instance1", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::EC2::Instance" }, - "category": "Security", - "startLine": 16, - "startColumn": 3, - "endLine": 16, - "endColumn": 16, - "ruleDescription": "Hardcoded account ID in ARN", - "phase": "LINT" - }, - { - "ruleId": "W9013", - "severity": "WARN", - "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", + "propertyPath": "Properties.InstanceType", + "category": "Best Practice", + "startLine": 96, + "startColumn": 7, + "endLine": 96, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'KeyName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "TopicMultiRegionKeyArn", + "logicalId": "MyEC2Instance1", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::EC2::Instance" }, - "category": "Security", - "startLine": 24, - "startColumn": 3, - "endLine": 24, - "endColumn": 25, - "ruleDescription": "Hardcoded account ID in ARN", + "propertyPath": "Properties.KeyName", + "category": "Best Practice", + "startLine": 97, + "startColumn": 7, + "endLine": 97, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'BlockDeviceMappings' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "MyEC2Instance1", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Properties.BlockDeviceMappings", + "category": "Best Practice", + "startLine": 98, + "startColumn": 7, + "endLine": 98, + "endColumn": 26, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'NetworkInterfaces' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "MyEC2Instance1", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Properties.NetworkInterfaces", + "category": "Best Practice", + "startLine": 106, + "startColumn": 7, + "endLine": 106, + "endColumn": 24, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "MyEC2Instance1", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Properties.UserData", + "category": "Best Practice", + "startLine": 113, + "startColumn": 7, + "endLine": 113, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'AvailabilityZones' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ElasticLoadBalancer", + "entityType": "Resource", + "resourceType": "AWS::ElasticLoadBalancing::LoadBalancer" + }, + "propertyPath": "Properties.AvailabilityZones", + "category": "Best Practice", + "startLine": 124, + "startColumn": 7, + "endLine": 124, + "endColumn": 24, + "documentationUrl": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'HealthCheck' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ElasticLoadBalancer", + "entityType": "Resource", + "resourceType": "AWS::ElasticLoadBalancing::LoadBalancer" + }, + "propertyPath": "Properties.HealthCheck", + "category": "Best Practice", + "startLine": 133, + "startColumn": 7, + "endLine": 133, + "endColumn": 18, + "documentationUrl": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } + }, + { + "ruleId": "I9003", + "severity": "INFO", + "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", + "source": "ENGINE", + "category": "Best Practice", + "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'TopicKeyId' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'RootRole' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "TopicKeyId", + "logicalId": "RootRole", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::IAM::Role" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 6, + "startLine": 35, "startColumn": 5, - "endLine": 6, + "endLine": 35, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -9436,19 +10006,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'TopicKeyArn' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'MyEC2Instance' of type 'AWS::EC2::Instance' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "TopicKeyArn", + "logicalId": "MyEC2Instance", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 10, + "startLine": 74, "startColumn": 5, - "endLine": 10, + "endLine": 74, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -9456,19 +10026,39 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'TopicAliasName' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'mySnsTopic' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "TopicAliasName", + "logicalId": "mySnsTopic", "entityType": "Resource", "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 14, + "startLine": 90, + "startColumn": 3, + "endLine": 90, + "endColumn": 13, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'MyEC2Instance1' of type 'AWS::EC2::Instance' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "MyEC2Instance1", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 94, "startColumn": 5, - "endLine": 14, + "endLine": 94, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -9476,19 +10066,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'TopicAliasArn' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'ElasticIP' of type 'AWS::EC2::EIP' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "TopicAliasArn", + "logicalId": "ElasticIP", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::EC2::EIP" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 18, + "startLine": 119, "startColumn": 5, - "endLine": 18, + "endLine": 119, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -9496,19 +10086,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'TopicMultiRegionKeyId' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'ElasticLoadBalancer' of type 'AWS::ElasticLoadBalancing::LoadBalancer' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "TopicMultiRegionKeyId", + "logicalId": "ElasticLoadBalancer", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::ElasticLoadBalancing::LoadBalancer" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 22, + "startLine": 123, "startColumn": 5, - "endLine": 22, + "endLine": 123, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -9516,19 +10106,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'TopicMultiRegionKeyArn' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'IamPipeline' of type 'AWS::CloudFormation::Stack' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "TopicMultiRegionKeyArn", + "logicalId": "IamPipeline", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::CloudFormation::Stack" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 26, + "startLine": 144, "startColumn": 5, - "endLine": 26, + "endLine": 144, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -9536,35 +10126,35 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'TopicIntrinsicAliasArn' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'LambdaFunction' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "TopicIntrinsicAliasArn", + "logicalId": "LambdaFunction", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::Lambda::Function" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 30, + "startLine": 162, "startColumn": 5, - "endLine": 30, + "endLine": 162, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "good/lambda_permission_source_account.yaml": { - "filePath": "good/lambda_permission_source_account.yaml", + "good/getatt_provisioned_product_outputs.yaml": { + "filePath": "good/getatt_provisioned_product_outputs.yaml", "status": "OK", "metadata": { - "resourcesScanned": 1, + "resourcesScanned": 2, "counts": { "fatal": 0, "errors": 0, - "warnings": 2, - "informational": 4, + "warnings": 0, + "informational": 2, "debug": 0 }, "suppressed": 0, @@ -9573,80 +10163,104 @@ }, "diagnostics": [ { - "ruleId": "W9002", - "severity": "WARN", - "message": "Property 'SourceArn' has a hardcoded ARN - use Ref, GetAtt, or a parameter instead", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'ProvisionedProduct' of type 'AWS::ServiceCatalog::CloudFormationProvisionedProduct' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Perm", + "logicalId": "ProvisionedProduct", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::ServiceCatalog::CloudFormationProvisionedProduct" }, - "propertyPath": "Properties.SourceArn", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", "startLine": 8, - "startColumn": 7, + "startColumn": 5, "endLine": 8, - "endColumn": 16, - "ruleDescription": "Hardcoded ARN property", + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "W9013", - "severity": "WARN", - "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Topic' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Perm", + "logicalId": "Topic", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::SNS::Topic" }, - "category": "Security", - "startLine": 2, - "startColumn": 3, - "endLine": 2, - "endColumn": 7, - "ruleDescription": "Hardcoded account ID in ARN", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 13, + "startColumn": 5, + "endLine": 13, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "good/getatt_ref_typed_nested_attribute.yaml": { + "filePath": "good/getatt_ref_typed_nested_attribute.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 2, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 7, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Action' is create-only; updating it will cause resource replacement", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Perm", + "logicalId": "Database", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Action", + "propertyPath": "Properties.Engine", "category": "Best Practice", - "startLine": 5, + "startLine": 11, "startColumn": 7, - "endLine": 5, + "endLine": 11, "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "message": "Property 'MasterUsername' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Perm", + "logicalId": "Database", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.FunctionName", + "propertyPath": "Properties.MasterUsername", "category": "Best Practice", - "startLine": 6, + "startLine": 14, "startColumn": 7, - "endLine": 6, - "endColumn": 19, + "endLine": 14, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -9656,19 +10270,20 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Principal' is create-only; updating it will cause resource replacement", + "message": "Property 'StorageEncrypted' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Perm", + "logicalId": "Database", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Principal", + "propertyPath": "Properties.StorageEncrypted", "category": "Best Practice", - "startLine": 7, + "startLine": 16, "startColumn": 7, - "endLine": 7, - "endColumn": 16, + "endLine": 16, + "endColumn": 23, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -9678,37 +10293,87 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'SourceArn' is create-only; updating it will cause resource replacement", + "message": "Property 'BackupRetentionPeriod' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Perm", + "logicalId": "Database", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.SourceArn", + "propertyPath": "Properties.BackupRetentionPeriod", "category": "Best Practice", - "startLine": 8, + "startLine": 17, "startColumn": 7, - "endLine": 8, - "endColumn": 16, + "endLine": 17, + "endColumn": 28, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } + }, + { + "ruleId": "I9003", + "severity": "INFO", + "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", + "source": "ENGINE", + "category": "Best Practice", + "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Database' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "Database", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 10, + "startColumn": 5, + "endLine": 10, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Parameter' of type 'AWS::SSM::Parameter' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "Parameter", + "entityType": "Resource", + "resourceType": "AWS::SSM::Parameter" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 22, + "startColumn": 5, + "endLine": 22, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" } ] }, - "good/lambda_permission_sourcearn_ref_no_account.yaml": { - "filePath": "good/lambda_permission_sourcearn_ref_no_account.yaml", + "good/getazs_resolves_current_regions.yaml": { + "filePath": "good/getazs_resolves_current_regions.yaml", "status": "OK", "metadata": { - "resourcesScanned": 1, + "resourcesScanned": 2, "counts": { "fatal": 0, "errors": 0, - "warnings": 1, - "informational": 4, + "warnings": 0, + "informational": 8, "debug": 0 }, "suppressed": 0, @@ -9717,40 +10382,43 @@ }, "diagnostics": [ { - "ruleId": "W9002", - "severity": "WARN", - "message": "Property 'SourceArn' has a hardcoded ARN - use Ref, GetAtt, or a parameter instead", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Perm", + "logicalId": "SubnetApEast2", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.SourceArn", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 15, + "startLine": 10, "startColumn": 7, - "endLine": 15, - "endColumn": 16, - "ruleDescription": "Hardcoded ARN property", - "phase": "LINT" + "endLine": 10, + "endColumn": 12, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Action' is create-only; updating it will cause resource replacement", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Perm", + "logicalId": "SubnetApEast2", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.Action", + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 12, + "startLine": 11, "startColumn": 7, - "endLine": 12, - "endColumn": 13, + "endLine": 11, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -9760,19 +10428,19 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Perm", + "logicalId": "SubnetApEast2", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.FunctionName", + "propertyPath": "Properties.AvailabilityZone", "category": "Best Practice", - "startLine": 13, + "startLine": 12, "startColumn": 7, - "endLine": 13, - "endColumn": 19, + "endLine": 12, + "endColumn": 23, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -9782,19 +10450,19 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Principal' is create-only; updating it will cause resource replacement", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Perm", + "logicalId": "SubnetMxCentral1", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.Principal", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 14, + "startLine": 16, "startColumn": 7, - "endLine": 14, - "endColumn": 16, + "endLine": 16, + "endColumn": 12, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -9804,98 +10472,41 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'SourceArn' is create-only; updating it will cause resource replacement", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Perm", + "logicalId": "SubnetMxCentral1", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.SourceArn", + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 15, + "startLine": 17, "startColumn": 7, - "endLine": 15, + "endLine": 17, "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only" } - } - ] - }, - "good/lambda_snapstart.yaml": { - "filePath": "good/lambda_snapstart.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 2, - "informational": 2, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "W2530", - "severity": "WARN", - "message": "SnapStart is enabled but no AWS::Lambda::Version resource is attached", - "source": "CFN_LINT", - "entity": { - "logicalId": "SnapStartFunc", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "Properties.SnapStart", - "suggestedFix": "Add an AWS::Lambda::Version resource that references this function", - "category": "Best Practice", - "startLine": 13, - "startColumn": 7, - "endLine": 13, - "endColumn": 16, - "ruleDescription": "Validate that SnapStart is properly configured", - "phase": "LINT" - }, - { - "ruleId": "W9013", - "severity": "WARN", - "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", - "source": "ENGINE", - "entity": { - "logicalId": "SnapStartFunc", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "category": "Security", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 16, - "ruleDescription": "Hardcoded account ID in ARN", - "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SnapStartFunc", + "logicalId": "SubnetMxCentral1", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.FunctionName", + "propertyPath": "Properties.AvailabilityZone", "category": "Best Practice", - "startLine": 6, + "startLine": 18, "startColumn": 7, - "endLine": 6, - "endColumn": 19, + "endLine": 18, + "endColumn": 23, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -9905,35 +10516,55 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'SnapStartFunc' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "message": "Resource 'SubnetApEast2' of type 'AWS::EC2::Subnet' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "SnapStartFunc", + "logicalId": "SubnetApEast2", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::EC2::Subnet" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 5, + "startLine": 9, "startColumn": 5, - "endLine": 5, + "endLine": 9, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'SubnetMxCentral1' of type 'AWS::EC2::Subnet' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "SubnetMxCentral1", + "entityType": "Resource", + "resourceType": "AWS::EC2::Subnet" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 15, + "startColumn": 5, + "endLine": 15, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "good/lambda_zipfile.yaml": { - "filePath": "good/lambda_zipfile.yaml", + "good/good_conditions_valid_refs.yaml": { + "filePath": "good/good_conditions_valid_refs.yaml", "status": "OK", "metadata": { "resourcesScanned": 1, "counts": { "fatal": 0, "errors": 0, - "warnings": 0, - "informational": 3, + "warnings": 1, + "informational": 1, "debug": 0 }, "suppressed": 0, @@ -9942,73 +10573,50 @@ }, "diagnostics": [ { - "ruleId": "I3042", - "severity": "INFO", - "message": "ARN in Resource LambdaFn contains hardcoded Partition in ARN or incorrectly placed Pseudo Parameters", + "ruleId": "W8001", + "severity": "WARN", + "message": "Condition 'IsDev' is not used by any resource or Fn::If", "source": "CFN_LINT", "entity": { - "logicalId": "LambdaFn", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "logicalId": "IsDev", + "entityType": "Condition" }, - "propertyPath": "Properties.Role.Fn::Sub", + "propertyPath": "Conditions/IsDev", "category": "Best Practice", - "startLine": 9, - "startColumn": 7, - "endLine": 9, - "endColumn": 14, - "ruleDescription": "ARNs should use correctly placed Pseudo Parameters", + "startLine": 13, + "startColumn": 3, + "endLine": 13, + "endColumn": 8, + "ruleDescription": "Check if Conditions are Used", "phase": "LINT" }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "LambdaFn", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "Properties.FunctionName", - "category": "Best Practice", - "startLine": 6, - "startColumn": 7, - "endLine": 6, - "endColumn": 19, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'LambdaFn' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "message": "Resource 'ProdBucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "LambdaFn", + "logicalId": "ProdBucket", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::S3::Bucket" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, + "startLine": 22, + "startColumn": 3, + "endLine": 22, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "good/lifecycle_intrinsic_scenarios.yaml": { - "filePath": "good/lifecycle_intrinsic_scenarios.yaml", + "good/iam_conditional_resource_arns.yaml": { + "filePath": "good/iam_conditional_resource_arns.yaml", "status": "OK", "metadata": { - "resourcesScanned": 13, + "resourcesScanned": 2, "counts": { "fatal": 0, "errors": 0, @@ -10022,16 +10630,16 @@ }, "diagnostics": [] }, - "good/mappings/name.yaml": { - "filePath": "good/mappings/name.yaml", + "good/iam_intrinsic_resource_arns.yaml": { + "filePath": "good/iam_intrinsic_resource_arns.yaml", "status": "OK", "metadata": { - "resourcesScanned": 0, + "resourcesScanned": 3, "counts": { - "fatal": 1, + "fatal": 0, "errors": 0, - "warnings": 1, - "informational": 0, + "warnings": 0, + "informational": 1, "debug": 0 }, "suppressed": 0, @@ -10040,48 +10648,37 @@ }, "diagnostics": [ { - "ruleId": "F0001", - "severity": "FATAL", - "message": "Resources section must exist and be non-empty", - "source": "SCHEMA", - "category": "Structure", - "startLine": 10, - "startColumn": 1, - "endLine": 10, - "endColumn": 10, - "ruleDescription": "Resources section must exist and be non-empty", - "phase": "SCHEMA" - }, - { - "ruleId": "W7001", - "severity": "WARN", - "message": "Mapping 'RegionMap' is not referenced by any Fn::FindInMap", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'SomeBucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "RegionMap", - "entityType": "Mapping" + "logicalId": "SomeBucket", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Mappings/RegionMap", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 3, + "startLine": 10, "startColumn": 3, - "endLine": 3, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 10, + "endColumn": 13, + "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "good/mappings/used.yaml": { - "filePath": "good/mappings/used.yaml", + "good/iam_intrinsic_resource_arns_schema_valid.yaml": { + "filePath": "good/iam_intrinsic_resource_arns_schema_valid.yaml", "status": "OK", "metadata": { - "resourcesScanned": 1, + "resourcesScanned": 5, "counts": { "fatal": 0, - "errors": 1, + "errors": 0, "warnings": 0, - "informational": 3, + "informational": 8, "debug": 0 }, "suppressed": 0, @@ -10090,43 +10687,41 @@ }, "diagnostics": [ { - "ruleId": "E1151", - "severity": "ERROR", - "message": "'vpc-123456' does not match format 'AWS::EC2::VPC.Id'", + "ruleId": "I1022", + "severity": "INFO", + "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", "source": "CFN_LINT", "entity": { - "logicalId": "mySubnet", + "logicalId": "PolicyWithJoinResource", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::IAM::Policy" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.PolicyDocument.Statement.0.Resource.Fn::Join", "category": "Intrinsic Function", - "startLine": 21, - "startColumn": 7, - "endLine": 21, - "endColumn": 12, - "ruleDescription": "Validate VPC id format", - "phase": "SCHEMA", - "context": { - "actualValue": "vpc-123456" - } + "startLine": 48, + "startColumn": 15, + "endLine": 48, + "endColumn": 23, + "ruleDescription": "Use Sub instead of Join", + "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "message": "Property 'RoleName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "mySubnet", + "logicalId": "RoleInlinePolicy", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.RoleName", "category": "Best Practice", - "startLine": 21, + "startLine": 17, "startColumn": 7, - "endLine": 21, - "endColumn": 12, + "endLine": 17, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -10136,1913 +10731,148 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Property 'UserName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "mySubnet", + "logicalId": "PolicyWithRefResource", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::IAM::UserPolicy" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Properties.UserName", "category": "Best Practice", - "startLine": 23, + "startLine": 65, "startColumn": 7, - "endLine": 23, - "endColumn": 16, + "endLine": 65, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "dynamic (FindInMap with dynamic map name)" + "lifecycle": "create-only" } }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'mySubnet' of type 'AWS::EC2::Subnet' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "mySubnet", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 20, - "startColumn": 5, - "endLine": 20, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "good/mappings_valid.yaml": { - "filePath": "good/mappings_valid.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 1, - "informational": 1, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "W7001", - "severity": "WARN", - "message": "Mapping 'RegionMap' is not referenced by any Fn::FindInMap", - "source": "CFN_LINT", - "entity": { - "logicalId": "RegionMap", - "entityType": "Mapping" - }, - "propertyPath": "Mappings/RegionMap", - "category": "Best Practice", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", - "phase": "LINT" - }, - { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'R' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Property 'PolicyName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "R", - "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 9, - "startColumn": 3, - "endLine": 9, - "endColumn": 4, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "good/metadata_context_complete.yaml": { - "filePath": "good/metadata_context_complete.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 6, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 13, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "OrderQueue", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "category": "Best Practice", - "startLine": 18, - "startColumn": 3, - "endLine": 18, - "endColumn": 13, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "OrderQueue", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "category": "Best Practice", - "startLine": 18, - "startColumn": 3, - "endLine": 18, - "endColumn": 13, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "LegacyTable", - "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" - }, - "category": "Best Practice", - "startLine": 35, - "startColumn": 3, - "endLine": 35, - "endColumn": 14, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "LegacyTable", - "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" - }, - "category": "Best Practice", - "startLine": 35, - "startColumn": 3, - "endLine": 35, - "endColumn": 14, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "ServiceLogGroup", + "logicalId": "PolicyWithRefResource", "entityType": "Resource", - "resourceType": "AWS::Logs::LogGroup" + "resourceType": "AWS::IAM::UserPolicy" }, + "propertyPath": "Properties.PolicyName", "category": "Best Practice", - "startLine": 64, - "startColumn": 3, - "endLine": 64, - "endColumn": 18, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 66, + "startColumn": 7, + "endLine": 66, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "ServiceLogGroup", - "entityType": "Resource", - "resourceType": "AWS::Logs::LogGroup" - }, - "category": "Best Practice", - "startLine": 64, - "startColumn": 3, - "endLine": 64, - "endColumn": 18, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I3013", - "severity": "INFO", - "message": "'MessageRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "OrderQueue", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "propertyPath": "Properties", - "category": "Best Practice", - "startLine": 18, - "startColumn": 3, - "endLine": 18, - "endColumn": 13, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", - "phase": "LINT" - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "LegacyTable", - "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" - }, - "propertyPath": "Properties.KeySchema", - "category": "Best Practice", - "startLine": 38, - "startColumn": 7, - "endLine": 38, - "endColumn": 16, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'OrderQueue' of type 'AWS::SQS::Queue' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "OrderQueue", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 18, - "startColumn": 3, - "endLine": 18, - "endColumn": 13, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'LegacyTable' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "LegacyTable", - "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 37, - "startColumn": 5, - "endLine": 37, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'ServiceLogGroup' of type 'AWS::Logs::LogGroup' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "ServiceLogGroup", - "entityType": "Resource", - "resourceType": "AWS::Logs::LogGroup" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 66, - "startColumn": 5, - "endLine": 66, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8a' of type 'AWS::Lambda::Function' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8a", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 70, - "startColumn": 5, - "endLine": 70, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'CustomResourceProviderframeworkonEvent' of type 'AWS::Lambda::Function' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "CustomResourceProviderframeworkonEvent", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 78, - "startColumn": 5, - "endLine": 78, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "good/minimal.yaml": { - "filePath": "good/minimal.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 1, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'IamPipeline' of type 'AWS::CloudFormation::Stack' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "IamPipeline", - "entityType": "Resource", - "resourceType": "AWS::CloudFormation::Stack" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 9, - "startColumn": 5, - "endLine": 9, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "good/modules/minimal.yaml": { - "filePath": "good/modules/minimal.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 2, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 1, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'OtherResource' of type 'AWS::S3::Bucket' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "OtherResource", - "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 8, - "startColumn": 3, - "endLine": 8, - "endColumn": 16, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "good/neptune_valid_instanceclass.yaml": { - "filePath": "good/neptune_valid_instanceclass.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 4, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "Instance", - "entityType": "Resource", - "resourceType": "AWS::Neptune::DBInstance" - }, - "category": "Best Practice", - "startLine": 2, - "startColumn": 3, - "endLine": 2, - "endColumn": 11, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "Instance", - "entityType": "Resource", - "resourceType": "AWS::Neptune::DBInstance" - }, - "category": "Best Practice", - "startLine": 2, - "startColumn": 3, - "endLine": 2, - "endColumn": 11, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I9003", - "severity": "INFO", - "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", - "source": "ENGINE", - "category": "Best Practice", - "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Instance' of type 'AWS::Neptune::DBInstance' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "Instance", - "entityType": "Resource", - "resourceType": "AWS::Neptune::DBInstance" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 4, - "startColumn": 5, - "endLine": 4, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "good/no_value.yaml": { - "filePath": "good/no_value.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 5, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 2, - "informational": 13, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'pProdMonitoringInterval' is not referenced anywhere in the template", - "source": "CFN_LINT", - "entity": { - "logicalId": "pProdMonitoringInterval", - "entityType": "Parameter" - }, - "propertyPath": "Parameters/pProdMonitoringInterval", - "category": "Best Practice", - "startLine": 45, - "startColumn": 5, - "endLine": 45, - "endColumn": 28, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" - }, - { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'pDevMonitoringInterval' is not referenced anywhere in the template", - "source": "CFN_LINT", - "entity": { - "logicalId": "pDevMonitoringInterval", - "entityType": "Parameter" - }, - "propertyPath": "Parameters/pDevMonitoringInterval", - "category": "Best Practice", - "startLine": 49, - "startColumn": 5, - "endLine": 49, - "endColumn": 27, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "rDBServerInstance", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" - }, - "category": "Best Practice", - "startLine": 123, - "startColumn": 5, - "endLine": 123, - "endColumn": 22, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "rDBServerInstance", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" - }, - "category": "Best Practice", - "startLine": 123, - "startColumn": 5, - "endLine": 123, - "endColumn": 22, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Description' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "rParameterGroup", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBParameterGroup" - }, - "propertyPath": "Properties.Description", - "category": "Best Practice", - "startLine": 59, - "startColumn": 13, - "endLine": 59, - "endColumn": 24, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Family' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "rParameterGroup", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBParameterGroup" - }, - "propertyPath": "Properties.Family", - "category": "Best Practice", - "startLine": 60, - "startColumn": 13, - "endLine": 60, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter 'pDBParameterGroupFamily' (type String)" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'AutoMinorVersionUpgrade' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "rDBServerInstance", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" - }, - "propertyPath": "Properties.AutoMinorVersionUpgrade", - "category": "Best Practice", - "startLine": 128, - "startColumn": 13, - "endLine": 128, - "endColumn": 36, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'BackupRetentionPeriod' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "rDBServerInstance", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" - }, - "propertyPath": "Properties.BackupRetentionPeriod", - "category": "Best Practice", - "startLine": 129, - "startColumn": 13, - "endLine": 129, - "endColumn": 34, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'DBParameterGroupName' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "rDBServerInstance", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" - }, - "propertyPath": "Properties.DBParameterGroupName", - "category": "Best Practice", - "startLine": 132, - "startColumn": 13, - "endLine": 132, - "endColumn": 33, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only", - "resolutionSource": "Ref to 'rParameterGroup'" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'DBSubnetGroupName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "rDBServerInstance", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" - }, - "propertyPath": "Properties.DBSubnetGroupName", - "category": "Best Practice", - "startLine": 133, - "startColumn": 13, - "endLine": 133, - "endColumn": 30, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'rDBSubnetGroup'" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "rDBServerInstance", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" - }, - "propertyPath": "Properties.Engine", - "category": "Best Practice", - "startLine": 134, - "startColumn": 13, - "endLine": 134, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only", - "resolutionSource": "parameter 'pDBEngine' (type String)" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'MasterUsername' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "rDBServerInstance", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" - }, - "propertyPath": "Properties.MasterUsername", - "category": "Best Practice", - "startLine": 138, - "startColumn": 13, - "endLine": 138, - "endColumn": 27, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter 'pDBMasterUsername' (type String)" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'MultiAZ' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "rDBServerInstance", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" - }, - "propertyPath": "Properties.MultiAZ", - "category": "Best Practice", - "startLine": 145, - "startColumn": 13, - "endLine": 145, - "endColumn": 20, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only", - "resolutionSource": "Fn::If on condition 'MultiAZ'" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'StorageEncrypted' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "rDBServerInstance", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" - }, - "propertyPath": "Properties.StorageEncrypted", - "category": "Best Practice", - "startLine": 148, - "startColumn": 13, - "endLine": 148, - "endColumn": 29, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'rDBMonitoringRole' of type 'AWS::IAM::Role' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "rDBMonitoringRole", - "entityType": "Resource", - "resourceType": "AWS::IAM::Role" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 96, - "startColumn": 9, - "endLine": 96, - "endColumn": 19, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "good/no_w3010_on_unlisted_type.yaml": { - "filePath": "good/no_w3010_on_unlisted_type.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 1, - "informational": 7, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "W2501", - "severity": "WARN", - "message": "Property 'MasterUserPassword' should not be a hardcoded string - use a parameter with NoEcho or a dynamic reference", - "source": "CFN_LINT", - "entity": { - "logicalId": "Cluster", - "entityType": "Resource", - "resourceType": "AWS::DocDB::DBCluster" - }, - "propertyPath": "Properties.MasterUserPassword", - "category": "Security", - "startLine": 11, - "startColumn": 7, - "endLine": 11, - "endColumn": 25, - "ruleDescription": "Check if Password Properties are correctly configured", - "phase": "LINT" - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "Cluster", - "entityType": "Resource", - "resourceType": "AWS::DocDB::DBCluster" - }, - "category": "Best Practice", - "startLine": 6, - "startColumn": 3, - "endLine": 6, - "endColumn": 10, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "Cluster", - "entityType": "Resource", - "resourceType": "AWS::DocDB::DBCluster" - }, - "category": "Best Practice", - "startLine": 6, - "startColumn": 3, - "endLine": 6, - "endColumn": 10, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I3013", - "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "Cluster", - "entityType": "Resource", - "resourceType": "AWS::DocDB::DBCluster" - }, - "propertyPath": "Properties", - "category": "Best Practice", - "startLine": 8, - "startColumn": 5, - "endLine": 8, - "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", - "phase": "LINT" - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'DBClusterIdentifier' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Cluster", - "entityType": "Resource", - "resourceType": "AWS::DocDB::DBCluster" - }, - "propertyPath": "Properties.DBClusterIdentifier", - "category": "Best Practice", - "startLine": 9, - "startColumn": 7, - "endLine": 9, - "endColumn": 26, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'MasterUsername' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Cluster", - "entityType": "Resource", - "resourceType": "AWS::DocDB::DBCluster" - }, - "propertyPath": "Properties.MasterUsername", - "category": "Best Practice", - "startLine": 10, - "startColumn": 7, - "endLine": 10, - "endColumn": 21, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'AvailabilityZones' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Cluster", - "entityType": "Resource", - "resourceType": "AWS::DocDB::DBCluster" - }, - "propertyPath": "Properties.AvailabilityZones", - "category": "Best Practice", - "startLine": 12, - "startColumn": 7, - "endLine": 12, - "endColumn": 24, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Cluster' of type 'AWS::DocDB::DBCluster' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "Cluster", - "entityType": "Resource", - "resourceType": "AWS::DocDB::DBCluster" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 8, - "startColumn": 5, - "endLine": 8, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "good/output_value_string.yaml": { - "filePath": "good/output_value_string.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 4, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "Queue", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "category": "Best Practice", - "startLine": 17, - "startColumn": 3, - "endLine": 17, - "endColumn": 8, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "Queue", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "category": "Best Practice", - "startLine": 17, - "startColumn": 3, - "endLine": 17, - "endColumn": 8, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I3013", - "severity": "INFO", - "message": "'MessageRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "Queue", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "propertyPath": "Properties", - "category": "Best Practice", - "startLine": 17, - "startColumn": 3, - "endLine": 17, - "endColumn": 8, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Queue' of type 'AWS::SQS::Queue' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "Queue", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 17, - "startColumn": 3, - "endLine": 17, - "endColumn": 8, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "good/override/complete.yaml": { - "filePath": "good/override/complete.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 3, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 1, - "informational": 6, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "W9010", - "severity": "WARN", - "message": "Hardcoded AMI ID - use a parameter or mapping for portability", - "source": "ENGINE", - "entity": { - "logicalId": "untaggedInstance", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.ImageId", - "category": "Security", - "startLine": 13, - "startColumn": 7, - "endLine": 13, - "endColumn": 14, - "ruleDescription": "Hardcoded AMI ID", - "phase": "LINT" - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "myS3Bucket", - "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" - }, - "propertyPath": "Properties.BucketName", - "category": "Best Practice", - "startLine": 9, - "startColumn": 7, - "endLine": 9, - "endColumn": 17, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "untaggedInstance", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.ImageId", - "category": "Best Practice", - "startLine": 13, - "startColumn": 7, - "endLine": 13, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "VPC", - "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" - }, - "propertyPath": "Properties.CidrBlock", - "category": "Best Practice", - "startLine": 17, - "startColumn": 9, - "endLine": 17, - "endColumn": 18, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'myS3Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "myS3Bucket", - "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 8, - "startColumn": 5, - "endLine": 8, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'untaggedInstance' of type 'AWS::EC2::Instance' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "untaggedInstance", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 12, - "startColumn": 5, - "endLine": 12, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'VPC' of type 'AWS::EC2::VPC' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "VPC", - "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 16, - "startColumn": 7, - "endLine": 16, - "endColumn": 17, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "good/override/required.yaml": { - "filePath": "good/override/required.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 2, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "myS3Bucket", - "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" - }, - "propertyPath": "Properties.BucketName", - "category": "Best Practice", - "startLine": 9, - "startColumn": 7, - "endLine": 9, - "endColumn": 17, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'myS3Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "myS3Bucket", - "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 8, - "startColumn": 5, - "endLine": 8, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "good/param_constraints_valid.yaml": { - "filePath": "good/param_constraints_valid.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 2, - "informational": 1, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'ValidParam' is not referenced anywhere in the template", - "source": "CFN_LINT", - "entity": { - "logicalId": "ValidParam", - "entityType": "Parameter" - }, - "propertyPath": "Parameters/ValidParam", - "category": "Best Practice", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 13, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" - }, - { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'ValidNumber' is not referenced anywhere in the template", - "source": "CFN_LINT", - "entity": { - "logicalId": "ValidNumber", - "entityType": "Parameter" - }, - "propertyPath": "Parameters/ValidNumber", - "category": "Best Practice", - "startLine": 9, - "startColumn": 3, - "endLine": 9, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "Bucket", - "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 15, - "startColumn": 3, - "endLine": 15, - "endColumn": 9, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "good/parameters/F2012_cdl_default_split.yaml": { - "filePath": "good/parameters/F2012_cdl_default_split.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 6, - "informational": 0, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'CDLSingleElementAllowed' is not referenced anywhere in the template", - "source": "CFN_LINT", - "entity": { - "logicalId": "CDLSingleElementAllowed", - "entityType": "Parameter" - }, - "propertyPath": "Parameters/CDLSingleElementAllowed", - "category": "Best Practice", - "startLine": 5, - "startColumn": 3, - "endLine": 5, - "endColumn": 26, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" - }, - { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'CDLMultipleElementsAllowed' is not referenced anywhere in the template", - "source": "CFN_LINT", - "entity": { - "logicalId": "CDLMultipleElementsAllowed", - "entityType": "Parameter" - }, - "propertyPath": "Parameters/CDLMultipleElementsAllowed", - "category": "Best Practice", - "startLine": 12, - "startColumn": 3, - "endLine": 12, - "endColumn": 29, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" - }, - { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'CDLWhitespaceTrimsToValid' is not referenced anywhere in the template", - "source": "CFN_LINT", - "entity": { - "logicalId": "CDLWhitespaceTrimsToValid", - "entityType": "Parameter" - }, - "propertyPath": "Parameters/CDLWhitespaceTrimsToValid", - "category": "Best Practice", - "startLine": 19, - "startColumn": 3, - "endLine": 19, - "endColumn": 28, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" - }, - { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'CDLListStringTypeValid' is not referenced anywhere in the template", - "source": "CFN_LINT", - "entity": { - "logicalId": "CDLListStringTypeValid", - "entityType": "Parameter" - }, - "propertyPath": "Parameters/CDLListStringTypeValid", - "category": "Best Practice", - "startLine": 26, - "startColumn": 3, - "endLine": 26, - "endColumn": 25, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" - }, - { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'CDLNoAllowedValues' is not referenced anywhere in the template", - "source": "CFN_LINT", - "entity": { - "logicalId": "CDLNoAllowedValues", - "entityType": "Parameter" - }, - "propertyPath": "Parameters/CDLNoAllowedValues", - "category": "Best Practice", - "startLine": 33, - "startColumn": 3, - "endLine": 33, - "endColumn": 21, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" - }, - { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'CDLEmptyAllowedValues' is not referenced anywhere in the template", - "source": "CFN_LINT", - "entity": { - "logicalId": "CDLEmptyAllowedValues", - "entityType": "Parameter" - }, - "propertyPath": "Parameters/CDLEmptyAllowedValues", - "category": "Best Practice", - "startLine": 37, - "startColumn": 3, - "endLine": 37, - "endColumn": 24, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" - } - ] - }, - "good/parameters/default.yaml": { - "filePath": "good/parameters/default.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 0, - "counts": { - "fatal": 3, - "errors": 0, - "warnings": 14, - "informational": 0, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "F0001", - "severity": "FATAL", - "message": "Resources section must exist and be non-empty", - "source": "SCHEMA", - "category": "Structure", - "startLine": 81, - "startColumn": 1, - "endLine": 81, - "endColumn": 10, - "ruleDescription": "Resources section must exist and be non-empty", - "phase": "SCHEMA" - }, - { - "ruleId": "F2012", - "severity": "FATAL", - "message": "Parameter 'CDLAllowedValues' Default 'four' is not in AllowedValues ['one', 'two', 'three,four']", - "source": "SCHEMA", - "entity": { - "logicalId": "CDLAllowedValues", - "entityType": "Parameter" - }, - "propertyPath": "Parameters/CDLAllowedValues/Default", - "category": "Parameter", - "startLine": 62, - "startColumn": 5, - "endLine": 62, - "endColumn": 12, - "ruleDescription": "Parameter Default must be in AllowedValues", - "phase": "SCHEMA" - }, - { - "ruleId": "F2012", - "severity": "FATAL", - "message": "Parameter 'CDLAllowedValues' Default 'three' is not in AllowedValues ['one', 'two', 'three,four']", - "source": "SCHEMA", - "entity": { - "logicalId": "CDLAllowedValues", - "entityType": "Parameter" - }, - "propertyPath": "Parameters/CDLAllowedValues/Default", - "category": "Parameter", - "startLine": 62, - "startColumn": 5, - "endLine": 62, - "endColumn": 12, - "ruleDescription": "Parameter Default must be in AllowedValues", - "phase": "SCHEMA" - }, - { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'myAllowedPattern' is not referenced anywhere in the template", - "source": "CFN_LINT", - "entity": { - "logicalId": "myAllowedPattern", - "entityType": "Parameter" - }, - "propertyPath": "Parameters/myAllowedPattern", - "category": "Best Practice", - "startLine": 4, - "startColumn": 3, - "endLine": 4, - "endColumn": 19, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" - }, - { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'myMinValue' is not referenced anywhere in the template", - "source": "CFN_LINT", - "entity": { - "logicalId": "myMinValue", - "entityType": "Parameter" - }, - "propertyPath": "Parameters/myMinValue", - "category": "Best Practice", - "startLine": 8, - "startColumn": 3, - "endLine": 8, - "endColumn": 13, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" - }, - { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'myMaxValue' is not referenced anywhere in the template", - "source": "CFN_LINT", - "entity": { - "logicalId": "myMaxValue", - "entityType": "Parameter" - }, - "propertyPath": "Parameters/myMaxValue", - "category": "Best Practice", - "startLine": 12, - "startColumn": 3, - "endLine": 12, - "endColumn": 13, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" - }, - { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'myAllowedValue' is not referenced anywhere in the template", - "source": "CFN_LINT", - "entity": { - "logicalId": "myAllowedValue", - "entityType": "Parameter" - }, - "propertyPath": "Parameters/myAllowedValue", - "category": "Best Practice", - "startLine": 16, - "startColumn": 3, - "endLine": 16, - "endColumn": 17, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" - }, - { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'myMinLength' is not referenced anywhere in the template", - "source": "CFN_LINT", - "entity": { - "logicalId": "myMinLength", - "entityType": "Parameter" - }, - "propertyPath": "Parameters/myMinLength", - "category": "Best Practice", - "startLine": 23, - "startColumn": 3, - "endLine": 23, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" - }, - { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'myMaxLength' is not referenced anywhere in the template", - "source": "CFN_LINT", - "entity": { - "logicalId": "myMaxLength", - "entityType": "Parameter" - }, - "propertyPath": "Parameters/myMaxLength", - "category": "Best Practice", - "startLine": 27, - "startColumn": 3, - "endLine": 27, - "endColumn": 14, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" - }, - { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'ArtifactoryDbAdmin' is not referenced anywhere in the template", - "source": "CFN_LINT", - "entity": { - "logicalId": "ArtifactoryDbAdmin", - "entityType": "Parameter" - }, - "propertyPath": "Parameters/ArtifactoryDbAdmin", - "category": "Best Practice", - "startLine": 31, - "startColumn": 3, - "endLine": 31, - "endColumn": 21, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" - }, - { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'CentralAccountId' is not referenced anywhere in the template", - "source": "CFN_LINT", - "entity": { - "logicalId": "CentralAccountId", - "entityType": "Parameter" - }, - "propertyPath": "Parameters/CentralAccountId", - "category": "Best Practice", - "startLine": 37, - "startColumn": 3, - "endLine": 37, - "endColumn": 19, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" - }, - { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'CDLAllowedPattern' is not referenced anywhere in the template", - "source": "CFN_LINT", - "entity": { - "logicalId": "CDLAllowedPattern", - "entityType": "Parameter" - }, - "propertyPath": "Parameters/CDLAllowedPattern", - "category": "Best Practice", - "startLine": 42, - "startColumn": 3, - "endLine": 42, - "endColumn": 20, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" - }, - { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'CDLAllowedPatternWithSpaceInDefault' is not referenced anywhere in the template", - "source": "CFN_LINT", - "entity": { - "logicalId": "CDLAllowedPatternWithSpaceInDefault", - "entityType": "Parameter" - }, - "propertyPath": "Parameters/CDLAllowedPatternWithSpaceInDefault", - "category": "Best Practice", - "startLine": 48, - "startColumn": 3, - "endLine": 48, - "endColumn": 38, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" - }, - { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'CDLAllowedValues' is not referenced anywhere in the template", - "source": "CFN_LINT", + "message": "Property 'InstanceArn' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "CDLAllowedValues", - "entityType": "Parameter" + "logicalId": "SSOPermissionSet", + "entityType": "Resource", + "resourceType": "AWS::SSO::PermissionSet" }, - "propertyPath": "Parameters/CDLAllowedValues", + "propertyPath": "Properties.InstanceArn", "category": "Best Practice", - "startLine": 58, - "startColumn": 3, - "endLine": 58, - "endColumn": 19, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "startLine": 76, + "startColumn": 7, + "endLine": 76, + "endColumn": 18, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sso/aws-sso-permissionset", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "parameter 'SsoInstanceArn' (type String)" + } }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'CDLAllowedValuesWithSpaceInDefault' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Name' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "CDLAllowedValuesWithSpaceInDefault", - "entityType": "Parameter" + "logicalId": "SSOPermissionSet", + "entityType": "Resource", + "resourceType": "AWS::SSO::PermissionSet" }, - "propertyPath": "Parameters/CDLAllowedValuesWithSpaceInDefault", + "propertyPath": "Properties.Name", "category": "Best Practice", - "startLine": 67, - "startColumn": 3, - "endLine": 67, - "endColumn": 37, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" + "startLine": 77, + "startColumn": 7, + "endLine": 77, + "endColumn": 11, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sso/aws-sso-permissionset", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'CDLWithoutDefault' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'RoleInlinePolicy' of type 'AWS::IAM::Role' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "CDLWithoutDefault", - "entityType": "Parameter" + "logicalId": "RoleInlinePolicy", + "entityType": "Resource", + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Parameters/CDLWithoutDefault", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 76, - "startColumn": 3, - "endLine": 76, - "endColumn": 20, - "ruleDescription": "Check if Parameters are Used", + "startLine": 16, + "startColumn": 5, + "endLine": 16, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'StringList' is not referenced anywhere in the template", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'SSOPermissionSet' of type 'AWS::SSO::PermissionSet' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "StringList", - "entityType": "Parameter" + "logicalId": "SSOPermissionSet", + "entityType": "Resource", + "resourceType": "AWS::SSO::PermissionSet" }, - "propertyPath": "Parameters/StringList", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 78, - "startColumn": 3, - "endLine": 78, - "endColumn": 13, - "ruleDescription": "Check if Parameters are Used", + "startLine": 75, + "startColumn": 5, + "endLine": 75, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "good/parameters/not_used_parameters.yaml": { - "filePath": "good/parameters/not_used_parameters.yaml", + "good/iam_valid.yaml": { + "filePath": "good/iam_valid.yaml", "status": "OK", "metadata": { "resourcesScanned": 2, "counts": { "fatal": 0, - "errors": 2, - "warnings": 1, - "informational": 4, + "errors": 0, + "warnings": 0, + "informational": 1, "debug": 0 }, "suppressed": 0, @@ -12051,149 +10881,127 @@ }, "diagnostics": [ { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-123456' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", - "entity": { - "logicalId": "LaunchConfiguration", - "entityType": "Resource", - "resourceType": "AWS::AutoScaling::LaunchConfiguration" - }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 20, - "startColumn": 7, - "endLine": 20, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-123456" - } - }, - { - "ruleId": "E2531", - "severity": "ERROR", - "message": "Runtime 'java8' was deprecated on '2024-01-08'. Creation was disabled on '2024-02-08', and updates will be disabled on '2027-03-03'. Please consider updating to 'java25'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Role' of type 'AWS::IAM::Role' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "SomeLambda", + "logicalId": "Role", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 12, - "startColumn": 7, - "endLine": 12, - "endColumn": 14, - "ruleDescription": "Check if Lambda Function Runtimes are blocked for create", - "phase": "SCHEMA", - "context": { - "actualValue": "java8", - "lifecycle": "create-blocked" - } + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 18, + "startColumn": 5, + "endLine": 18, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "good/kms_key_identifier_forms.yaml": { + "filePath": "good/kms_key_identifier_forms.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 7, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 3, + "informational": 7, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "W3697", + "ruleId": "W9013", "severity": "WARN", - "message": "Resource type 'AWS::AutoScaling::LaunchConfiguration' is from a service in maintenance mode since 2024-10-01. Consider migrating to an alternative", - "source": "CFN_LINT", + "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", + "source": "ENGINE", "entity": { - "logicalId": "LaunchConfiguration", + "logicalId": "TopicKeyArn", "entityType": "Resource", - "resourceType": "AWS::AutoScaling::LaunchConfiguration" + "resourceType": "AWS::SNS::Topic" }, - "category": "Deprecation", - "startLine": 17, + "category": "Security", + "startLine": 8, "startColumn": 3, - "endLine": 17, - "endColumn": 22, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", - "ruleDescription": "Resource type is from a service in maintenance mode", - "phase": "SCHEMA" + "endLine": 8, + "endColumn": 14, + "ruleDescription": "Hardcoded account ID in ARN", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "ruleId": "W9013", + "severity": "WARN", + "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", "source": "ENGINE", "entity": { - "logicalId": "LaunchConfiguration", + "logicalId": "TopicAliasArn", "entityType": "Resource", - "resourceType": "AWS::AutoScaling::LaunchConfiguration" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.ImageId", - "category": "Best Practice", - "startLine": 20, - "startColumn": 7, - "endLine": 20, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "category": "Security", + "startLine": 16, + "startColumn": 3, + "endLine": 16, + "endColumn": 16, + "ruleDescription": "Hardcoded account ID in ARN", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'InstanceType' is create-only; updating it will cause resource replacement", + "ruleId": "W9013", + "severity": "WARN", + "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", "source": "ENGINE", "entity": { - "logicalId": "LaunchConfiguration", + "logicalId": "TopicMultiRegionKeyArn", "entityType": "Resource", - "resourceType": "AWS::AutoScaling::LaunchConfiguration" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.InstanceType", - "category": "Best Practice", - "startLine": 21, - "startColumn": 7, - "endLine": 21, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "category": "Security", + "startLine": 24, + "startColumn": 3, + "endLine": 24, + "endColumn": 25, + "ruleDescription": "Hardcoded account ID in ARN", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'UserData' is create-only; updating it will cause resource replacement", + "message": "Resource 'TopicKeyId' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "LaunchConfiguration", + "logicalId": "TopicKeyId", "entityType": "Resource", - "resourceType": "AWS::AutoScaling::LaunchConfiguration" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.UserData", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 22, - "startColumn": 7, - "endLine": 22, + "startLine": 6, + "startColumn": 5, + "endLine": 6, "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "dynamic (Base64 with unresolvable argument)" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'SomeLambda' of type 'AWS::Serverless::Function' supports Tags but none are configured", + "message": "Resource 'TopicKeyArn' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "SomeLambda", + "logicalId": "TopicKeyArn", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", @@ -12204,148 +11012,118 @@ "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" - } - ] - }, - "good/parameters/used_transform_language_extension.json": { - "filePath": "good/parameters/used_transform_language_extension.json", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 4, - "informational": 0, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "W8001", - "severity": "WARN", - "message": "Condition 'IsParamAEnabled' is not used by any resource or Fn::If", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'TopicAliasName' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "IsParamAEnabled", - "entityType": "Condition" + "logicalId": "TopicAliasName", + "entityType": "Resource", + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Conditions/IsParamAEnabled", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 34, + "startLine": 14, "startColumn": 5, - "endLine": 34, - "endColumn": 16, - "ruleDescription": "Check if Conditions are Used", + "endLine": 14, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "W8001", - "severity": "WARN", - "message": "Condition 'IsParamBEnabled' is not used by any resource or Fn::If", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'TopicAliasArn' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "IsParamBEnabled", - "entityType": "Condition" + "logicalId": "TopicAliasArn", + "entityType": "Resource", + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Conditions/IsParamBEnabled", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 34, + "startLine": 18, "startColumn": 5, - "endLine": 34, - "endColumn": 16, - "ruleDescription": "Check if Conditions are Used", + "endLine": 18, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "W8001", - "severity": "WARN", - "message": "Condition 'IsParamCEnabled' is not used by any resource or Fn::If", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'TopicMultiRegionKeyId' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "IsParamCEnabled", - "entityType": "Condition" + "logicalId": "TopicMultiRegionKeyId", + "entityType": "Resource", + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Conditions/IsParamCEnabled", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 34, + "startLine": 22, "startColumn": 5, - "endLine": 34, - "endColumn": 16, - "ruleDescription": "Check if Conditions are Used", + "endLine": 22, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "W8001", - "severity": "WARN", - "message": "Condition 'IsParamDEnabled' is not used by any resource or Fn::If", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'TopicMultiRegionKeyArn' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "IsParamDEnabled", - "entityType": "Condition" + "logicalId": "TopicMultiRegionKeyArn", + "entityType": "Resource", + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Conditions/IsParamDEnabled", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 34, + "startLine": 26, "startColumn": 5, - "endLine": 34, - "endColumn": 16, - "ruleDescription": "Check if Conditions are Used", + "endLine": 26, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" - } - ] - }, - "good/parameters/used_transform_removed.yaml": { - "filePath": "good/parameters/used_transform_removed.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 1, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'MyAPI' of type 'AWS::Serverless::Api' supports Tags but none are configured", + "message": "Resource 'TopicIntrinsicAliasArn' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "MyAPI", + "logicalId": "TopicIntrinsicAliasArn", "entityType": "Resource", - "resourceType": "AWS::Serverless::Api" + "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 15, + "startLine": 30, "startColumn": 5, - "endLine": 15, + "endLine": 30, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "good/parameters/used_transforms.yaml": { - "filePath": "good/parameters/used_transforms.yaml", + "good/lambda_permission_source_account.yaml": { + "filePath": "good/lambda_permission_source_account.yaml", "status": "OK", "metadata": { - "resourcesScanned": 2, + "resourcesScanned": 1, "counts": { "fatal": 0, - "errors": 2, - "warnings": 1, + "errors": 0, + "warnings": 2, "informational": 4, "debug": 0 }, @@ -12355,87 +11133,58 @@ }, "diagnostics": [ { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-123456' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", - "entity": { - "logicalId": "LaunchConfiguration", - "entityType": "Resource", - "resourceType": "AWS::AutoScaling::LaunchConfiguration" - }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 23, - "startColumn": 7, - "endLine": 23, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-123456" - } - }, - { - "ruleId": "E2531", - "severity": "ERROR", - "message": "Runtime 'java8' was deprecated on '2024-01-08'. Creation was disabled on '2024-02-08', and updates will be disabled on '2027-03-03'. Please consider updating to 'java25'", - "source": "CFN_LINT", + "ruleId": "W9002", + "severity": "WARN", + "message": "Property 'SourceArn' has a hardcoded ARN - use Ref, GetAtt, or a parameter instead", + "source": "ENGINE", "entity": { - "logicalId": "SomeLambda", + "logicalId": "Perm", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::Lambda::Permission" }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 18, + "propertyPath": "Properties.SourceArn", + "category": "Best Practice", + "startLine": 8, "startColumn": 7, - "endLine": 18, - "endColumn": 14, - "ruleDescription": "Check if Lambda Function Runtimes are blocked for create", - "phase": "SCHEMA", - "context": { - "actualValue": "java8", - "lifecycle": "create-blocked" - } + "endLine": 8, + "endColumn": 16, + "ruleDescription": "Hardcoded ARN property", + "phase": "LINT" }, { - "ruleId": "W3697", + "ruleId": "W9013", "severity": "WARN", - "message": "Resource type 'AWS::AutoScaling::LaunchConfiguration' is from a service in maintenance mode since 2024-10-01. Consider migrating to an alternative", - "source": "CFN_LINT", + "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", + "source": "ENGINE", "entity": { - "logicalId": "LaunchConfiguration", + "logicalId": "Perm", "entityType": "Resource", - "resourceType": "AWS::AutoScaling::LaunchConfiguration" + "resourceType": "AWS::Lambda::Permission" }, - "category": "Deprecation", - "startLine": 20, + "category": "Security", + "startLine": 2, "startColumn": 3, - "endLine": 20, - "endColumn": 22, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", - "ruleDescription": "Resource type is from a service in maintenance mode", - "phase": "SCHEMA" + "endLine": 2, + "endColumn": 7, + "ruleDescription": "Hardcoded account ID in ARN", + "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "message": "Property 'Action' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "LaunchConfiguration", + "logicalId": "Perm", "entityType": "Resource", - "resourceType": "AWS::AutoScaling::LaunchConfiguration" + "resourceType": "AWS::Lambda::Permission" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Properties.Action", "category": "Best Practice", - "startLine": 23, + "startLine": 5, "startColumn": 7, - "endLine": 23, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", + "endLine": 5, + "endColumn": 13, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -12445,20 +11194,19 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'InstanceType' is create-only; updating it will cause resource replacement", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "LaunchConfiguration", + "logicalId": "Perm", "entityType": "Resource", - "resourceType": "AWS::AutoScaling::LaunchConfiguration" + "resourceType": "AWS::Lambda::Permission" }, - "propertyPath": "Properties.InstanceType", + "propertyPath": "Properties.FunctionName", "category": "Best Practice", - "startLine": 24, + "startLine": 6, "startColumn": 7, - "endLine": 24, + "endLine": 6, "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -12468,59 +11216,59 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'UserData' is create-only; updating it will cause resource replacement", + "message": "Property 'Principal' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "LaunchConfiguration", + "logicalId": "Perm", "entityType": "Resource", - "resourceType": "AWS::AutoScaling::LaunchConfiguration" + "resourceType": "AWS::Lambda::Permission" }, - "propertyPath": "Properties.UserData", + "propertyPath": "Properties.Principal", "category": "Best Practice", - "startLine": 25, + "startLine": 7, "startColumn": 7, - "endLine": 25, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", + "endLine": 7, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "dynamic (Base64 with unresolvable argument)" + "lifecycle": "create-only" } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'SomeLambda' of type 'AWS::Serverless::Function' supports Tags but none are configured", + "message": "Property 'SourceArn' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SomeLambda", + "logicalId": "Perm", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::Lambda::Permission" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.SourceArn", "category": "Best Practice", - "startLine": 16, - "startColumn": 5, - "endLine": 16, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 8, + "startColumn": 7, + "endLine": 8, + "endColumn": 16, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } } ] }, - "good/properties_ec2_vpc.yaml": { - "filePath": "good/properties_ec2_vpc.yaml", + "good/lambda_permission_sourcearn_ref_no_account.yaml": { + "filePath": "good/lambda_permission_sourcearn_ref_no_account.yaml", "status": "OK", "metadata": { - "resourcesScanned": 7, + "resourcesScanned": 1, "counts": { "fatal": 0, - "errors": 2, - "warnings": 0, - "informational": 21, + "errors": 0, + "warnings": 1, + "informational": 4, "debug": 0 }, "suppressed": 0, @@ -12529,270 +11277,416 @@ }, "diagnostics": [ { - "ruleId": "E1151", - "severity": "ERROR", - "message": "'vpc-1234567' does not match format 'AWS::EC2::VPC.Id'", - "source": "CFN_LINT", + "ruleId": "W9002", + "severity": "WARN", + "message": "Property 'SourceArn' has a hardcoded ARN - use Ref, GetAtt, or a parameter instead", + "source": "ENGINE", "entity": { - "logicalId": "mySubnet21", + "logicalId": "Perm", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::Lambda::Permission" }, - "propertyPath": "Properties.VpcId", - "category": "Intrinsic Function", - "startLine": 61, + "propertyPath": "Properties.SourceArn", + "category": "Best Practice", + "startLine": 15, "startColumn": 7, - "endLine": 61, - "endColumn": 12, - "ruleDescription": "Validate VPC id format", + "endLine": 15, + "endColumn": 16, + "ruleDescription": "Hardcoded ARN property", + "phase": "LINT" + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Action' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "Perm", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties.Action", + "category": "Best Practice", + "startLine": 12, + "startColumn": 7, + "endLine": 12, + "endColumn": 13, + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "actualValue": "vpc-1234567" + "lifecycle": "create-only" } }, { - "ruleId": "E1151", - "severity": "ERROR", - "message": "'vpc-1234567' does not match format 'AWS::EC2::VPC.Id'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "mySubnet22", + "logicalId": "Perm", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::Lambda::Permission" }, - "propertyPath": "Properties.VpcId", - "category": "Intrinsic Function", - "startLine": 66, + "propertyPath": "Properties.FunctionName", + "category": "Best Practice", + "startLine": 13, "startColumn": 7, - "endLine": 66, - "endColumn": 12, - "ruleDescription": "Validate VPC id format", + "endLine": 13, + "endColumn": 19, + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "actualValue": "vpc-1234567" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Property 'Principal' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "myVpc1", + "logicalId": "Perm", "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" + "resourceType": "AWS::Lambda::Permission" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Properties.Principal", "category": "Best Practice", - "startLine": 32, + "startLine": 14, "startColumn": 7, - "endLine": 32, + "endLine": 14, "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter 'cidrBlockAllowedPattern' (type String)" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'InstanceTenancy' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'SourceArn' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "myVpc1", + "logicalId": "Perm", "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" + "resourceType": "AWS::Lambda::Permission" }, - "propertyPath": "Properties.InstanceTenancy", + "propertyPath": "Properties.SourceArn", "category": "Best Practice", - "startLine": 33, + "startLine": 15, "startColumn": 7, - "endLine": 33, - "endColumn": 22, + "endLine": 15, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only" } + } + ] + }, + "good/lambda_snapstart.yaml": { + "filePath": "good/lambda_snapstart.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 2, + "informational": 2, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "W2530", + "severity": "WARN", + "message": "SnapStart is enabled but no AWS::Lambda::Version resource is attached", + "source": "CFN_LINT", + "entity": { + "logicalId": "SnapStartFunc", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.SnapStart.ApplyOn", + "suggestedFix": "Add an AWS::Lambda::Version resource that references this function", + "category": "Best Practice", + "startLine": 14, + "startColumn": 9, + "endLine": 14, + "endColumn": 16, + "ruleDescription": "Validate that SnapStart is properly configured", + "phase": "LINT" + }, + { + "ruleId": "W9013", + "severity": "WARN", + "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", + "source": "ENGINE", + "entity": { + "logicalId": "SnapStartFunc", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "category": "Security", + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 16, + "ruleDescription": "Hardcoded account ID in ARN", + "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'InstanceTenancy' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "myVpc2", + "logicalId": "SnapStartFunc", "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.InstanceTenancy", + "propertyPath": "Properties.FunctionName", "category": "Best Practice", - "startLine": 37, + "startLine": 6, "startColumn": 7, - "endLine": 37, - "endColumn": 22, + "endLine": 6, + "endColumn": 19, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only", - "resolutionSource": "parameter with AllowedValues" + "lifecycle": "create-only" } }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Resource 'SnapStartFunc' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "myVpc2", + "logicalId": "SnapStartFunc", "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 38, - "startColumn": 7, - "endLine": 38, - "endColumn": 16, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter 'cidrBlockAllowedPattern' (type String)" - } + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "good/lambda_zipfile.yaml": { + "filePath": "good/lambda_zipfile.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 3, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9001", + "ruleId": "I3042", "severity": "INFO", - "message": "Property 'InstanceTenancy' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "message": "ARN in Resource LambdaFn contains hardcoded Partition in ARN or incorrectly placed Pseudo Parameters", + "source": "CFN_LINT", "entity": { - "logicalId": "myVpc3", + "logicalId": "LambdaFn", "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.InstanceTenancy", + "propertyPath": "Properties.Role.Fn::Sub", "category": "Best Practice", - "startLine": 42, + "startLine": 9, "startColumn": 7, - "endLine": 42, - "endColumn": 22, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only", - "resolutionSource": "parameter with AllowedValues" - } + "endLine": 9, + "endColumn": 14, + "ruleDescription": "ARNs should use correctly placed Pseudo Parameters", + "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "myVpc3", + "logicalId": "LambdaFn", "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Properties.FunctionName", "category": "Best Practice", - "startLine": 43, + "startLine": 6, "startColumn": 7, - "endLine": 43, - "endColumn": 16, + "endLine": 6, + "endColumn": 19, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter with AllowedValues" + "lifecycle": "create-only" } }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'InstanceTenancy' is conditionally create-only; updating it may cause resource replacement", + "message": "Resource 'LambdaFn' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "myVpc4", + "logicalId": "LambdaFn", "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.InstanceTenancy", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 47, - "startColumn": 7, - "endLine": 47, - "endColumn": 22, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only", - "resolutionSource": "parameter with AllowedValues" - } + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "good/lifecycle_intrinsic_scenarios.yaml": { + "filePath": "good/lifecycle_intrinsic_scenarios.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 13, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 0, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [] + }, + "good/mappings/name.yaml": { + "filePath": "good/mappings/name.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 0, + "counts": { + "fatal": 1, + "errors": 0, + "warnings": 1, + "informational": 0, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "F0001", + "severity": "FATAL", + "message": "Resources section must exist and be non-empty", + "source": "SCHEMA", + "category": "Structure", + "startLine": 10, + "startColumn": 1, + "endLine": 10, + "endColumn": 10, + "ruleDescription": "Resources section must exist and be non-empty", + "phase": "SCHEMA" + }, + { + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'RegionMap' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", "entity": { - "logicalId": "myVpc4", - "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" + "logicalId": "RegionMap", + "entityType": "Mapping" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Mappings/RegionMap", "category": "Best Practice", - "startLine": 48, - "startColumn": 7, - "endLine": 48, - "endColumn": 16, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter with AllowedValues" - } + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 12, + "ruleDescription": "Check if Mappings are Used", + "phase": "LINT" + } + ] + }, + "good/mappings/used.yaml": { + "filePath": "good/mappings/used.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 1, + "warnings": 0, + "informational": 3, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'InstanceTenancy' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "E1151", + "severity": "ERROR", + "message": "'vpc-123456' does not match format 'AWS::EC2::VPC.Id'", + "source": "CFN_LINT", "entity": { - "logicalId": "myVpc5", + "logicalId": "mySubnet", "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.InstanceTenancy", - "category": "Best Practice", - "startLine": 52, + "propertyPath": "Properties.VpcId", + "category": "Intrinsic Function", + "startLine": 21, "startColumn": 7, - "endLine": 52, - "endColumn": 22, - "ruleDescription": "Create-only property updated triggers resource replacement", + "endLine": 21, + "endColumn": 12, + "ruleDescription": "Validate VPC id format", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "actualValue": "vpc-123456" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "myVpc5", + "logicalId": "mySubnet", "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 53, + "startLine": 21, "startColumn": 7, - "endLine": 53, - "endColumn": 16, + "endLine": 21, + "endColumn": 12, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -12805,166 +11699,304 @@ "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "mySubnet21", + "logicalId": "mySubnet", "entityType": "Resource", "resourceType": "AWS::EC2::Subnet" }, "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 57, + "startLine": 23, "startColumn": 7, - "endLine": 57, + "endLine": 23, "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "dynamic (Select with unresolvable arguments)" + "resolutionSource": "dynamic (FindInMap with dynamic map name)" } }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "message": "Resource 'mySubnet' of type 'AWS::EC2::Subnet' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "mySubnet21", + "logicalId": "mySubnet", "entityType": "Resource", "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 61, - "startColumn": 7, - "endLine": 61, + "startLine": 20, + "startColumn": 5, + "endLine": 20, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "good/mappings_valid.yaml": { + "filePath": "good/mappings_valid.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 1, + "informational": 1, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'RegionMap' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", + "entity": { + "logicalId": "RegionMap", + "entityType": "Mapping" + }, + "propertyPath": "Mappings/RegionMap", + "category": "Best Practice", + "startLine": 3, + "startColumn": 3, + "endLine": 3, "endColumn": 12, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "ruleDescription": "Check if Mappings are Used", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Resource 'R' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "mySubnet22", + "logicalId": "R", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 65, - "startColumn": 7, - "endLine": 65, - "endColumn": 16, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter 'cidrBlockAllowedPattern' (type String)" - } + "startLine": 9, + "startColumn": 3, + "endLine": 9, + "endColumn": 4, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "good/metadata_context_complete.yaml": { + "filePath": "good/metadata_context_complete.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 6, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 13, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "mySubnet22", + "logicalId": "OrderQueue", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 66, - "startColumn": 7, - "endLine": 66, - "endColumn": 12, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 18, + "startColumn": 3, + "endLine": 18, + "endColumn": 13, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "OrderQueue", + "entityType": "Resource", + "resourceType": "AWS::SQS::Queue" + }, + "category": "Best Practice", + "startLine": 18, + "startColumn": 3, + "endLine": 18, + "endColumn": 13, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "LegacyTable", + "entityType": "Resource", + "resourceType": "AWS::DynamoDB::Table" + }, + "category": "Best Practice", + "startLine": 35, + "startColumn": 3, + "endLine": 35, + "endColumn": 14, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "LegacyTable", + "entityType": "Resource", + "resourceType": "AWS::DynamoDB::Table" + }, + "category": "Best Practice", + "startLine": 35, + "startColumn": 3, + "endLine": 35, + "endColumn": 14, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "ServiceLogGroup", + "entityType": "Resource", + "resourceType": "AWS::Logs::LogGroup" + }, + "category": "Best Practice", + "startLine": 64, + "startColumn": 3, + "endLine": 64, + "endColumn": 18, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "ServiceLogGroup", + "entityType": "Resource", + "resourceType": "AWS::Logs::LogGroup" + }, + "category": "Best Practice", + "startLine": 64, + "startColumn": 3, + "endLine": 64, + "endColumn": 18, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9040", + "ruleId": "I3013", "severity": "INFO", - "message": "Resource 'myVpc1' of type 'AWS::EC2::VPC' supports Tags but none are configured", - "source": "ENGINE", + "message": "'MessageRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "myVpc1", + "logicalId": "OrderQueue", "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties", "category": "Best Practice", - "startLine": 31, - "startColumn": 5, - "endLine": 31, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "startLine": 18, + "startColumn": 3, + "endLine": 18, + "endColumn": 13, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", "phase": "LINT" }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'myVpc2' of type 'AWS::EC2::VPC' supports Tags but none are configured", + "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "myVpc2", + "logicalId": "LegacyTable", "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.KeySchema", "category": "Best Practice", - "startLine": 36, - "startColumn": 5, - "endLine": 36, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 38, + "startColumn": 7, + "endLine": 38, + "endColumn": 16, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'myVpc3' of type 'AWS::EC2::VPC' supports Tags but none are configured", + "message": "Resource 'OrderQueue' of type 'AWS::SQS::Queue' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "myVpc3", + "logicalId": "OrderQueue", "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" + "resourceType": "AWS::SQS::Queue" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 41, - "startColumn": 5, - "endLine": 41, - "endColumn": 15, + "startLine": 18, + "startColumn": 3, + "endLine": 18, + "endColumn": 13, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'myVpc4' of type 'AWS::EC2::VPC' supports Tags but none are configured", + "message": "Resource 'LegacyTable' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "myVpc4", + "logicalId": "LegacyTable", "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" + "resourceType": "AWS::DynamoDB::Table" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 46, + "startLine": 37, "startColumn": 5, - "endLine": 46, + "endLine": 37, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -12972,19 +12004,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'myVpc5' of type 'AWS::EC2::VPC' supports Tags but none are configured", + "message": "Resource 'ServiceLogGroup' of type 'AWS::Logs::LogGroup' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "myVpc5", + "logicalId": "ServiceLogGroup", "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" + "resourceType": "AWS::Logs::LogGroup" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 51, + "startLine": 66, "startColumn": 5, - "endLine": 51, + "endLine": 66, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -12992,19 +12024,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'mySubnet21' of type 'AWS::EC2::Subnet' supports Tags but none are configured", + "message": "Resource 'LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8a' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "mySubnet21", + "logicalId": "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8a", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::Lambda::Function" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 56, + "startLine": 70, "startColumn": 5, - "endLine": 56, + "endLine": 70, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -13012,414 +12044,293 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'mySubnet22' of type 'AWS::EC2::Subnet' supports Tags but none are configured", + "message": "Resource 'CustomResourceProviderframeworkonEvent' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "mySubnet22", + "logicalId": "CustomResourceProviderframeworkonEvent", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::Lambda::Function" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 64, + "startLine": 78, "startColumn": 5, - "endLine": 64, + "endLine": 78, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "good/properties_rt_association.yaml": { - "filePath": "good/properties_rt_association.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 6, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 11, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "AppSubnetPublicRouteTableAssociation", - "entityType": "Resource", - "resourceType": "AWS::EC2::SubnetRouteTableAssociation" - }, - "propertyPath": "Properties.RouteTableId", - "category": "Best Practice", - "startLine": 31, - "startColumn": 9, - "endLine": 31, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter 'PublicRouteTable' (type String)", - "extra": { - "replacement_strategy": "delete_then_create" - } - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "AppSubnetPublicRouteTableAssociation", - "entityType": "Resource", - "resourceType": "AWS::EC2::SubnetRouteTableAssociation" - }, - "propertyPath": "Properties.SubnetId", - "category": "Best Practice", - "startLine": 33, - "startColumn": 9, - "endLine": 33, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter 'AppSubnet01' (type String)", - "extra": { - "replacement_strategy": "delete_then_create" - } - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "AppSubnetPrivateRouteTableAssociation", - "entityType": "Resource", - "resourceType": "AWS::EC2::SubnetRouteTableAssociation" - }, - "propertyPath": "Properties.RouteTableId", - "category": "Best Practice", - "startLine": 40, - "startColumn": 9, - "endLine": 40, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter 'PrivateRouteTable' (type String)", - "extra": { - "replacement_strategy": "delete_then_create" - } - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "AppSubnetPrivateRouteTableAssociation", - "entityType": "Resource", - "resourceType": "AWS::EC2::SubnetRouteTableAssociation" - }, - "propertyPath": "Properties.SubnetId", - "category": "Best Practice", - "startLine": 42, - "startColumn": 9, - "endLine": 42, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter 'AppSubnet01' (type String)", - "extra": { - "replacement_strategy": "delete_then_create" - } - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "ProxySubnetRouteTableAssociation", - "entityType": "Resource", - "resourceType": "AWS::EC2::SubnetRouteTableAssociation" - }, - "propertyPath": "Properties.RouteTableId", - "category": "Best Practice", - "startLine": 48, - "startColumn": 9, - "endLine": 48, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter 'PublicRouteTable' (type String)", - "extra": { - "replacement_strategy": "delete_then_create" - } - } + "good/minimal.yaml": { + "filePath": "good/minimal.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 1, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", + "message": "Resource 'IamPipeline' of type 'AWS::CloudFormation::Stack' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ProxySubnetRouteTableAssociation", + "logicalId": "IamPipeline", "entityType": "Resource", - "resourceType": "AWS::EC2::SubnetRouteTableAssociation" + "resourceType": "AWS::CloudFormation::Stack" }, - "propertyPath": "Properties.SubnetId", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 50, - "startColumn": 9, - "endLine": 50, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Fn::If on condition 'isPublic'", - "extra": { - "replacement_strategy": "delete_then_create" - } - } + "startLine": 9, + "startColumn": 5, + "endLine": 9, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "good/modules/minimal.yaml": { + "filePath": "good/modules/minimal.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 2, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 1, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", + "message": "Resource 'OtherResource' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "PublicSubnetRouteTableAssociation", + "logicalId": "OtherResource", "entityType": "Resource", - "resourceType": "AWS::EC2::SubnetRouteTableAssociation" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.RouteTableId", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 56, - "startColumn": 9, - "endLine": 56, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter 'PublicRouteTable' (type String)", - "extra": { - "replacement_strategy": "delete_then_create" - } - } + "startLine": 8, + "startColumn": 3, + "endLine": 8, + "endColumn": 16, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "good/neptune_valid_instanceclass.yaml": { + "filePath": "good/neptune_valid_instanceclass.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 4, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "PublicSubnetRouteTableAssociation", + "logicalId": "Instance", "entityType": "Resource", - "resourceType": "AWS::EC2::SubnetRouteTableAssociation" + "resourceType": "AWS::Neptune::DBInstance" }, - "propertyPath": "Properties.SubnetId", "category": "Best Practice", - "startLine": 58, - "startColumn": 9, - "endLine": 58, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter 'PublicSubnet01' (type String)", - "extra": { - "replacement_strategy": "delete_then_create" - } - } + "startLine": 2, + "startColumn": 3, + "endLine": 2, + "endColumn": 11, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'ServiceToken' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "CustomResource", + "logicalId": "Instance", "entityType": "Resource", - "resourceType": "AWS::CloudFormation::CustomResource" + "resourceType": "AWS::Neptune::DBInstance" }, - "propertyPath": "Properties.ServiceToken", "category": "Best Practice", - "startLine": 64, - "startColumn": 9, - "endLine": 64, - "endColumn": 21, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 2, + "startColumn": 3, + "endLine": 2, + "endColumn": 11, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9003", "severity": "INFO", - "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", + "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", "source": "ENGINE", - "entity": { - "logicalId": "CustomSubnetRouteTableAssociation", - "entityType": "Resource", - "resourceType": "AWS::EC2::SubnetRouteTableAssociation" - }, - "propertyPath": "Properties.RouteTableId", "category": "Best Practice", - "startLine": 69, - "startColumn": 9, - "endLine": 69, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter 'PublicRouteTable' (type String)", - "extra": { - "replacement_strategy": "delete_then_create" - } - } + "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", + "message": "Resource 'Instance' of type 'AWS::Neptune::DBInstance' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "CustomSubnetRouteTableAssociation", + "logicalId": "Instance", "entityType": "Resource", - "resourceType": "AWS::EC2::SubnetRouteTableAssociation" + "resourceType": "AWS::Neptune::DBInstance" }, - "propertyPath": "Properties.SubnetId", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 71, - "startColumn": 9, - "endLine": 71, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt CustomResource.PublicSubnet", - "extra": { - "replacement_strategy": "delete_then_create" - } - } + "startLine": 4, + "startColumn": 5, + "endLine": 4, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" } ] }, - "good/redshift_private.yaml": { - "filePath": "good/redshift_private.yaml", + "good/no_value.yaml": { + "filePath": "good/no_value.yaml", "status": "OK", "metadata": { - "resourcesScanned": 7, + "resourcesScanned": 5, "counts": { "fatal": 0, "errors": 0, - "warnings": 0, - "informational": 14, + "warnings": 2, + "informational": 13, "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'pProdMonitoringInterval' is not referenced anywhere in the template", + "source": "CFN_LINT", + "entity": { + "logicalId": "pProdMonitoringInterval", + "entityType": "Parameter" + }, + "propertyPath": "Parameters/pProdMonitoringInterval", + "category": "Best Practice", + "startLine": 45, + "startColumn": 5, + "endLine": 45, + "endColumn": 28, + "ruleDescription": "Check if Parameters are Used", + "phase": "LINT" + }, { - "ruleId": "I9001", + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'pDevMonitoringInterval' is not referenced anywhere in the template", + "source": "CFN_LINT", + "entity": { + "logicalId": "pDevMonitoringInterval", + "entityType": "Parameter" + }, + "propertyPath": "Parameters/pDevMonitoringInterval", + "category": "Best Practice", + "startLine": 49, + "startColumn": 5, + "endLine": 49, + "endColumn": 27, + "ruleDescription": "Check if Parameters are Used", + "phase": "LINT" + }, + { + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "Subnet1", + "logicalId": "rDBServerInstance", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 6, - "startColumn": 7, - "endLine": 6, - "endColumn": 12, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'VPC'" - } + "startLine": 123, + "startColumn": 5, + "endLine": 123, + "endColumn": 22, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "Subnet1", + "logicalId": "rDBServerInstance", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 7, - "startColumn": 7, - "endLine": 7, - "endColumn": 16, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 123, + "startColumn": 5, + "endLine": 123, + "endColumn": 22, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Property 'Description' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "VPC", + "logicalId": "rParameterGroup", "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" + "resourceType": "AWS::RDS::DBParameterGroup" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Properties.Description", "category": "Best Practice", - "startLine": 11, - "startColumn": 7, - "endLine": 11, - "endColumn": 16, + "startLine": 59, + "startColumn": 13, + "endLine": 59, + "endColumn": 24, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -13429,255 +12340,240 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "message": "Property 'Family' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "RouteTable1", + "logicalId": "rParameterGroup", "entityType": "Resource", - "resourceType": "AWS::EC2::RouteTable" + "resourceType": "AWS::RDS::DBParameterGroup" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.Family", "category": "Best Practice", - "startLine": 21, - "startColumn": 7, - "endLine": 21, - "endColumn": 12, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", + "startLine": 60, + "startColumn": 13, + "endLine": 60, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "Ref to 'VPC'" + "resolutionSource": "parameter 'pDBParameterGroupFamily' (type String)" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", + "message": "Property 'AutoMinorVersionUpgrade' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SubnetRTAssoc", + "logicalId": "rDBServerInstance", "entityType": "Resource", - "resourceType": "AWS::EC2::SubnetRouteTableAssociation" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.SubnetId", + "propertyPath": "Properties.AutoMinorVersionUpgrade", "category": "Best Practice", - "startLine": 25, - "startColumn": 7, - "endLine": 25, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "startLine": 128, + "startColumn": 13, + "endLine": 128, + "endColumn": 36, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'Subnet1'", - "extra": { - "replacement_strategy": "delete_then_create" - } + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", + "message": "Property 'BackupRetentionPeriod' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SubnetRTAssoc", + "logicalId": "rDBServerInstance", "entityType": "Resource", - "resourceType": "AWS::EC2::SubnetRouteTableAssociation" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.RouteTableId", + "propertyPath": "Properties.BackupRetentionPeriod", "category": "Best Practice", - "startLine": 26, - "startColumn": 7, - "endLine": 26, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "startLine": 129, + "startColumn": 13, + "endLine": 129, + "endColumn": 34, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'RouteTable1'", - "extra": { - "replacement_strategy": "delete_then_create" - } + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", + "message": "Property 'DBParameterGroupName' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "NatGW", + "logicalId": "rDBServerInstance", "entityType": "Resource", - "resourceType": "AWS::EC2::NatGateway" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.SubnetId", + "propertyPath": "Properties.DBParameterGroupName", "category": "Best Practice", - "startLine": 30, - "startColumn": 7, - "endLine": 30, - "endColumn": 15, + "startLine": 132, + "startColumn": 13, + "endLine": 132, + "endColumn": 33, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'Subnet1'" + "lifecycle": "conditional-create-only", + "resolutionSource": "Ref to 'rParameterGroup'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", + "message": "Property 'DBSubnetGroupName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Route1", + "logicalId": "rDBServerInstance", "entityType": "Resource", - "resourceType": "AWS::EC2::Route" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.RouteTableId", + "propertyPath": "Properties.DBSubnetGroupName", "category": "Best Practice", - "startLine": 34, - "startColumn": 7, - "endLine": 34, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", + "startLine": 133, + "startColumn": 13, + "endLine": 133, + "endColumn": 30, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "Ref to 'RouteTable1'" + "resolutionSource": "Ref to 'rDBSubnetGroup'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'DestinationCidrBlock' is create-only; updating it will cause resource replacement", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Route1", + "logicalId": "rDBServerInstance", "entityType": "Resource", - "resourceType": "AWS::EC2::Route" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.DestinationCidrBlock", + "propertyPath": "Properties.Engine", "category": "Best Practice", - "startLine": 35, - "startColumn": 7, - "endLine": 35, - "endColumn": 27, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", + "startLine": 134, + "startColumn": 13, + "endLine": 134, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only", + "resolutionSource": "parameter 'pDBEngine' (type String)" } }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Subnet1' of type 'AWS::EC2::Subnet' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "Subnet1", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'VPC' of type 'AWS::EC2::VPC' supports Tags but none are configured", + "message": "Property 'MasterUsername' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "VPC", + "logicalId": "rDBServerInstance", "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.MasterUsername", "category": "Best Practice", - "startLine": 10, - "startColumn": 5, - "endLine": 10, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 138, + "startColumn": 13, + "endLine": 138, + "endColumn": 27, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "parameter 'pDBMasterUsername' (type String)" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'RedshiftSubnetGroup' of type 'AWS::Redshift::ClusterSubnetGroup' supports Tags but none are configured", + "message": "Property 'MultiAZ' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "RedshiftSubnetGroup", + "logicalId": "rDBServerInstance", "entityType": "Resource", - "resourceType": "AWS::Redshift::ClusterSubnetGroup" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.MultiAZ", "category": "Best Practice", - "startLine": 14, - "startColumn": 5, - "endLine": 14, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 145, + "startColumn": 13, + "endLine": 145, + "endColumn": 20, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only", + "resolutionSource": "Fn::If on condition 'MultiAZ'" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'RouteTable1' of type 'AWS::EC2::RouteTable' supports Tags but none are configured", + "message": "Property 'StorageEncrypted' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "RouteTable1", + "logicalId": "rDBServerInstance", "entityType": "Resource", - "resourceType": "AWS::EC2::RouteTable" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.StorageEncrypted", "category": "Best Practice", - "startLine": 20, - "startColumn": 5, - "endLine": 20, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 148, + "startColumn": 13, + "endLine": 148, + "endColumn": 29, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'NatGW' of type 'AWS::EC2::NatGateway' supports Tags but none are configured", + "message": "Resource 'rDBMonitoringRole' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "NatGW", + "logicalId": "rDBMonitoringRole", "entityType": "Resource", - "resourceType": "AWS::EC2::NatGateway" + "resourceType": "AWS::IAM::Role" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 29, - "startColumn": 5, - "endLine": 29, - "endColumn": 15, + "startLine": 96, + "startColumn": 9, + "endLine": 96, + "endColumn": 19, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "good/redshift_valid_nodetype.yaml": { - "filePath": "good/redshift_valid_nodetype.yaml", + "good/no_w3010_on_unlisted_type.yaml": { + "filePath": "good/no_w3010_on_unlisted_type.yaml", "status": "OK", "metadata": { "resourcesScanned": 1, @@ -13701,13 +12597,13 @@ "entity": { "logicalId": "Cluster", "entityType": "Resource", - "resourceType": "AWS::Redshift::Cluster" + "resourceType": "AWS::DocDB::DBCluster" }, "propertyPath": "Properties.MasterUserPassword", "category": "Security", - "startLine": 8, + "startLine": 11, "startColumn": 7, - "endLine": 8, + "endLine": 11, "endColumn": 25, "ruleDescription": "Check if Password Properties are correctly configured", "phase": "LINT" @@ -13720,12 +12616,12 @@ "entity": { "logicalId": "Cluster", "entityType": "Resource", - "resourceType": "AWS::Redshift::Cluster" + "resourceType": "AWS::DocDB::DBCluster" }, "category": "Best Practice", - "startLine": 2, + "startLine": 6, "startColumn": 3, - "endLine": 2, + "endLine": 6, "endColumn": 10, "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" @@ -13738,12 +12634,12 @@ "entity": { "logicalId": "Cluster", "entityType": "Resource", - "resourceType": "AWS::Redshift::Cluster" + "resourceType": "AWS::DocDB::DBCluster" }, "category": "Best Practice", - "startLine": 2, + "startLine": 6, "startColumn": 3, - "endLine": 2, + "endLine": 6, "endColumn": 10, "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" @@ -13751,18 +12647,18 @@ { "ruleId": "I3013", "severity": "INFO", - "message": "'AutomatedSnapshotRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", "source": "CFN_LINT", "entity": { "logicalId": "Cluster", "entityType": "Resource", - "resourceType": "AWS::Redshift::Cluster" + "resourceType": "AWS::DocDB::DBCluster" }, "propertyPath": "Properties", "category": "Best Practice", - "startLine": 4, + "startLine": 8, "startColumn": 5, - "endLine": 4, + "endLine": 8, "endColumn": 15, "ruleDescription": "Check resources with auto expiring content have explicit retention period", "phase": "LINT" @@ -13770,20 +12666,19 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'MasterUsername' is create-only; updating it will cause resource replacement", + "message": "Property 'DBClusterIdentifier' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { "logicalId": "Cluster", "entityType": "Resource", - "resourceType": "AWS::Redshift::Cluster" + "resourceType": "AWS::DocDB::DBCluster" }, - "propertyPath": "Properties.MasterUsername", + "propertyPath": "Properties.DBClusterIdentifier", "category": "Best Practice", - "startLine": 7, + "startLine": 9, "startColumn": 7, - "endLine": 7, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "endLine": 9, + "endColumn": 26, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -13793,20 +12688,19 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'DBName' is create-only; updating it will cause resource replacement", + "message": "Property 'MasterUsername' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { "logicalId": "Cluster", "entityType": "Resource", - "resourceType": "AWS::Redshift::Cluster" + "resourceType": "AWS::DocDB::DBCluster" }, - "propertyPath": "Properties.DBName", + "propertyPath": "Properties.MasterUsername", "category": "Best Practice", - "startLine": 9, + "startLine": 10, "startColumn": 7, - "endLine": 9, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "endLine": 10, + "endColumn": 21, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -13814,46 +12708,59 @@ } }, { - "ruleId": "I9003", + "ruleId": "I9001", "severity": "INFO", - "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", + "message": "Property 'AvailabilityZones' is create-only; updating it will cause resource replacement", "source": "ENGINE", + "entity": { + "logicalId": "Cluster", + "entityType": "Resource", + "resourceType": "AWS::DocDB::DBCluster" + }, + "propertyPath": "Properties.AvailabilityZones", "category": "Best Practice", - "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", - "phase": "LINT" + "startLine": 12, + "startColumn": 7, + "endLine": 12, + "endColumn": 24, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Cluster' of type 'AWS::Redshift::Cluster' supports Tags but none are configured", + "message": "Resource 'Cluster' of type 'AWS::DocDB::DBCluster' supports Tags but none are configured", "source": "ENGINE", "entity": { "logicalId": "Cluster", "entityType": "Resource", - "resourceType": "AWS::Redshift::Cluster" + "resourceType": "AWS::DocDB::DBCluster" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 4, + "startLine": 8, "startColumn": 5, - "endLine": 4, + "endLine": 8, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "good/reference_values_are_not_literals.yaml": { - "filePath": "good/reference_values_are_not_literals.yaml", + "good/output_value_string.yaml": { + "filePath": "good/output_value_string.yaml", "status": "OK", "metadata": { - "resourcesScanned": 6, + "resourcesScanned": 1, "counts": { "fatal": 0, "errors": 0, "warnings": 0, - "informational": 10, + "informational": 4, "debug": 0 }, "suppressed": 0, @@ -13867,15 +12774,15 @@ "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "FifoQueue", + "logicalId": "Queue", "entityType": "Resource", "resourceType": "AWS::SQS::Queue" }, "category": "Best Practice", - "startLine": 21, + "startLine": 17, "startColumn": 3, - "endLine": 21, - "endColumn": 12, + "endLine": 17, + "endColumn": 8, "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, @@ -13885,15 +12792,15 @@ "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "FifoQueue", + "logicalId": "Queue", "entityType": "Resource", "resourceType": "AWS::SQS::Queue" }, "category": "Best Practice", - "startLine": 21, + "startLine": 17, "startColumn": 3, - "endLine": 21, - "endColumn": 12, + "endLine": 17, + "endColumn": 8, "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, @@ -13903,129 +12810,93 @@ "message": "'MessageRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", "source": "CFN_LINT", "entity": { - "logicalId": "FifoQueue", + "logicalId": "Queue", "entityType": "Resource", "resourceType": "AWS::SQS::Queue" }, "propertyPath": "Properties", "category": "Best Practice", - "startLine": 23, - "startColumn": 5, - "endLine": 23, - "endColumn": 15, + "startLine": 17, + "startColumn": 3, + "endLine": 17, + "endColumn": 8, "ruleDescription": "Check resources with auto expiring content have explicit retention period", "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'HostedZoneName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Record", - "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSet" - }, - "propertyPath": "Properties.HostedZoneName", - "category": "Best Practice", - "startLine": 16, - "startColumn": 7, - "endLine": 16, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53-recordset", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'FifoQueue' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "FifoQueue", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "propertyPath": "Properties.FifoQueue", - "category": "Best Practice", - "startLine": 24, - "startColumn": 7, - "endLine": 24, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sqs.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'QueueName' is create-only; updating it will cause resource replacement", + "message": "Resource 'Queue' of type 'AWS::SQS::Queue' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "FifoQueue", + "logicalId": "Queue", "entityType": "Resource", "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Properties.QueueName", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 25, - "startColumn": 7, - "endLine": 25, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sqs.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt Store.Value" - } + "startLine": 17, + "startColumn": 3, + "endLine": 17, + "endColumn": 8, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "good/override/complete.yaml": { + "filePath": "good/override/complete.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 3, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 1, + "informational": 6, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "ruleId": "W9010", + "severity": "WARN", + "message": "Hardcoded AMI ID - use a parameter or mapping for portability", "source": "ENGINE", "entity": { - "logicalId": "Database", + "logicalId": "untaggedInstance", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Engine", - "category": "Best Practice", - "startLine": 54, + "propertyPath": "Properties.ImageId", + "category": "Security", + "startLine": 13, "startColumn": 7, - "endLine": 54, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "endLine": 13, + "endColumn": 14, + "ruleDescription": "Hardcoded AMI ID", + "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'MasterUsername' is create-only; updating it will cause resource replacement", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Database", + "logicalId": "myS3Bucket", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.MasterUsername", + "propertyPath": "Properties.BucketName", "category": "Best Practice", - "startLine": 57, + "startLine": 9, "startColumn": 7, - "endLine": 57, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "endLine": 9, + "endColumn": 17, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -14035,20 +12906,20 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'StorageEncrypted' is create-only; updating it will cause resource replacement", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Database", + "logicalId": "untaggedInstance", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.StorageEncrypted", + "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 59, + "startLine": 13, "startColumn": 7, - "endLine": 59, - "endColumn": 23, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "endLine": 13, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -14058,171 +12929,135 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'BackupRetentionPeriod' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Database", + "logicalId": "VPC", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::VPC" }, - "propertyPath": "Properties.BackupRetentionPeriod", + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 60, - "startColumn": 7, - "endLine": 60, - "endColumn": 28, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "startLine": 17, + "startColumn": 9, + "endLine": 17, + "endColumn": 18, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only" } - } - ] - }, - "good/region_conditional_resource_type.yaml": { - "filePath": "good/region_conditional_resource_type.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 2, - "informational": 2, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "W9002", - "severity": "WARN", - "message": "Property 'ProjectArn' has a hardcoded ARN - use Ref, GetAtt, or a parameter instead", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'myS3Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Pool", + "logicalId": "myS3Bucket", "entityType": "Resource", - "resourceType": "AWS::DeviceFarm::DevicePool" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.ProjectArn", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 14, - "startColumn": 7, - "endLine": 14, - "endColumn": 17, - "ruleDescription": "Hardcoded ARN property", - "phase": "LINT" - }, - { - "ruleId": "W9013", - "severity": "WARN", - "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", - "source": "ENGINE", - "entity": { - "logicalId": "Pool", - "entityType": "Resource", - "resourceType": "AWS::DeviceFarm::DevicePool" - }, - "category": "Security", - "startLine": 9, - "startColumn": 3, - "endLine": 9, - "endColumn": 7, - "ruleDescription": "Hardcoded account ID in ARN", + "startLine": 8, + "startColumn": 5, + "endLine": 8, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'ProjectArn' is create-only; updating it will cause resource replacement", + "message": "Resource 'untaggedInstance' of type 'AWS::EC2::Instance' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Pool", + "logicalId": "untaggedInstance", "entityType": "Resource", - "resourceType": "AWS::DeviceFarm::DevicePool" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.ProjectArn", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 14, - "startColumn": 7, - "endLine": 14, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-device-farm", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 12, + "startColumn": 5, + "endLine": 12, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Pool' of type 'AWS::DeviceFarm::DevicePool' supports Tags but none are configured", + "message": "Resource 'VPC' of type 'AWS::EC2::VPC' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Pool", + "logicalId": "VPC", "entityType": "Resource", - "resourceType": "AWS::DeviceFarm::DevicePool" + "resourceType": "AWS::EC2::VPC" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 12, - "startColumn": 5, - "endLine": 12, - "endColumn": 15, + "startLine": 16, + "startColumn": 7, + "endLine": 16, + "endColumn": 17, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "good/resources/backup/test_backup_plan_lifecycle_rule.yml": { - "filePath": "good/resources/backup/test_backup_plan_lifecycle_rule.yml", + "good/override/required.yaml": { + "filePath": "good/override/required.yaml", "status": "OK", "metadata": { - "resourcesScanned": 3, + "resourcesScanned": 1, "counts": { "fatal": 0, "errors": 0, "warnings": 0, - "informational": 0, + "informational": 2, "debug": 0 }, "suppressed": 0, "strict": false, "severityLevel": "DEBUG" }, - "diagnostics": [] - }, - "good/resources/cloudformation/nested_stack_dynamic.yaml": { - "filePath": "good/resources/cloudformation/nested_stack_dynamic.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 1, - "debug": 0 + "diagnostics": [ + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "myS3Bucket", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" + }, + "propertyPath": "Properties.BucketName", + "category": "Best Practice", + "startLine": 9, + "startColumn": 7, + "endLine": 9, + "endColumn": 17, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'NestedStack' of type 'AWS::CloudFormation::Stack' supports Tags but none are configured", + "message": "Resource 'myS3Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "NestedStack", + "logicalId": "myS3Bucket", "entityType": "Resource", - "resourceType": "AWS::CloudFormation::Stack" + "resourceType": "AWS::S3::Bucket" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", @@ -14236,16 +13071,16 @@ } ] }, - "good/resources/cloudformation/stack_nested.yaml": { - "filePath": "good/resources/cloudformation/stack_nested.yaml", + "good/param_constraints_valid.yaml": { + "filePath": "good/param_constraints_valid.yaml", "status": "OK", "metadata": { - "resourcesScanned": 0, + "resourcesScanned": 1, "counts": { - "fatal": 1, + "fatal": 0, "errors": 0, "warnings": 2, - "informational": 0, + "informational": 1, "debug": 0 }, "suppressed": 0, @@ -14253,67 +13088,74 @@ "severityLevel": "DEBUG" }, "diagnostics": [ - { - "ruleId": "F0001", - "severity": "FATAL", - "message": "Resources section must exist and be non-empty", - "source": "SCHEMA", - "category": "Structure", - "startLine": 6, - "startColumn": 1, - "endLine": 6, - "endColumn": 10, - "ruleDescription": "Resources section must exist and be non-empty", - "phase": "SCHEMA" - }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'One' is not referenced anywhere in the template", + "message": "Parameter 'ValidParam' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "One", + "logicalId": "ValidParam", "entityType": "Parameter" }, - "propertyPath": "Parameters/One", + "propertyPath": "Parameters/ValidParam", "category": "Best Practice", - "startLine": 2, + "startLine": 3, "startColumn": 3, - "endLine": 2, - "endColumn": 6, + "endLine": 3, + "endColumn": 13, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { "ruleId": "W2001", "severity": "WARN", - "message": "Parameter 'Two' is not referenced anywhere in the template", + "message": "Parameter 'ValidNumber' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Two", + "logicalId": "ValidNumber", "entityType": "Parameter" }, - "propertyPath": "Parameters/Two", + "propertyPath": "Parameters/ValidNumber", "category": "Best Practice", - "startLine": 4, + "startLine": 9, "startColumn": 3, - "endLine": 4, - "endColumn": 6, + "endLine": 9, + "endColumn": 14, "ruleDescription": "Check if Parameters are Used", "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "Bucket", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 15, + "startColumn": 3, + "endLine": 15, + "endColumn": 9, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" } ] }, - "good/resources/cloudformation/stacks.yaml": { - "filePath": "good/resources/cloudformation/stacks.yaml", + "good/parameters/F2012_cdl_default_split.yaml": { + "filePath": "good/parameters/F2012_cdl_default_split.yaml", "status": "OK", "metadata": { - "resourcesScanned": 5, + "resourcesScanned": 1, "counts": { "fatal": 0, "errors": 0, - "warnings": 4, - "informational": 15, + "warnings": 6, + "informational": 0, "debug": 0 }, "suppressed": 0, @@ -14322,412 +13164,445 @@ }, "diagnostics": [ { - "ruleId": "W1028", + "ruleId": "W2001", "severity": "WARN", - "message": "['Fn::If', 1] is not reachable. When setting condition 'IsUsEast1' to True", + "message": "Parameter 'CDLSingleElementAllowed' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Stack3", - "entityType": "Resource", - "resourceType": "AWS::CloudFormation::Stack" + "logicalId": "CDLSingleElementAllowed", + "entityType": "Parameter" }, - "propertyPath": "Properties.Parameters.Fn::If.2.Fn::If.1", + "propertyPath": "Parameters/CDLSingleElementAllowed", "category": "Best Practice", - "startLine": 48, - "startColumn": 16, - "endLine": 48, - "endColumn": 17, - "ruleDescription": "Check Fn::If has a path that cannot be reached", + "startLine": 5, + "startColumn": 3, + "endLine": 5, + "endColumn": 26, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W3002", + "ruleId": "W2001", "severity": "WARN", - "message": "This code may only work with 'package' cli command", + "message": "Parameter 'CDLMultipleElementsAllowed' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "StackNormal", - "entityType": "Resource", - "resourceType": "AWS::CloudFormation::Stack" + "logicalId": "CDLMultipleElementsAllowed", + "entityType": "Parameter" }, - "propertyPath": "Properties.TemplateURL", + "propertyPath": "Parameters/CDLMultipleElementsAllowed", "category": "Best Practice", - "startLine": 8, - "startColumn": 7, - "endLine": 8, - "endColumn": 18, - "ruleDescription": "Warn when properties are configured to only work with the package command", + "startLine": 12, + "startColumn": 3, + "endLine": 12, + "endColumn": 29, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W3002", + "ruleId": "W2001", "severity": "WARN", - "message": "This code may only work with 'package' cli command", + "message": "Parameter 'CDLWhitespaceTrimsToValid' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "StackInvalidPath", - "entityType": "Resource", - "resourceType": "AWS::CloudFormation::Stack" + "logicalId": "CDLWhitespaceTrimsToValid", + "entityType": "Parameter" }, - "propertyPath": "Properties.TemplateURL", + "propertyPath": "Parameters/CDLWhitespaceTrimsToValid", "category": "Best Practice", - "startLine": 32, - "startColumn": 7, - "endLine": 32, - "endColumn": 18, - "ruleDescription": "Warn when properties are configured to only work with the package command", + "startLine": 19, + "startColumn": 3, + "endLine": 19, + "endColumn": 28, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "W3002", + "ruleId": "W2001", "severity": "WARN", - "message": "This code may only work with 'package' cli command", + "message": "Parameter 'CDLListStringTypeValid' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Stack3", - "entityType": "Resource", - "resourceType": "AWS::CloudFormation::Stack" + "logicalId": "CDLListStringTypeValid", + "entityType": "Parameter" }, - "propertyPath": "Properties.TemplateURL", + "propertyPath": "Parameters/CDLListStringTypeValid", "category": "Best Practice", - "startLine": 40, - "startColumn": 7, - "endLine": 40, - "endColumn": 18, - "ruleDescription": "Warn when properties are configured to only work with the package command", + "startLine": 26, + "startColumn": 3, + "endLine": 26, + "endColumn": 25, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'CDLNoAllowedValues' is not referenced anywhere in the template", + "source": "CFN_LINT", + "entity": { + "logicalId": "CDLNoAllowedValues", + "entityType": "Parameter" + }, + "propertyPath": "Parameters/CDLNoAllowedValues", + "category": "Best Practice", + "startLine": 33, + "startColumn": 3, + "endLine": 33, + "endColumn": 21, + "ruleDescription": "Check if Parameters are Used", + "phase": "LINT" + }, + { + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'CDLEmptyAllowedValues' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "StackNormal", - "entityType": "Resource", - "resourceType": "AWS::CloudFormation::Stack" + "logicalId": "CDLEmptyAllowedValues", + "entityType": "Parameter" + }, + "propertyPath": "Parameters/CDLEmptyAllowedValues", + "category": "Best Practice", + "startLine": 37, + "startColumn": 3, + "endLine": 37, + "endColumn": 24, + "ruleDescription": "Check if Parameters are Used", + "phase": "LINT" + } + ] + }, + "good/parameters/default.yaml": { + "filePath": "good/parameters/default.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 0, + "counts": { + "fatal": 3, + "errors": 0, + "warnings": 14, + "informational": 0, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "F0001", + "severity": "FATAL", + "message": "Resources section must exist and be non-empty", + "source": "SCHEMA", + "category": "Structure", + "startLine": 81, + "startColumn": 1, + "endLine": 81, + "endColumn": 10, + "ruleDescription": "Resources section must exist and be non-empty", + "phase": "SCHEMA" + }, + { + "ruleId": "F2012", + "severity": "FATAL", + "message": "Parameter 'CDLAllowedValues' Default 'four' is not in AllowedValues ['one', 'two', 'three,four']", + "source": "SCHEMA", + "entity": { + "logicalId": "CDLAllowedValues", + "entityType": "Parameter" }, - "category": "Best Practice", - "startLine": 5, - "startColumn": 3, - "endLine": 5, - "endColumn": 14, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "propertyPath": "Parameters/CDLAllowedValues/Default", + "category": "Parameter", + "startLine": 62, + "startColumn": 5, + "endLine": 62, + "endColumn": 12, + "ruleDescription": "Parameter Default must be in AllowedValues", + "phase": "SCHEMA" }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "ruleId": "F2012", + "severity": "FATAL", + "message": "Parameter 'CDLAllowedValues' Default 'three' is not in AllowedValues ['one', 'two', 'three,four']", + "source": "SCHEMA", "entity": { - "logicalId": "StackNormal", - "entityType": "Resource", - "resourceType": "AWS::CloudFormation::Stack" + "logicalId": "CDLAllowedValues", + "entityType": "Parameter" }, - "category": "Best Practice", - "startLine": 5, - "startColumn": 3, - "endLine": 5, - "endColumn": 14, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "propertyPath": "Parameters/CDLAllowedValues/Default", + "category": "Parameter", + "startLine": 62, + "startColumn": 5, + "endLine": 62, + "endColumn": 12, + "ruleDescription": "Parameter Default must be in AllowedValues", + "phase": "SCHEMA" }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'myAllowedPattern' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "StackIsWebUrl", - "entityType": "Resource", - "resourceType": "AWS::CloudFormation::Stack" + "logicalId": "myAllowedPattern", + "entityType": "Parameter" }, + "propertyPath": "Parameters/myAllowedPattern", "category": "Best Practice", - "startLine": 13, + "startLine": 4, "startColumn": 3, - "endLine": 13, - "endColumn": 16, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "endLine": 4, + "endColumn": 19, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'myMinValue' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "StackIsWebUrl", - "entityType": "Resource", - "resourceType": "AWS::CloudFormation::Stack" + "logicalId": "myMinValue", + "entityType": "Parameter" }, + "propertyPath": "Parameters/myMinValue", "category": "Best Practice", - "startLine": 13, + "startLine": 8, "startColumn": 3, - "endLine": 13, - "endColumn": 16, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "endLine": 8, + "endColumn": 13, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'myMaxValue' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "StackUrlIsObject", - "entityType": "Resource", - "resourceType": "AWS::CloudFormation::Stack" + "logicalId": "myMaxValue", + "entityType": "Parameter" }, + "propertyPath": "Parameters/myMaxValue", "category": "Best Practice", - "startLine": 21, + "startLine": 12, "startColumn": 3, - "endLine": 21, - "endColumn": 19, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "endLine": 12, + "endColumn": 13, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'myAllowedValue' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "StackUrlIsObject", - "entityType": "Resource", - "resourceType": "AWS::CloudFormation::Stack" + "logicalId": "myAllowedValue", + "entityType": "Parameter" }, + "propertyPath": "Parameters/myAllowedValue", "category": "Best Practice", - "startLine": 21, + "startLine": 16, "startColumn": 3, - "endLine": 21, - "endColumn": 19, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "endLine": 16, + "endColumn": 17, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'myMinLength' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "StackInvalidPath", - "entityType": "Resource", - "resourceType": "AWS::CloudFormation::Stack" + "logicalId": "myMinLength", + "entityType": "Parameter" }, + "propertyPath": "Parameters/myMinLength", "category": "Best Practice", - "startLine": 29, + "startLine": 23, "startColumn": 3, - "endLine": 29, - "endColumn": 19, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "endLine": 23, + "endColumn": 14, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'myMaxLength' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "StackInvalidPath", - "entityType": "Resource", - "resourceType": "AWS::CloudFormation::Stack" + "logicalId": "myMaxLength", + "entityType": "Parameter" }, + "propertyPath": "Parameters/myMaxLength", "category": "Best Practice", - "startLine": 29, + "startLine": 27, "startColumn": 3, - "endLine": 29, - "endColumn": 19, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "endLine": 27, + "endColumn": 14, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'ArtifactoryDbAdmin' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Stack3", - "entityType": "Resource", - "resourceType": "AWS::CloudFormation::Stack" + "logicalId": "ArtifactoryDbAdmin", + "entityType": "Parameter" }, + "propertyPath": "Parameters/ArtifactoryDbAdmin", "category": "Best Practice", - "startLine": 37, + "startLine": 31, "startColumn": 3, - "endLine": 37, - "endColumn": 9, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "endLine": 31, + "endColumn": 21, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'CentralAccountId' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "Stack3", - "entityType": "Resource", - "resourceType": "AWS::CloudFormation::Stack" + "logicalId": "CentralAccountId", + "entityType": "Parameter" }, + "propertyPath": "Parameters/CentralAccountId", "category": "Best Practice", "startLine": 37, "startColumn": 3, "endLine": 37, - "endColumn": 9, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "endColumn": 19, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'StackNormal' of type 'AWS::CloudFormation::Stack' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'CDLAllowedPattern' is not referenced anywhere in the template", + "source": "CFN_LINT", "entity": { - "logicalId": "StackNormal", - "entityType": "Resource", - "resourceType": "AWS::CloudFormation::Stack" + "logicalId": "CDLAllowedPattern", + "entityType": "Parameter" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Parameters/CDLAllowedPattern", "category": "Best Practice", - "startLine": 7, - "startColumn": 5, - "endLine": 7, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "startLine": 42, + "startColumn": 3, + "endLine": 42, + "endColumn": 20, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'StackIsWebUrl' of type 'AWS::CloudFormation::Stack' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'CDLAllowedPatternWithSpaceInDefault' is not referenced anywhere in the template", + "source": "CFN_LINT", "entity": { - "logicalId": "StackIsWebUrl", - "entityType": "Resource", - "resourceType": "AWS::CloudFormation::Stack" + "logicalId": "CDLAllowedPatternWithSpaceInDefault", + "entityType": "Parameter" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Parameters/CDLAllowedPatternWithSpaceInDefault", "category": "Best Practice", - "startLine": 15, - "startColumn": 5, - "endLine": 15, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "startLine": 48, + "startColumn": 3, + "endLine": 48, + "endColumn": 38, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'StackUrlIsObject' of type 'AWS::CloudFormation::Stack' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'CDLAllowedValues' is not referenced anywhere in the template", + "source": "CFN_LINT", "entity": { - "logicalId": "StackUrlIsObject", - "entityType": "Resource", - "resourceType": "AWS::CloudFormation::Stack" + "logicalId": "CDLAllowedValues", + "entityType": "Parameter" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Parameters/CDLAllowedValues", "category": "Best Practice", - "startLine": 23, - "startColumn": 5, - "endLine": 23, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "startLine": 58, + "startColumn": 3, + "endLine": 58, + "endColumn": 19, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'StackInvalidPath' of type 'AWS::CloudFormation::Stack' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'CDLAllowedValuesWithSpaceInDefault' is not referenced anywhere in the template", + "source": "CFN_LINT", "entity": { - "logicalId": "StackInvalidPath", - "entityType": "Resource", - "resourceType": "AWS::CloudFormation::Stack" + "logicalId": "CDLAllowedValuesWithSpaceInDefault", + "entityType": "Parameter" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Parameters/CDLAllowedValuesWithSpaceInDefault", "category": "Best Practice", - "startLine": 31, - "startColumn": 5, - "endLine": 31, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "startLine": 67, + "startColumn": 3, + "endLine": 67, + "endColumn": 37, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Stack3' of type 'AWS::CloudFormation::Stack' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'CDLWithoutDefault' is not referenced anywhere in the template", + "source": "CFN_LINT", "entity": { - "logicalId": "Stack3", - "entityType": "Resource", - "resourceType": "AWS::CloudFormation::Stack" + "logicalId": "CDLWithoutDefault", + "entityType": "Parameter" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Parameters/CDLWithoutDefault", "category": "Best Practice", - "startLine": 39, - "startColumn": 5, - "endLine": 39, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "startLine": 76, + "startColumn": 3, + "endLine": 76, + "endColumn": 20, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" - } - ] - }, - "good/resources/cloudfront/aliases.yaml": { - "filePath": "good/resources/cloudfront/aliases.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 1, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'CloudFrontDistribution' of type 'AWS::CloudFront::Distribution' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'StringList' is not referenced anywhere in the template", + "source": "CFN_LINT", "entity": { - "logicalId": "CloudFrontDistribution", - "entityType": "Resource", - "resourceType": "AWS::CloudFront::Distribution" + "logicalId": "StringList", + "entityType": "Parameter" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Parameters/StringList", "category": "Best Practice", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "startLine": 78, + "startColumn": 3, + "endLine": 78, + "endColumn": 13, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" } ] }, - "good/resources/dynamodb/attributes.yaml": { - "filePath": "good/resources/dynamodb/attributes.yaml", + "good/parameters/not_used_parameters.yaml": { + "filePath": "good/parameters/not_used_parameters.yaml", "status": "OK", "metadata": { "resourcesScanned": 2, "counts": { "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 8, + "errors": 2, + "warnings": 1, + "informational": 4, "debug": 0 }, "suppressed": 0, @@ -14736,173 +13611,172 @@ }, "diagnostics": [ { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "DDBTable1", - "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" - }, - "category": "Best Practice", - "startLine": 6, - "startColumn": 3, - "endLine": 6, - "endColumn": 12, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-123456' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "DDBTable1", + "logicalId": "LaunchConfiguration", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::AutoScaling::LaunchConfiguration" }, - "category": "Best Practice", - "startLine": 6, - "startColumn": 3, - "endLine": 6, - "endColumn": 12, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 20, + "startColumn": 7, + "endLine": 20, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-123456" + } }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "ruleId": "E2531", + "severity": "ERROR", + "message": "Runtime 'java8' was deprecated on '2024-01-08'. Creation was disabled on '2024-02-08', and updates will be disabled on '2027-03-03'. Please consider updating to 'java25'", "source": "CFN_LINT", "entity": { - "logicalId": "DDBTable2", + "logicalId": "SomeLambda", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::Serverless::Function" }, - "category": "Best Practice", - "startLine": 34, - "startColumn": 3, - "endLine": 34, - "endColumn": 12, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 12, + "startColumn": 7, + "endLine": 12, + "endColumn": 14, + "ruleDescription": "Check if Lambda Function Runtimes are blocked for create", + "phase": "SCHEMA", + "context": { + "actualValue": "java8", + "lifecycle": "create-blocked" + } }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "ruleId": "W3697", + "severity": "WARN", + "message": "Resource type 'AWS::AutoScaling::LaunchConfiguration' is from a service in maintenance mode since 2024-10-01. Consider migrating to an alternative", "source": "CFN_LINT", "entity": { - "logicalId": "DDBTable2", + "logicalId": "LaunchConfiguration", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::AutoScaling::LaunchConfiguration" }, - "category": "Best Practice", - "startLine": 34, + "category": "Deprecation", + "startLine": 17, "startColumn": 3, - "endLine": 34, - "endColumn": 12, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "endLine": 17, + "endColumn": 22, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", + "ruleDescription": "Resource type is from a service in maintenance mode", + "phase": "SCHEMA" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DDBTable1", + "logicalId": "LaunchConfiguration", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::AutoScaling::LaunchConfiguration" }, - "propertyPath": "Properties.KeySchema", + "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 16, + "startLine": 20, "startColumn": 7, - "endLine": 16, - "endColumn": 16, + "endLine": 20, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'InstanceType' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DDBTable2", + "logicalId": "LaunchConfiguration", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::AutoScaling::LaunchConfiguration" }, - "propertyPath": "Properties.KeySchema", + "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 47, + "startLine": 21, "startColumn": 7, - "endLine": 47, - "endColumn": 16, + "endLine": 21, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only" } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'DDBTable1' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", + "message": "Property 'UserData' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DDBTable1", + "logicalId": "LaunchConfiguration", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::AutoScaling::LaunchConfiguration" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 8, - "startColumn": 5, - "endLine": 8, + "startLine": 22, + "startColumn": 7, + "endLine": 22, "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "dynamic (Base64 with unresolvable argument)" + } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'DDBTable2' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", + "message": "Resource 'SomeLambda' of type 'AWS::Serverless::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "DDBTable2", + "logicalId": "SomeLambda", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::Serverless::Function" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 36, + "startLine": 10, "startColumn": 5, - "endLine": 36, + "endLine": 10, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "good/resources/dynamodb/attributes_transform.yaml": { - "filePath": "good/resources/dynamodb/attributes_transform.yaml", + "good/parameters/used_transform_language_extension.json": { + "filePath": "good/parameters/used_transform_language_extension.json", "status": "OK", "metadata": { - "resourcesScanned": 3, + "resourcesScanned": 1, "counts": { - "fatal": 4, - "errors": 3, - "warnings": 0, - "informational": 12, + "fatal": 0, + "errors": 0, + "warnings": 4, + "informational": 0, "debug": 0 }, "suppressed": 0, @@ -14911,309 +13785,392 @@ }, "diagnostics": [ { - "ruleId": "F1101", - "severity": "FATAL", - "message": "Fn::Transform: Fn::Transform value must be an object", - "source": "SCHEMA", + "ruleId": "W8001", + "severity": "WARN", + "message": "Condition 'IsParamAEnabled' is not used by any resource or Fn::If", + "source": "CFN_LINT", "entity": { - "logicalId": "DDBTableTransformAttributeDefinitions", - "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "logicalId": "IsParamAEnabled", + "entityType": "Condition" }, - "propertyPath": "Properties.AttributeDefinitions.Fn::Transform", - "category": "Structure", - "startLine": 11, - "startColumn": 9, - "endLine": 11, - "endColumn": 22, - "ruleDescription": "Invalid YAML/JSON syntax", - "phase": "PARSE" + "propertyPath": "Conditions/IsParamAEnabled", + "category": "Best Practice", + "startLine": 34, + "startColumn": 5, + "endLine": 34, + "endColumn": 16, + "ruleDescription": "Check if Conditions are Used", + "phase": "LINT" }, { - "ruleId": "F1101", - "severity": "FATAL", - "message": "Fn::Transform: Fn::Transform value must be an object", - "source": "SCHEMA", + "ruleId": "W8001", + "severity": "WARN", + "message": "Condition 'IsParamBEnabled' is not used by any resource or Fn::If", + "source": "CFN_LINT", "entity": { - "logicalId": "DDBTableTransformKeySchema", - "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "logicalId": "IsParamBEnabled", + "entityType": "Condition" }, - "propertyPath": "Properties.KeySchema.Fn::Transform", - "category": "Structure", - "startLine": 25, - "startColumn": 9, - "endLine": 25, - "endColumn": 22, - "ruleDescription": "Invalid YAML/JSON syntax", - "phase": "PARSE" + "propertyPath": "Conditions/IsParamBEnabled", + "category": "Best Practice", + "startLine": 34, + "startColumn": 5, + "endLine": 34, + "endColumn": 16, + "ruleDescription": "Check if Conditions are Used", + "phase": "LINT" }, { - "ruleId": "F1101", - "severity": "FATAL", - "message": "Fn::Transform: Fn::Transform value must be an object", - "source": "SCHEMA", + "ruleId": "W8001", + "severity": "WARN", + "message": "Condition 'IsParamCEnabled' is not used by any resource or Fn::If", + "source": "CFN_LINT", "entity": { - "logicalId": "DDBTableTransformBoth", - "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "logicalId": "IsParamCEnabled", + "entityType": "Condition" }, - "propertyPath": "Properties.AttributeDefinitions.Fn::Transform", - "category": "Structure", - "startLine": 33, - "startColumn": 9, - "endLine": 33, - "endColumn": 22, - "ruleDescription": "Invalid YAML/JSON syntax", - "phase": "PARSE" + "propertyPath": "Conditions/IsParamCEnabled", + "category": "Best Practice", + "startLine": 34, + "startColumn": 5, + "endLine": 34, + "endColumn": 16, + "ruleDescription": "Check if Conditions are Used", + "phase": "LINT" }, { - "ruleId": "F1101", - "severity": "FATAL", - "message": "Fn::Transform: Fn::Transform value must be an object", - "source": "SCHEMA", + "ruleId": "W8001", + "severity": "WARN", + "message": "Condition 'IsParamDEnabled' is not used by any resource or Fn::If", + "source": "CFN_LINT", "entity": { - "logicalId": "DDBTableTransformBoth", - "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "logicalId": "IsParamDEnabled", + "entityType": "Condition" }, - "propertyPath": "Properties.KeySchema.Fn::Transform", - "category": "Structure", - "startLine": 38, - "startColumn": 9, - "endLine": 38, - "endColumn": 22, - "ruleDescription": "Invalid YAML/JSON syntax", - "phase": "PARSE" + "propertyPath": "Conditions/IsParamDEnabled", + "category": "Best Practice", + "startLine": 34, + "startColumn": 5, + "endLine": 34, + "endColumn": 16, + "ruleDescription": "Check if Conditions are Used", + "phase": "LINT" + } + ] + }, + "good/parameters/used_transform_removed.yaml": { + "filePath": "good/parameters/used_transform_removed.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 1, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "E3639", - "severity": "ERROR", - "message": "ProvisionedThroughput is required when BillingMode defaults to 'PROVISIONED'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'MyAPI' of type 'AWS::Serverless::Api' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "DDBTableTransformAttributeDefinitions", + "logicalId": "MyAPI", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::Serverless::Api" }, - "propertyPath": "Properties.ProvisionedThroughput", - "suggestedFix": "Add ProvisionedThroughput or set BillingMode to 'PAY_PER_REQUEST'", - "category": "Resource", - "startLine": 9, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 15, "startColumn": 5, - "endLine": 9, + "endLine": 15, "endColumn": 15, - "ruleDescription": "Validate DynamoDB table ProvisionedThroughput is set when BillingMode is PROVISIONED", + "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "good/parameters/used_transforms.yaml": { + "filePath": "good/parameters/used_transforms.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 2, + "counts": { + "fatal": 0, + "errors": 2, + "warnings": 1, + "informational": 4, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "E3639", + "ruleId": "E1152", "severity": "ERROR", - "message": "ProvisionedThroughput is required when BillingMode defaults to 'PROVISIONED'", + "message": "'ami-123456' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "DDBTableTransformKeySchema", - "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" - }, - "propertyPath": "Properties.ProvisionedThroughput", - "suggestedFix": "Add ProvisionedThroughput or set BillingMode to 'PAY_PER_REQUEST'", - "category": "Resource", - "startLine": 20, - "startColumn": 5, - "endLine": 20, - "endColumn": 15, - "ruleDescription": "Validate DynamoDB table ProvisionedThroughput is set when BillingMode is PROVISIONED", - "phase": "LINT" + "logicalId": "LaunchConfiguration", + "entityType": "Resource", + "resourceType": "AWS::AutoScaling::LaunchConfiguration" + }, + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 23, + "startColumn": 7, + "endLine": 23, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-123456" + } }, { - "ruleId": "E3639", + "ruleId": "E2531", "severity": "ERROR", - "message": "ProvisionedThroughput is required when BillingMode defaults to 'PROVISIONED'", + "message": "Runtime 'java8' was deprecated on '2024-01-08'. Creation was disabled on '2024-02-08', and updates will be disabled on '2027-03-03'. Please consider updating to 'java25'", "source": "CFN_LINT", "entity": { - "logicalId": "DDBTableTransformBoth", + "logicalId": "SomeLambda", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::Serverless::Function" }, - "propertyPath": "Properties.ProvisionedThroughput", - "suggestedFix": "Add ProvisionedThroughput or set BillingMode to 'PAY_PER_REQUEST'", - "category": "Resource", - "startLine": 31, - "startColumn": 5, - "endLine": 31, - "endColumn": 15, - "ruleDescription": "Validate DynamoDB table ProvisionedThroughput is set when BillingMode is PROVISIONED", - "phase": "LINT" + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 18, + "startColumn": 7, + "endLine": 18, + "endColumn": 14, + "ruleDescription": "Check if Lambda Function Runtimes are blocked for create", + "phase": "SCHEMA", + "context": { + "actualValue": "java8", + "lifecycle": "create-blocked" + } }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "ruleId": "W3697", + "severity": "WARN", + "message": "Resource type 'AWS::AutoScaling::LaunchConfiguration' is from a service in maintenance mode since 2024-10-01. Consider migrating to an alternative", "source": "CFN_LINT", "entity": { - "logicalId": "DDBTableTransformAttributeDefinitions", + "logicalId": "LaunchConfiguration", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::AutoScaling::LaunchConfiguration" }, - "category": "Best Practice", - "startLine": 7, + "category": "Deprecation", + "startLine": 20, "startColumn": 3, - "endLine": 7, - "endColumn": 40, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "endLine": 20, + "endColumn": 22, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", + "ruleDescription": "Resource type is from a service in maintenance mode", + "phase": "SCHEMA" }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "DDBTableTransformAttributeDefinitions", + "logicalId": "LaunchConfiguration", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::AutoScaling::LaunchConfiguration" }, + "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 7, - "startColumn": 3, - "endLine": 7, - "endColumn": 40, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 23, + "startColumn": 7, + "endLine": 23, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'InstanceType' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "DDBTableTransformKeySchema", + "logicalId": "LaunchConfiguration", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::AutoScaling::LaunchConfiguration" }, + "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 18, - "startColumn": 3, - "endLine": 18, - "endColumn": 29, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 24, + "startColumn": 7, + "endLine": 24, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'UserData' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "DDBTableTransformKeySchema", + "logicalId": "LaunchConfiguration", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::AutoScaling::LaunchConfiguration" }, + "propertyPath": "Properties.UserData", "category": "Best Practice", - "startLine": 18, - "startColumn": 3, - "endLine": 18, - "endColumn": 29, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 25, + "startColumn": 7, + "endLine": 25, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "dynamic (Base64 with unresolvable argument)" + } }, { - "ruleId": "I3011", + "ruleId": "I9040", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Resource 'SomeLambda' of type 'AWS::Serverless::Function' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "DDBTableTransformBoth", + "logicalId": "SomeLambda", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::Serverless::Function" }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 29, - "startColumn": 3, - "endLine": 29, - "endColumn": 24, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "startLine": 16, + "startColumn": 5, + "endLine": 16, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "good/properties_ec2_vpc.yaml": { + "filePath": "good/properties_ec2_vpc.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 7, + "counts": { + "fatal": 0, + "errors": 2, + "warnings": 0, + "informational": 21, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "ruleId": "E1151", + "severity": "ERROR", + "message": "'vpc-1234567' does not match format 'AWS::EC2::VPC.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "DDBTableTransformBoth", + "logicalId": "mySubnet21", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::Subnet" }, - "category": "Best Practice", - "startLine": 29, - "startColumn": 3, - "endLine": 29, - "endColumn": 24, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "propertyPath": "Properties.VpcId", + "category": "Intrinsic Function", + "startLine": 61, + "startColumn": 7, + "endLine": 61, + "endColumn": 12, + "ruleDescription": "Validate VPC id format", + "phase": "SCHEMA", + "context": { + "actualValue": "vpc-1234567" + } }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "E1151", + "severity": "ERROR", + "message": "'vpc-1234567' does not match format 'AWS::EC2::VPC.Id'", + "source": "CFN_LINT", "entity": { - "logicalId": "DDBTableTransformAttributeDefinitions", + "logicalId": "mySubnet22", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.KeySchema", - "category": "Best Practice", - "startLine": 15, + "propertyPath": "Properties.VpcId", + "category": "Intrinsic Function", + "startLine": 66, "startColumn": 7, - "endLine": 15, - "endColumn": 16, - "ruleDescription": "Create-only property updated triggers resource replacement", + "endLine": 66, + "endColumn": 12, + "ruleDescription": "Validate VPC id format", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "actualValue": "vpc-1234567" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DDBTableTransformKeySchema", + "logicalId": "myVpc1", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::VPC" }, - "propertyPath": "Properties.KeySchema", + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 24, + "startLine": 32, "startColumn": 7, - "endLine": 24, + "endLine": 32, "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only", + "resolutionSource": "parameter 'cidrBlockAllowedPattern' (type String)" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'InstanceTenancy' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DDBTableTransformBoth", + "logicalId": "myVpc1", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::VPC" }, - "propertyPath": "Properties.KeySchema", + "propertyPath": "Properties.InstanceTenancy", "category": "Best Practice", - "startLine": 37, + "startLine": 33, "startColumn": 7, - "endLine": 37, - "endColumn": 16, + "endLine": 33, + "endColumn": 22, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -15221,276 +14178,293 @@ } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'DDBTableTransformAttributeDefinitions' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", + "message": "Property 'InstanceTenancy' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DDBTableTransformAttributeDefinitions", + "logicalId": "myVpc2", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::VPC" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.InstanceTenancy", "category": "Best Practice", - "startLine": 9, - "startColumn": 5, - "endLine": 9, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 37, + "startColumn": 7, + "endLine": 37, + "endColumn": 22, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only", + "resolutionSource": "parameter with AllowedValues" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'DDBTableTransformKeySchema' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DDBTableTransformKeySchema", + "logicalId": "myVpc2", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::VPC" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 20, - "startColumn": 5, - "endLine": 20, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 38, + "startColumn": 7, + "endLine": 38, + "endColumn": 16, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "parameter 'cidrBlockAllowedPattern' (type String)" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'DDBTableTransformBoth' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", + "message": "Property 'InstanceTenancy' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DDBTableTransformBoth", + "logicalId": "myVpc3", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::VPC" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.InstanceTenancy", "category": "Best Practice", - "startLine": 31, - "startColumn": 5, - "endLine": 31, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "good/resources/dynamodb/attributes_transform_object.yaml": { - "filePath": "good/resources/dynamodb/attributes_transform_object.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 3, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 12, - "debug": 0 + "startLine": 42, + "startColumn": 7, + "endLine": 42, + "endColumn": 22, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only", + "resolutionSource": "parameter with AllowedValues" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "DDBTableTransformAttributeDefinitions", + "logicalId": "myVpc3", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::VPC" }, + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 4, - "startColumn": 3, - "endLine": 4, - "endColumn": 40, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 43, + "startColumn": 7, + "endLine": 43, + "endColumn": 16, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "parameter with AllowedValues" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'InstanceTenancy' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "DDBTableTransformAttributeDefinitions", + "logicalId": "myVpc4", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::VPC" }, + "propertyPath": "Properties.InstanceTenancy", "category": "Best Practice", - "startLine": 4, - "startColumn": 3, - "endLine": 4, - "endColumn": 40, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 47, + "startColumn": 7, + "endLine": 47, + "endColumn": 22, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only", + "resolutionSource": "parameter with AllowedValues" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "DDBTableTransformKeySchema", + "logicalId": "myVpc4", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::VPC" }, + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 16, - "startColumn": 3, - "endLine": 16, - "endColumn": 29, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 48, + "startColumn": 7, + "endLine": 48, + "endColumn": 16, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "parameter with AllowedValues" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'InstanceTenancy' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "DDBTableTransformKeySchema", + "logicalId": "myVpc5", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::VPC" }, + "propertyPath": "Properties.InstanceTenancy", "category": "Best Practice", - "startLine": 16, - "startColumn": 3, - "endLine": 16, - "endColumn": 29, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 52, + "startColumn": 7, + "endLine": 52, + "endColumn": 22, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "DDBTableTransformBoth", + "logicalId": "myVpc5", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::VPC" }, + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 28, - "startColumn": 3, - "endLine": 28, - "endColumn": 24, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 53, + "startColumn": 7, + "endLine": 53, + "endColumn": 16, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "DDBTableTransformBoth", + "logicalId": "mySubnet21", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::Subnet" }, + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 28, - "startColumn": 3, - "endLine": 28, - "endColumn": 24, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 57, + "startColumn": 7, + "endLine": 57, + "endColumn": 16, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "dynamic (Select with unresolvable arguments)" + } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DDBTableTransformAttributeDefinitions", + "logicalId": "mySubnet21", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.KeySchema", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 13, + "startLine": 61, "startColumn": 7, - "endLine": 13, - "endColumn": 16, + "endLine": 61, + "endColumn": 12, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DDBTableTransformKeySchema", + "logicalId": "mySubnet22", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.KeySchema", + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 23, + "startLine": 65, "startColumn": 7, - "endLine": 23, + "endLine": 65, "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only", - "resolutionSource": "dynamic (macro output)" + "lifecycle": "create-only", + "resolutionSource": "parameter 'cidrBlockAllowedPattern' (type String)" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DDBTableTransformBoth", + "logicalId": "mySubnet22", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.KeySchema", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 37, + "startLine": 66, "startColumn": 7, - "endLine": 37, - "endColumn": 16, + "endLine": 66, + "endColumn": 12, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only", - "resolutionSource": "dynamic (macro output)" + "lifecycle": "create-only" } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'DDBTableTransformAttributeDefinitions' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", + "message": "Resource 'myVpc1' of type 'AWS::EC2::VPC' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "DDBTableTransformAttributeDefinitions", + "logicalId": "myVpc1", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::VPC" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 6, + "startLine": 31, "startColumn": 5, - "endLine": 6, + "endLine": 31, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -15498,19 +14472,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'DDBTableTransformKeySchema' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", + "message": "Resource 'myVpc2' of type 'AWS::EC2::VPC' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "DDBTableTransformKeySchema", + "logicalId": "myVpc2", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::VPC" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 18, + "startLine": 36, "startColumn": 5, - "endLine": 18, + "endLine": 36, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -15518,594 +14492,858 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'DDBTableTransformBoth' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", + "message": "Resource 'myVpc3' of type 'AWS::EC2::VPC' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "DDBTableTransformBoth", + "logicalId": "myVpc3", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::VPC" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 30, + "startLine": 41, "startColumn": 5, - "endLine": 30, + "endLine": 41, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'myVpc4' of type 'AWS::EC2::VPC' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "myVpc4", + "entityType": "Resource", + "resourceType": "AWS::EC2::VPC" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 46, + "startColumn": 5, + "endLine": 46, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'myVpc5' of type 'AWS::EC2::VPC' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "myVpc5", + "entityType": "Resource", + "resourceType": "AWS::EC2::VPC" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 51, + "startColumn": 5, + "endLine": 51, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'mySubnet21' of type 'AWS::EC2::Subnet' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "mySubnet21", + "entityType": "Resource", + "resourceType": "AWS::EC2::Subnet" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 56, + "startColumn": 5, + "endLine": 56, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'mySubnet22' of type 'AWS::EC2::Subnet' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "mySubnet22", + "entityType": "Resource", + "resourceType": "AWS::EC2::Subnet" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 64, + "startColumn": 5, + "endLine": 64, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "good/resources/dynamodb/conditional_scenarios.yaml": { - "filePath": "good/resources/dynamodb/conditional_scenarios.yaml", + "good/properties_rt_association.yaml": { + "filePath": "good/properties_rt_association.yaml", "status": "OK", "metadata": { - "resourcesScanned": 2, + "resourcesScanned": 6, "counts": { "fatal": 0, "errors": 0, "warnings": 0, - "informational": 5, + "informational": 11, "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "AppSubnetPublicRouteTableAssociation", + "entityType": "Resource", + "resourceType": "AWS::EC2::SubnetRouteTableAssociation" + }, + "propertyPath": "Properties.RouteTableId", + "category": "Best Practice", + "startLine": 31, + "startColumn": 9, + "endLine": 31, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "parameter 'PublicRouteTable' (type String)", + "extra": { + "replacement_strategy": "delete_then_create" + } + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "AppSubnetPublicRouteTableAssociation", + "entityType": "Resource", + "resourceType": "AWS::EC2::SubnetRouteTableAssociation" + }, + "propertyPath": "Properties.SubnetId", + "category": "Best Practice", + "startLine": 33, + "startColumn": 9, + "endLine": 33, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "parameter 'AppSubnet01' (type String)", + "extra": { + "replacement_strategy": "delete_then_create" + } + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "AppSubnetPrivateRouteTableAssociation", + "entityType": "Resource", + "resourceType": "AWS::EC2::SubnetRouteTableAssociation" + }, + "propertyPath": "Properties.RouteTableId", + "category": "Best Practice", + "startLine": 40, + "startColumn": 9, + "endLine": 40, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "parameter 'PrivateRouteTable' (type String)", + "extra": { + "replacement_strategy": "delete_then_create" + } + } + }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "CorrelatedBilling", + "logicalId": "AppSubnetPrivateRouteTableAssociation", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::SubnetRouteTableAssociation" }, + "propertyPath": "Properties.SubnetId", "category": "Best Practice", - "startLine": 9, - "startColumn": 3, - "endLine": 9, - "endColumn": 20, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 42, + "startColumn": 9, + "endLine": 42, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "parameter 'AppSubnet01' (type String)", + "extra": { + "replacement_strategy": "delete_then_create" + } + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "CorrelatedBilling", + "logicalId": "ProxySubnetRouteTableAssociation", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::SubnetRouteTableAssociation" }, + "propertyPath": "Properties.RouteTableId", "category": "Best Practice", - "startLine": 9, - "startColumn": 3, - "endLine": 9, - "endColumn": 20, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 48, + "startColumn": 9, + "endLine": 48, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "parameter 'PublicRouteTable' (type String)", + "extra": { + "replacement_strategy": "delete_then_create" + } + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "CorrelatedIndex", + "logicalId": "ProxySubnetRouteTableAssociation", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::SubnetRouteTableAssociation" }, + "propertyPath": "Properties.SubnetId", "category": "Best Practice", - "startLine": 22, - "startColumn": 3, - "endLine": 22, - "endColumn": 18, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 50, + "startColumn": 9, + "endLine": 50, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Fn::If on condition 'isPublic'", + "extra": { + "replacement_strategy": "delete_then_create" + } + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "CorrelatedIndex", + "logicalId": "PublicSubnetRouteTableAssociation", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::SubnetRouteTableAssociation" }, + "propertyPath": "Properties.RouteTableId", "category": "Best Practice", - "startLine": 22, - "startColumn": 3, - "endLine": 22, - "endColumn": 18, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 56, + "startColumn": 9, + "endLine": 56, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "parameter 'PublicRouteTable' (type String)", + "extra": { + "replacement_strategy": "delete_then_create" + } + } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "CorrelatedIndex", + "logicalId": "PublicSubnetRouteTableAssociation", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::SubnetRouteTableAssociation" }, - "propertyPath": "Properties.KeySchema", + "propertyPath": "Properties.SubnetId", "category": "Best Practice", - "startLine": 31, - "startColumn": 7, - "endLine": 31, - "endColumn": 16, + "startLine": 58, + "startColumn": 9, + "endLine": 58, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only", + "resolutionSource": "parameter 'PublicSubnet01' (type String)", + "extra": { + "replacement_strategy": "delete_then_create" + } } - } - ] - }, - "good/resources/ecs/fargate_conditional_properties.yaml": { - "filePath": "good/resources/ecs/fargate_conditional_properties.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 0, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [] - }, - "good/resources/elasticache/cache_cluster_failover.yaml": { - "filePath": "good/resources/elasticache/cache_cluster_failover.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 10, - "counts": { - "fatal": 0, - "errors": 3, - "warnings": 0, - "informational": 44, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "E1150", - "severity": "ERROR", - "message": "'sg-test' does not match format 'AWS::EC2::SecurityGroup.Id'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ServiceToken' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "FourthReplicationGroup", + "logicalId": "CustomResource", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::CloudFormation::CustomResource" }, - "propertyPath": "Properties.SecurityGroupIds.0", - "category": "Intrinsic Function", - "startLine": 121, + "propertyPath": "Properties.ServiceToken", + "category": "Best Practice", + "startLine": 64, "startColumn": 9, - "endLine": 121, - "endColumn": 10, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-elasticache", - "ruleDescription": "Validate security group format", + "endLine": 64, + "endColumn": 21, + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "actualValue": "sg-test" + "lifecycle": "create-only" } }, { - "ruleId": "E1150", - "severity": "ERROR", - "message": "'sg-test' does not match format 'AWS::EC2::SecurityGroup.Id'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "FifthReplicationGroup", + "logicalId": "CustomSubnetRouteTableAssociation", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::EC2::SubnetRouteTableAssociation" }, - "propertyPath": "Properties.SecurityGroupIds.0", - "category": "Intrinsic Function", - "startLine": 138, - "startColumn": 9, - "endLine": 138, - "endColumn": 10, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-elasticache", - "ruleDescription": "Validate security group format", + "propertyPath": "Properties.RouteTableId", + "category": "Best Practice", + "startLine": 69, + "startColumn": 9, + "endLine": 69, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "actualValue": "sg-test" + "lifecycle": "create-only", + "resolutionSource": "parameter 'PublicRouteTable' (type String)", + "extra": { + "replacement_strategy": "delete_then_create" + } } }, { - "ruleId": "E1150", - "severity": "ERROR", - "message": "'sg-test' does not match format 'AWS::EC2::SecurityGroup.Id'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "SixthReplicationGroup", + "logicalId": "CustomSubnetRouteTableAssociation", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::EC2::SubnetRouteTableAssociation" }, - "propertyPath": "Properties.SecurityGroupIds.0", - "category": "Intrinsic Function", - "startLine": 155, + "propertyPath": "Properties.SubnetId", + "category": "Best Practice", + "startLine": 71, "startColumn": 9, - "endLine": 155, - "endColumn": 10, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-elasticache", - "ruleDescription": "Validate security group format", + "endLine": 71, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "actualValue": "sg-test" + "lifecycle": "create-only", + "resolutionSource": "GetAtt CustomResource.PublicSubnet", + "extra": { + "replacement_strategy": "delete_then_create" + } } + } + ] + }, + "good/redshift_private.yaml": { + "filePath": "good/redshift_private.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 7, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 14, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "BasicReplicationGroup", + "logicalId": "Subnet1", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::EC2::Subnet" }, + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 48, - "startColumn": 3, - "endLine": 48, - "endColumn": 24, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 6, + "startColumn": 7, + "endLine": 6, + "endColumn": 12, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'VPC'" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "BasicReplicationGroup", + "logicalId": "Subnet1", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::EC2::Subnet" }, + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 48, - "startColumn": 3, - "endLine": 48, - "endColumn": 24, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 7, + "startColumn": 7, + "endLine": 7, + "endColumn": 16, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "SecondReplicationGroup", + "logicalId": "VPC", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::EC2::VPC" }, + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 67, - "startColumn": 3, - "endLine": 67, - "endColumn": 25, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 11, + "startColumn": 7, + "endLine": 11, + "endColumn": 16, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "SecondReplicationGroup", + "logicalId": "RouteTable1", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::EC2::RouteTable" }, + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 67, - "startColumn": 3, - "endLine": 67, - "endColumn": 25, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 21, + "startColumn": 7, + "endLine": 21, + "endColumn": 12, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'VPC'" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ThirdReplicationGroup", + "logicalId": "SubnetRTAssoc", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::EC2::SubnetRouteTableAssociation" }, + "propertyPath": "Properties.SubnetId", "category": "Best Practice", - "startLine": 87, - "startColumn": 3, - "endLine": 87, - "endColumn": 24, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 25, + "startColumn": 7, + "endLine": 25, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'Subnet1'", + "extra": { + "replacement_strategy": "delete_then_create" + } + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ThirdReplicationGroup", + "logicalId": "SubnetRTAssoc", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::EC2::SubnetRouteTableAssociation" }, + "propertyPath": "Properties.RouteTableId", "category": "Best Practice", - "startLine": 87, - "startColumn": 3, - "endLine": 87, - "endColumn": 24, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 26, + "startColumn": 7, + "endLine": 26, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'RouteTable1'", + "extra": { + "replacement_strategy": "delete_then_create" + } + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "FourthReplicationGroup", + "logicalId": "NatGW", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::EC2::NatGateway" }, + "propertyPath": "Properties.SubnetId", "category": "Best Practice", - "startLine": 106, - "startColumn": 3, - "endLine": 106, - "endColumn": 25, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 30, + "startColumn": 7, + "endLine": 30, + "endColumn": 15, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'Subnet1'" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'RouteTableId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "FourthReplicationGroup", + "logicalId": "Route1", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::EC2::Route" }, + "propertyPath": "Properties.RouteTableId", "category": "Best Practice", - "startLine": 106, - "startColumn": 3, - "endLine": 106, - "endColumn": 25, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 34, + "startColumn": 7, + "endLine": 34, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'RouteTable1'" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'DestinationCidrBlock' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "FifthReplicationGroup", + "logicalId": "Route1", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::EC2::Route" }, + "propertyPath": "Properties.DestinationCidrBlock", "category": "Best Practice", - "startLine": 122, - "startColumn": 3, - "endLine": 122, - "endColumn": 24, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 35, + "startColumn": 7, + "endLine": 35, + "endColumn": 27, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9040", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Resource 'Subnet1' of type 'AWS::EC2::Subnet' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "FifthReplicationGroup", + "logicalId": "Subnet1", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::EC2::Subnet" }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 122, - "startColumn": 3, - "endLine": 122, - "endColumn": 24, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "I3011", + "ruleId": "I9040", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Resource 'VPC' of type 'AWS::EC2::VPC' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "SixthReplicationGroup", + "logicalId": "VPC", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::EC2::VPC" }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 139, - "startColumn": 3, - "endLine": 139, - "endColumn": 24, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "startLine": 10, + "startColumn": 5, + "endLine": 10, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "I3011", + "ruleId": "I9040", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Resource 'RedshiftSubnetGroup' of type 'AWS::Redshift::ClusterSubnetGroup' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "SixthReplicationGroup", + "logicalId": "RedshiftSubnetGroup", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::Redshift::ClusterSubnetGroup" }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 139, - "startColumn": 3, - "endLine": 139, - "endColumn": 24, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "startLine": 14, + "startColumn": 5, + "endLine": 14, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "I3100", + "ruleId": "I9040", "severity": "INFO", - "message": "Previous generation instance type 'cache.r3.large' - consider upgrading", - "source": "CFN_LINT", + "message": "Resource 'RouteTable1' of type 'AWS::EC2::RouteTable' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "BasicReplicationGroup", + "logicalId": "RouteTable1", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::EC2::RouteTable" }, - "propertyPath": "Properties.CacheNodeType", - "suggestedFix": "Upgrade to a current generation instance type", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 54, - "startColumn": 7, - "endLine": 54, - "endColumn": 20, - "ruleDescription": "Checks for legacy instance type generations", + "startLine": 20, + "startColumn": 5, + "endLine": 20, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "I3100", + "ruleId": "I9040", "severity": "INFO", - "message": "Previous generation instance type 'cache.r3.large' - consider upgrading", - "source": "CFN_LINT", + "message": "Resource 'NatGW' of type 'AWS::EC2::NatGateway' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "SecondReplicationGroup", + "logicalId": "NatGW", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::EC2::NatGateway" }, - "propertyPath": "Properties.CacheNodeType", - "suggestedFix": "Upgrade to a current generation instance type", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 73, - "startColumn": 7, - "endLine": 73, - "endColumn": 20, - "ruleDescription": "Checks for legacy instance type generations", + "startLine": 29, + "startColumn": 5, + "endLine": 29, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "good/redshift_valid_nodetype.yaml": { + "filePath": "good/redshift_valid_nodetype.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 1, + "informational": 7, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I3100", - "severity": "INFO", - "message": "Previous generation instance type 'cache.r3.large' - consider upgrading", + "ruleId": "W2501", + "severity": "WARN", + "message": "Property 'MasterUserPassword' should not be a hardcoded string - use a parameter with NoEcho or a dynamic reference", "source": "CFN_LINT", "entity": { - "logicalId": "ThirdReplicationGroup", + "logicalId": "Cluster", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::Redshift::Cluster" }, - "propertyPath": "Properties.CacheNodeType", - "suggestedFix": "Upgrade to a current generation instance type", - "category": "Best Practice", - "startLine": 92, + "propertyPath": "Properties.MasterUserPassword", + "category": "Security", + "startLine": 8, "startColumn": 7, - "endLine": 92, - "endColumn": 20, - "ruleDescription": "Checks for legacy instance type generations", + "endLine": 8, + "endColumn": 25, + "ruleDescription": "Check if Password Properties are correctly configured", "phase": "LINT" }, { - "ruleId": "I3100", + "ruleId": "I3011", "severity": "INFO", - "message": "Previous generation instance type 'cache.r3.large' - consider upgrading", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "FourthReplicationGroup", + "logicalId": "Cluster", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::Redshift::Cluster" }, - "propertyPath": "Properties.CacheNodeType", - "suggestedFix": "Upgrade to a current generation instance type", "category": "Best Practice", - "startLine": 111, - "startColumn": 7, - "endLine": 111, - "endColumn": 20, - "ruleDescription": "Checks for legacy instance type generations", + "startLine": 2, + "startColumn": 3, + "endLine": 2, + "endColumn": 10, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "I3100", + "ruleId": "I3011", "severity": "INFO", - "message": "Previous generation instance type 'cache.r3.large' - consider upgrading", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "FifthReplicationGroup", + "logicalId": "Cluster", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::Redshift::Cluster" }, - "propertyPath": "Properties.CacheNodeType", - "suggestedFix": "Upgrade to a current generation instance type", "category": "Best Practice", - "startLine": 128, - "startColumn": 7, - "endLine": 128, - "endColumn": 20, - "ruleDescription": "Checks for legacy instance type generations", + "startLine": 2, + "startColumn": 3, + "endLine": 2, + "endColumn": 10, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "I3100", + "ruleId": "I3013", "severity": "INFO", - "message": "Previous generation instance type 'cache.r3.large' - consider upgrading", + "message": "'AutomatedSnapshotRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", "source": "CFN_LINT", "entity": { - "logicalId": "SixthReplicationGroup", + "logicalId": "Cluster", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::Redshift::Cluster" }, - "propertyPath": "Properties.CacheNodeType", - "suggestedFix": "Upgrade to a current generation instance type", + "propertyPath": "Properties", "category": "Best Practice", - "startLine": 145, - "startColumn": 7, - "endLine": 145, - "endColumn": 20, - "ruleDescription": "Checks for legacy instance type generations", + "startLine": 4, + "startColumn": 5, + "endLine": 4, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'CacheParameterGroupFamily' is create-only; updating it will cause resource replacement", + "message": "Property 'MasterUsername' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MyParameterGroup", + "logicalId": "Cluster", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ParameterGroup" + "resourceType": "AWS::Redshift::Cluster" }, - "propertyPath": "Properties.CacheParameterGroupFamily", + "propertyPath": "Properties.MasterUsername", "category": "Best Practice", - "startLine": 19, + "startLine": 7, "startColumn": 7, - "endLine": 19, - "endColumn": 32, + "endLine": 7, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -16115,19 +15353,20 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'CacheParameterGroupFamily' is create-only; updating it will cause resource replacement", + "message": "Property 'DBName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MyClusterParameterGroup", + "logicalId": "Cluster", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ParameterGroup" + "resourceType": "AWS::Redshift::Cluster" }, - "propertyPath": "Properties.CacheParameterGroupFamily", + "propertyPath": "Properties.DBName", "category": "Best Practice", - "startLine": 27, + "startLine": 9, "startColumn": 7, - "endLine": 27, - "endColumn": 32, + "endLine": 9, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -16135,135 +15374,125 @@ } }, { - "ruleId": "I9001", + "ruleId": "I9003", "severity": "INFO", - "message": "Property 'CacheParameterGroupFamily' is create-only; updating it will cause resource replacement", + "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", "source": "ENGINE", - "entity": { - "logicalId": "MyNonClusterParameterGroup", - "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ParameterGroup" - }, - "propertyPath": "Properties.CacheParameterGroupFamily", "category": "Best Practice", - "startLine": 35, - "startColumn": 7, - "endLine": 35, - "endColumn": 32, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'CacheParameterGroupFamily' is create-only; updating it will cause resource replacement", + "message": "Resource 'Cluster' of type 'AWS::Redshift::Cluster' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "MyOptionalClusterParameterGroup", + "logicalId": "Cluster", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ParameterGroup" + "resourceType": "AWS::Redshift::Cluster" }, - "propertyPath": "Properties.CacheParameterGroupFamily", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 44, - "startColumn": 7, - "endLine": 44, - "endColumn": 32, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 4, + "startColumn": 5, + "endLine": 4, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "good/reference_values_are_not_literals.yaml": { + "filePath": "good/reference_values_are_not_literals.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 6, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 10, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'CacheSubnetGroupName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "BasicReplicationGroup", + "logicalId": "FifoQueue", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Properties.CacheSubnetGroupName", "category": "Best Practice", - "startLine": 55, - "startColumn": 7, - "endLine": 55, - "endColumn": 27, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-elasticache", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 21, + "startColumn": 3, + "endLine": 21, + "endColumn": 12, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'Port' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "BasicReplicationGroup", + "logicalId": "FifoQueue", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Properties.Port", "category": "Best Practice", - "startLine": 60, - "startColumn": 7, - "endLine": 60, - "endColumn": 11, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-elasticache", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 21, + "startColumn": 3, + "endLine": 21, + "endColumn": 12, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3013", "severity": "INFO", - "message": "Property 'CacheSubnetGroupName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'MessageRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "SecondReplicationGroup", + "logicalId": "FifoQueue", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Properties.CacheSubnetGroupName", + "propertyPath": "Properties", "category": "Best Practice", - "startLine": 74, - "startColumn": 7, - "endLine": 74, - "endColumn": 27, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-elasticache", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 23, + "startColumn": 5, + "endLine": 23, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Port' is create-only; updating it will cause resource replacement", + "message": "Property 'HostedZoneName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SecondReplicationGroup", + "logicalId": "Record", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::Route53::RecordSet" }, - "propertyPath": "Properties.Port", + "propertyPath": "Properties.HostedZoneName", "category": "Best Practice", - "startLine": 80, + "startLine": 16, "startColumn": 7, - "endLine": 80, - "endColumn": 11, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-elasticache", + "endLine": 16, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53-recordset", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -16273,20 +15502,20 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'CacheSubnetGroupName' is create-only; updating it will cause resource replacement", + "message": "Property 'FifoQueue' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ThirdReplicationGroup", + "logicalId": "FifoQueue", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Properties.CacheSubnetGroupName", + "propertyPath": "Properties.FifoQueue", "category": "Best Practice", - "startLine": 93, + "startLine": 24, "startColumn": 7, - "endLine": 93, - "endColumn": 27, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-elasticache", + "endLine": 24, + "endColumn": 16, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sqs.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -16296,66 +15525,67 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Port' is create-only; updating it will cause resource replacement", + "message": "Property 'QueueName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ThirdReplicationGroup", + "logicalId": "FifoQueue", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Properties.Port", + "propertyPath": "Properties.QueueName", "category": "Best Practice", - "startLine": 99, + "startLine": 25, "startColumn": 7, - "endLine": 99, - "endColumn": 11, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-elasticache", + "endLine": 25, + "endColumn": 16, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sqs.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "GetAtt Store.Value" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'AtRestEncryptionEnabled' is create-only; updating it will cause resource replacement", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FourthReplicationGroup", + "logicalId": "Database", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.AtRestEncryptionEnabled", + "propertyPath": "Properties.Engine", "category": "Best Practice", - "startLine": 109, + "startLine": 54, "startColumn": 7, - "endLine": 109, - "endColumn": 30, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-elasticache", + "endLine": 54, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'CacheSubnetGroupName' is create-only; updating it will cause resource replacement", + "message": "Property 'MasterUsername' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FourthReplicationGroup", + "logicalId": "Database", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.CacheSubnetGroupName", + "propertyPath": "Properties.MasterUsername", "category": "Best Practice", - "startLine": 113, + "startLine": 57, "startColumn": 7, - "endLine": 113, - "endColumn": 27, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-elasticache", + "endLine": 57, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -16365,20 +15595,20 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'AtRestEncryptionEnabled' is create-only; updating it will cause resource replacement", + "message": "Property 'StorageEncrypted' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FifthReplicationGroup", + "logicalId": "Database", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.AtRestEncryptionEnabled", + "propertyPath": "Properties.StorageEncrypted", "category": "Best Practice", - "startLine": 126, + "startLine": 59, "startColumn": 7, - "endLine": 126, - "endColumn": 30, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-elasticache", + "endLine": 59, + "endColumn": 23, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -16388,66 +15618,99 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'CacheSubnetGroupName' is create-only; updating it will cause resource replacement", + "message": "Property 'BackupRetentionPeriod' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FifthReplicationGroup", + "logicalId": "Database", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.CacheSubnetGroupName", + "propertyPath": "Properties.BackupRetentionPeriod", "category": "Best Practice", - "startLine": 130, + "startLine": 60, "startColumn": 7, - "endLine": 130, - "endColumn": 27, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-elasticache", + "endLine": 60, + "endColumn": 28, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } + } + ] + }, + "good/region_conditional_resource_type.yaml": { + "filePath": "good/region_conditional_resource_type.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 2, + "informational": 2, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'AtRestEncryptionEnabled' is create-only; updating it will cause resource replacement", + "ruleId": "W9002", + "severity": "WARN", + "message": "Property 'ProjectArn' has a hardcoded ARN - use Ref, GetAtt, or a parameter instead", "source": "ENGINE", "entity": { - "logicalId": "SixthReplicationGroup", + "logicalId": "Pool", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::DeviceFarm::DevicePool" }, - "propertyPath": "Properties.AtRestEncryptionEnabled", + "propertyPath": "Properties.ProjectArn", "category": "Best Practice", - "startLine": 143, + "startLine": 14, "startColumn": 7, - "endLine": 143, - "endColumn": 30, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-elasticache", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "endLine": 14, + "endColumn": 17, + "ruleDescription": "Hardcoded ARN property", + "phase": "LINT" + }, + { + "ruleId": "W9013", + "severity": "WARN", + "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", + "source": "ENGINE", + "entity": { + "logicalId": "Pool", + "entityType": "Resource", + "resourceType": "AWS::DeviceFarm::DevicePool" + }, + "category": "Security", + "startLine": 9, + "startColumn": 3, + "endLine": 9, + "endColumn": 7, + "ruleDescription": "Hardcoded account ID in ARN", + "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'CacheSubnetGroupName' is create-only; updating it will cause resource replacement", + "message": "Property 'ProjectArn' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SixthReplicationGroup", + "logicalId": "Pool", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::DeviceFarm::DevicePool" }, - "propertyPath": "Properties.CacheSubnetGroupName", + "propertyPath": "Properties.ProjectArn", "category": "Best Practice", - "startLine": 147, + "startLine": 14, "startColumn": 7, - "endLine": 147, - "endColumn": 27, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-elasticache", + "endLine": 14, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-device-farm", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -16457,273 +15720,366 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'MyParameterGroup' of type 'AWS::ElastiCache::ParameterGroup' supports Tags but none are configured", + "message": "Resource 'Pool' of type 'AWS::DeviceFarm::DevicePool' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "MyParameterGroup", + "logicalId": "Pool", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ParameterGroup" + "resourceType": "AWS::DeviceFarm::DevicePool" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 17, + "startLine": 12, "startColumn": 5, - "endLine": 17, + "endLine": 12, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "good/resources/backup/test_backup_plan_lifecycle_rule.yml": { + "filePath": "good/resources/backup/test_backup_plan_lifecycle_rule.yml", + "status": "OK", + "metadata": { + "resourcesScanned": 3, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 0, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [] + }, + "good/resources/cloudformation/nested_stack_dynamic.yaml": { + "filePath": "good/resources/cloudformation/nested_stack_dynamic.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 1, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'MyClusterParameterGroup' of type 'AWS::ElastiCache::ParameterGroup' supports Tags but none are configured", + "message": "Resource 'NestedStack' of type 'AWS::CloudFormation::Stack' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "MyClusterParameterGroup", - "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ParameterGroup" + "logicalId": "NestedStack", + "entityType": "Resource", + "resourceType": "AWS::CloudFormation::Stack" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 8, + "startColumn": 5, + "endLine": 8, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "good/resources/cloudformation/stack_nested.yaml": { + "filePath": "good/resources/cloudformation/stack_nested.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 0, + "counts": { + "fatal": 1, + "errors": 0, + "warnings": 2, + "informational": 0, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "F0001", + "severity": "FATAL", + "message": "Resources section must exist and be non-empty", + "source": "SCHEMA", + "category": "Structure", + "startLine": 6, + "startColumn": 1, + "endLine": 6, + "endColumn": 10, + "ruleDescription": "Resources section must exist and be non-empty", + "phase": "SCHEMA" + }, + { + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'One' is not referenced anywhere in the template", + "source": "CFN_LINT", + "entity": { + "logicalId": "One", + "entityType": "Parameter" + }, + "propertyPath": "Parameters/One", + "category": "Best Practice", + "startLine": 2, + "startColumn": 3, + "endLine": 2, + "endColumn": 6, + "ruleDescription": "Check if Parameters are Used", + "phase": "LINT" + }, + { + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'Two' is not referenced anywhere in the template", + "source": "CFN_LINT", + "entity": { + "logicalId": "Two", + "entityType": "Parameter" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Parameters/Two", "category": "Best Practice", - "startLine": 25, - "startColumn": 5, - "endLine": 25, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "startLine": 4, + "startColumn": 3, + "endLine": 4, + "endColumn": 6, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" + } + ] + }, + "good/resources/cloudformation/stacks.yaml": { + "filePath": "good/resources/cloudformation/stacks.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 5, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 4, + "informational": 15, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'MyNonClusterParameterGroup' of type 'AWS::ElastiCache::ParameterGroup' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W1028", + "severity": "WARN", + "message": "['Fn::If', 1] is not reachable. When setting condition 'IsUsEast1' to True", + "source": "CFN_LINT", "entity": { - "logicalId": "MyNonClusterParameterGroup", + "logicalId": "Stack3", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ParameterGroup" + "resourceType": "AWS::CloudFormation::Stack" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.Parameters.Fn::If.2.Fn::If.1", "category": "Best Practice", - "startLine": 33, - "startColumn": 5, - "endLine": 33, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "startLine": 48, + "startColumn": 16, + "endLine": 48, + "endColumn": 17, + "ruleDescription": "Check Fn::If has a path that cannot be reached", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'MyOptionalClusterParameterGroup' of type 'AWS::ElastiCache::ParameterGroup' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W3002", + "severity": "WARN", + "message": "This code may only work with 'package' cli command", + "source": "CFN_LINT", "entity": { - "logicalId": "MyOptionalClusterParameterGroup", + "logicalId": "StackNormal", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ParameterGroup" + "resourceType": "AWS::CloudFormation::Stack" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.TemplateURL", "category": "Best Practice", - "startLine": 42, - "startColumn": 5, - "endLine": 42, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "startLine": 8, + "startColumn": 7, + "endLine": 8, + "endColumn": 18, + "ruleDescription": "Warn when properties are configured to only work with the package command", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'BasicReplicationGroup' of type 'AWS::ElastiCache::ReplicationGroup' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W3002", + "severity": "WARN", + "message": "This code may only work with 'package' cli command", + "source": "CFN_LINT", "entity": { - "logicalId": "BasicReplicationGroup", + "logicalId": "StackInvalidPath", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::CloudFormation::Stack" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.TemplateURL", "category": "Best Practice", - "startLine": 50, - "startColumn": 5, - "endLine": 50, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "startLine": 32, + "startColumn": 7, + "endLine": 32, + "endColumn": 18, + "ruleDescription": "Warn when properties are configured to only work with the package command", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'SecondReplicationGroup' of type 'AWS::ElastiCache::ReplicationGroup' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W3002", + "severity": "WARN", + "message": "This code may only work with 'package' cli command", + "source": "CFN_LINT", "entity": { - "logicalId": "SecondReplicationGroup", + "logicalId": "Stack3", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::CloudFormation::Stack" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.TemplateURL", "category": "Best Practice", - "startLine": 69, - "startColumn": 5, - "endLine": 69, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "startLine": 40, + "startColumn": 7, + "endLine": 40, + "endColumn": 18, + "ruleDescription": "Warn when properties are configured to only work with the package command", "phase": "LINT" }, { - "ruleId": "I9040", + "ruleId": "I3011", "severity": "INFO", - "message": "Resource 'ThirdReplicationGroup' of type 'AWS::ElastiCache::ReplicationGroup' supports Tags but none are configured", - "source": "ENGINE", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "ThirdReplicationGroup", + "logicalId": "StackNormal", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::CloudFormation::Stack" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 89, - "startColumn": 5, - "endLine": 89, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "startLine": 5, + "startColumn": 3, + "endLine": 5, + "endColumn": 14, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "I9040", + "ruleId": "I3011", "severity": "INFO", - "message": "Resource 'FourthReplicationGroup' of type 'AWS::ElastiCache::ReplicationGroup' supports Tags but none are configured", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "FourthReplicationGroup", + "logicalId": "StackNormal", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::CloudFormation::Stack" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 108, - "startColumn": 5, - "endLine": 108, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "startLine": 5, + "startColumn": 3, + "endLine": 5, + "endColumn": 14, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "I9040", + "ruleId": "I3011", "severity": "INFO", - "message": "Resource 'FifthReplicationGroup' of type 'AWS::ElastiCache::ReplicationGroup' supports Tags but none are configured", - "source": "ENGINE", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "FifthReplicationGroup", + "logicalId": "StackIsWebUrl", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::CloudFormation::Stack" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 125, - "startColumn": 5, - "endLine": 125, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "startLine": 13, + "startColumn": 3, + "endLine": 13, + "endColumn": 16, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "I9040", + "ruleId": "I3011", "severity": "INFO", - "message": "Resource 'SixthReplicationGroup' of type 'AWS::ElastiCache::ReplicationGroup' supports Tags but none are configured", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "SixthReplicationGroup", + "logicalId": "StackIsWebUrl", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::CloudFormation::Stack" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 142, - "startColumn": 5, - "endLine": 142, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "good/resources/iam/iam_policy_conditional_policies.yaml": { - "filePath": "good/resources/iam/iam_policy_conditional_policies.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 2, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 0, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [] - }, - "good/resources/iam/identity_policy_wildcard_partition.yaml": { - "filePath": "good/resources/iam/identity_policy_wildcard_partition.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 0, - "debug": 0 + "startLine": 13, + "startColumn": 3, + "endLine": 13, + "endColumn": 16, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [] - }, - "good/resources/iam/instance_profile.yaml": { - "filePath": "good/resources/iam/instance_profile.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 2, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 6, - "debug": 0 + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "StackUrlIsObject", + "entityType": "Resource", + "resourceType": "AWS::CloudFormation::Stack" + }, + "category": "Best Practice", + "startLine": 21, + "startColumn": 3, + "endLine": 21, + "endColumn": 19, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "StackUrlIsObject", + "entityType": "Resource", + "resourceType": "AWS::CloudFormation::Stack" + }, + "category": "Best Practice", + "startLine": 21, + "startColumn": 3, + "endLine": 21, + "endColumn": 19, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { "ruleId": "I3011", "severity": "INFO", "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "IAMInstanceProfile", + "logicalId": "StackInvalidPath", "entityType": "Resource", "resourceType": "AWS::CloudFormation::Stack" }, "category": "Best Practice", - "startLine": 3, + "startLine": 29, "startColumn": 3, - "endLine": 3, - "endColumn": 21, + "endLine": 29, + "endColumn": 19, "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, @@ -16733,15 +16089,15 @@ "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "IAMInstanceProfile", + "logicalId": "StackInvalidPath", "entityType": "Resource", "resourceType": "AWS::CloudFormation::Stack" }, "category": "Best Practice", - "startLine": 3, + "startLine": 29, "startColumn": 3, - "endLine": 3, - "endColumn": 21, + "endLine": 29, + "endColumn": 19, "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, @@ -16751,15 +16107,15 @@ "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "Instance", + "logicalId": "Stack3", "entityType": "Resource", "resourceType": "AWS::CloudFormation::Stack" }, "category": "Best Practice", - "startLine": 7, + "startLine": 37, "startColumn": 3, - "endLine": 7, - "endColumn": 11, + "endLine": 37, + "endColumn": 9, "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, @@ -16769,34 +16125,34 @@ "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "Instance", + "logicalId": "Stack3", "entityType": "Resource", "resourceType": "AWS::CloudFormation::Stack" }, "category": "Best Practice", - "startLine": 7, + "startLine": 37, "startColumn": 3, - "endLine": 7, - "endColumn": 11, + "endLine": 37, + "endColumn": 9, "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'IAMInstanceProfile' of type 'AWS::CloudFormation::Stack' supports Tags but none are configured", + "message": "Resource 'StackNormal' of type 'AWS::CloudFormation::Stack' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "IAMInstanceProfile", + "logicalId": "StackNormal", "entityType": "Resource", "resourceType": "AWS::CloudFormation::Stack" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 5, + "startLine": 7, "startColumn": 5, - "endLine": 5, + "endLine": 7, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -16804,75 +16160,93 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Instance' of type 'AWS::CloudFormation::Stack' supports Tags but none are configured", + "message": "Resource 'StackIsWebUrl' of type 'AWS::CloudFormation::Stack' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Instance", + "logicalId": "StackIsWebUrl", "entityType": "Resource", "resourceType": "AWS::CloudFormation::Stack" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 9, + "startLine": 15, "startColumn": 5, - "endLine": 9, + "endLine": 15, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" - } - ] - }, - "good/resources/iam/managed_policy_description.yaml": { - "filePath": "good/resources/iam/managed_policy_description.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 1, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Description' is create-only; updating it will cause resource replacement", + "message": "Resource 'StackUrlIsObject' of type 'AWS::CloudFormation::Stack' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "SomeManagedPolicy", + "logicalId": "StackUrlIsObject", "entityType": "Resource", - "resourceType": "AWS::IAM::ManagedPolicy" + "resourceType": "AWS::CloudFormation::Stack" }, - "propertyPath": "Properties.Description", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 7, - "startColumn": 7, - "endLine": 7, - "endColumn": 18, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 23, + "startColumn": 5, + "endLine": 23, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'StackInvalidPath' of type 'AWS::CloudFormation::Stack' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "StackInvalidPath", + "entityType": "Resource", + "resourceType": "AWS::CloudFormation::Stack" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 31, + "startColumn": 5, + "endLine": 31, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Stack3' of type 'AWS::CloudFormation::Stack' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "Stack3", + "entityType": "Resource", + "resourceType": "AWS::CloudFormation::Stack" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 39, + "startColumn": 5, + "endLine": 39, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" } ] }, - "good/resources/iam/policy.yaml": { - "filePath": "good/resources/iam/policy.yaml", + "good/resources/cloudfront/aliases.yaml": { + "filePath": "good/resources/cloudfront/aliases.yaml", "status": "OK", "metadata": { "resourcesScanned": 1, "counts": { "fatal": 0, - "errors": 1, + "errors": 0, "warnings": 0, "informational": 1, "debug": 0 @@ -16883,59 +16257,37 @@ }, "diagnostics": [ { - "ruleId": "E3510", - "severity": "ERROR", - "message": "'SomeOptionalParameter' does not match '^(arn:(aws[A-Za-z\\-]*?|[A-Za-z?*\\-]*[?*][A-Za-z?*\\-]*):[^:*?]+:[^:]*(:(?:\\d{12}|\\*|aws)?:.+|)|\\*)$'", - "source": "CFN_LINT", - "entity": { - "logicalId": "SomeManagedPolicy", - "entityType": "Resource", - "resourceType": "AWS::IAM::ManagedPolicy" - }, - "propertyPath": "Properties.PolicyDocument.Statement.1.Resource.0", - "category": "Resource", - "startLine": 29, - "startColumn": 19, - "endLine": 29, - "endColumn": 20, - "ruleDescription": "Validate identity based IAM policies", - "phase": "LINT" - }, - { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Description' is create-only; updating it will cause resource replacement", + "message": "Resource 'CloudFrontDistribution' of type 'AWS::CloudFront::Distribution' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "SomeManagedPolicy", + "logicalId": "CloudFrontDistribution", "entityType": "Resource", - "resourceType": "AWS::IAM::ManagedPolicy" + "resourceType": "AWS::CloudFront::Distribution" }, - "propertyPath": "Properties.Description", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 14, - "startColumn": 7, - "endLine": 14, - "endColumn": 18, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" } ] }, - "good/resources/iam/ref_with_path.yaml": { - "filePath": "good/resources/iam/ref_with_path.yaml", + "good/resources/dynamodb/attributes.yaml": { + "filePath": "good/resources/dynamodb/attributes.yaml", "status": "OK", "metadata": { - "resourcesScanned": 5, + "resourcesScanned": 2, "counts": { "fatal": 0, "errors": 0, "warnings": 0, - "informational": 11, + "informational": 8, "debug": 0 }, "suppressed": 0, @@ -16944,435 +16296,506 @@ }, "diagnostics": [ { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'Path' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "CodeBuildRole", + "logicalId": "DDBTable1", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.Path", "category": "Best Practice", - "startLine": 43, - "startColumn": 7, - "endLine": 43, - "endColumn": 11, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 6, + "startColumn": 3, + "endLine": 6, + "endColumn": 12, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "CodeBuildVPC", + "logicalId": "DDBTable1", "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 64, - "startColumn": 7, - "endLine": 64, - "endColumn": 16, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 6, + "startColumn": 3, + "endLine": 6, + "endColumn": 12, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "CodeBuildSubnet", + "logicalId": "DDBTable2", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 73, - "startColumn": 7, - "endLine": 73, + "startLine": 34, + "startColumn": 3, + "endLine": 34, "endColumn": 12, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'CodeBuildVPC'" - } + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "DDBTable2", + "entityType": "Resource", + "resourceType": "AWS::DynamoDB::Table" + }, + "category": "Best Practice", + "startLine": 34, + "startColumn": 3, + "endLine": 34, + "endColumn": 12, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "CodeBuildSubnet", + "logicalId": "DDBTable1", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Properties.KeySchema", "category": "Best Practice", - "startLine": 75, + "startLine": 16, "startColumn": 7, - "endLine": 75, + "endLine": 16, "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'GroupName' is create-only; updating it will cause resource replacement", + "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "CodeBuildSecurityGroup", + "logicalId": "DDBTable2", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.GroupName", + "propertyPath": "Properties.KeySchema", "category": "Best Practice", - "startLine": 79, + "startLine": 47, "startColumn": 7, - "endLine": 79, + "endLine": 47, "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", + "message": "Resource 'DDBTable1' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "CodeBuildSecurityGroup", + "logicalId": "DDBTable1", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.GroupDescription", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 80, - "startColumn": 7, - "endLine": 80, - "endColumn": 23, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 8, + "startColumn": 5, + "endLine": 8, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'DDBTable2' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "DDBTable2", + "entityType": "Resource", + "resourceType": "AWS::DynamoDB::Table" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 36, + "startColumn": 5, + "endLine": 36, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "good/resources/dynamodb/attributes_transform.yaml": { + "filePath": "good/resources/dynamodb/attributes_transform.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 3, + "counts": { + "fatal": 4, + "errors": 3, + "warnings": 0, + "informational": 12, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "F1101", + "severity": "FATAL", + "message": "Fn::Transform: Fn::Transform value must be an object", + "source": "SCHEMA", + "entity": { + "logicalId": "DDBTableTransformAttributeDefinitions", + "entityType": "Resource", + "resourceType": "AWS::DynamoDB::Table" + }, + "propertyPath": "Properties.AttributeDefinitions.Fn::Transform", + "category": "Structure", + "startLine": 11, + "startColumn": 9, + "endLine": 11, + "endColumn": 22, + "ruleDescription": "Invalid YAML/JSON syntax", + "phase": "PARSE" + }, + { + "ruleId": "F1101", + "severity": "FATAL", + "message": "Fn::Transform: Fn::Transform value must be an object", + "source": "SCHEMA", + "entity": { + "logicalId": "DDBTableTransformKeySchema", + "entityType": "Resource", + "resourceType": "AWS::DynamoDB::Table" + }, + "propertyPath": "Properties.KeySchema.Fn::Transform", + "category": "Structure", + "startLine": 25, + "startColumn": 9, + "endLine": 25, + "endColumn": 22, + "ruleDescription": "Invalid YAML/JSON syntax", + "phase": "PARSE" + }, + { + "ruleId": "F1101", + "severity": "FATAL", + "message": "Fn::Transform: Fn::Transform value must be an object", + "source": "SCHEMA", + "entity": { + "logicalId": "DDBTableTransformBoth", + "entityType": "Resource", + "resourceType": "AWS::DynamoDB::Table" + }, + "propertyPath": "Properties.AttributeDefinitions.Fn::Transform", + "category": "Structure", + "startLine": 33, + "startColumn": 9, + "endLine": 33, + "endColumn": 22, + "ruleDescription": "Invalid YAML/JSON syntax", + "phase": "PARSE" + }, + { + "ruleId": "F1101", + "severity": "FATAL", + "message": "Fn::Transform: Fn::Transform value must be an object", + "source": "SCHEMA", + "entity": { + "logicalId": "DDBTableTransformBoth", + "entityType": "Resource", + "resourceType": "AWS::DynamoDB::Table" + }, + "propertyPath": "Properties.KeySchema.Fn::Transform", + "category": "Structure", + "startLine": 38, + "startColumn": 9, + "endLine": 38, + "endColumn": 22, + "ruleDescription": "Invalid YAML/JSON syntax", + "phase": "PARSE" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E3639", + "severity": "ERROR", + "message": "ProvisionedThroughput is required when BillingMode defaults to 'PROVISIONED'", + "source": "CFN_LINT", "entity": { - "logicalId": "CodeBuildSecurityGroup", + "logicalId": "DDBTableTransformAttributeDefinitions", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.VpcId", - "category": "Best Practice", - "startLine": 81, - "startColumn": 7, - "endLine": 81, - "endColumn": 12, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'CodeBuildVPC'" - } + "propertyPath": "Properties.ProvisionedThroughput", + "suggestedFix": "Add ProvisionedThroughput or set BillingMode to 'PAY_PER_REQUEST'", + "category": "Resource", + "startLine": 9, + "startColumn": 5, + "endLine": 9, + "endColumn": 15, + "ruleDescription": "Validate DynamoDB table ProvisionedThroughput is set when BillingMode is PROVISIONED", + "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'CodeBuildProject' of type 'AWS::CodeBuild::Project' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "E3639", + "severity": "ERROR", + "message": "ProvisionedThroughput is required when BillingMode defaults to 'PROVISIONED'", + "source": "CFN_LINT", "entity": { - "logicalId": "CodeBuildProject", + "logicalId": "DDBTableTransformKeySchema", "entityType": "Resource", - "resourceType": "AWS::CodeBuild::Project" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 6, + "propertyPath": "Properties.ProvisionedThroughput", + "suggestedFix": "Add ProvisionedThroughput or set BillingMode to 'PAY_PER_REQUEST'", + "category": "Resource", + "startLine": 20, "startColumn": 5, - "endLine": 6, + "endLine": 20, "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Validate DynamoDB table ProvisionedThroughput is set when BillingMode is PROVISIONED", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'CodeBuildRole' of type 'AWS::IAM::Role' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "E3639", + "severity": "ERROR", + "message": "ProvisionedThroughput is required when BillingMode defaults to 'PROVISIONED'", + "source": "CFN_LINT", "entity": { - "logicalId": "CodeBuildRole", + "logicalId": "DDBTableTransformBoth", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 35, + "propertyPath": "Properties.ProvisionedThroughput", + "suggestedFix": "Add ProvisionedThroughput or set BillingMode to 'PAY_PER_REQUEST'", + "category": "Resource", + "startLine": 31, "startColumn": 5, - "endLine": 35, + "endLine": 31, "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Validate DynamoDB table ProvisionedThroughput is set when BillingMode is PROVISIONED", "phase": "LINT" }, { - "ruleId": "I9040", + "ruleId": "I3011", "severity": "INFO", - "message": "Resource 'CodeBuildSubnet' of type 'AWS::EC2::Subnet' supports Tags but none are configured", - "source": "ENGINE", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "CodeBuildSubnet", + "logicalId": "DDBTableTransformAttributeDefinitions", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 72, - "startColumn": 5, - "endLine": 72, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "startLine": 7, + "startColumn": 3, + "endLine": 7, + "endColumn": 40, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "I9040", + "ruleId": "I3011", "severity": "INFO", - "message": "Resource 'CodeBuildSecurityGroup' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "CodeBuildSecurityGroup", + "logicalId": "DDBTableTransformAttributeDefinitions", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 78, - "startColumn": 5, - "endLine": 78, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "startLine": 7, + "startColumn": 3, + "endLine": 7, + "endColumn": 40, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" - } - ] - }, - "good/resources/iam/resource_policy.yaml": { - "filePath": "good/resources/iam/resource_policy.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 1, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "I9040", + "ruleId": "I3011", "severity": "INFO", - "message": "Resource 'Ecr' of type 'AWS::ECR::Repository' supports Tags but none are configured", - "source": "ENGINE", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "Ecr", + "logicalId": "DDBTableTransformKeySchema", "entityType": "Resource", - "resourceType": "AWS::ECR::Repository" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 6, - "startColumn": 5, - "endLine": 6, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "startLine": 18, + "startColumn": 3, + "endLine": 18, + "endColumn": 29, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" - } - ] - }, - "good/resources/lambda/required_properties.yaml": { - "filePath": "good/resources/lambda/required_properties.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 3, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 4, - "informational": 4, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "W2531", - "severity": "WARN", - "message": "Runtime 'python3.9' was deprecated on '2025-12-15'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'python3.14'", + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "Function1", + "logicalId": "DDBTableTransformKeySchema", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 12, - "startColumn": 7, - "endLine": 12, - "endColumn": 14, - "ruleDescription": "Check if EOL Lambda Function Runtimes are used", - "phase": "SCHEMA", - "context": { - "actualValue": "python3.9", - "lifecycle": "deprecated" - } + "category": "Best Practice", + "startLine": 18, + "startColumn": 3, + "endLine": 18, + "endColumn": 29, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "W9013", - "severity": "WARN", - "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", - "source": "ENGINE", + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "Function1", + "logicalId": "DDBTableTransformBoth", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::DynamoDB::Table" }, - "category": "Security", - "startLine": 4, + "category": "Best Practice", + "startLine": 29, "startColumn": 3, - "endLine": 4, - "endColumn": 12, - "ruleDescription": "Hardcoded account ID in ARN", + "endLine": 29, + "endColumn": 24, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "W9013", - "severity": "WARN", - "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", - "source": "ENGINE", + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "Function2", + "logicalId": "DDBTableTransformBoth", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::DynamoDB::Table" }, - "category": "Security", - "startLine": 13, + "category": "Best Practice", + "startLine": 29, "startColumn": 3, - "endLine": 13, - "endColumn": 12, - "ruleDescription": "Hardcoded account ID in ARN", + "endLine": 29, + "endColumn": 24, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "W9013", - "severity": "WARN", - "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Function3", + "logicalId": "DDBTableTransformAttributeDefinitions", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::DynamoDB::Table" }, - "category": "Security", - "startLine": 23, - "startColumn": 3, - "endLine": 23, - "endColumn": 12, - "ruleDescription": "Hardcoded account ID in ARN", - "phase": "LINT" + "propertyPath": "Properties.KeySchema", + "category": "Best Practice", + "startLine": 15, + "startColumn": 7, + "endLine": 15, + "endColumn": 16, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'PackageType' is create-only; updating it will cause resource replacement", + "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Function3", + "logicalId": "DDBTableTransformKeySchema", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.PackageType", + "propertyPath": "Properties.KeySchema", "category": "Best Practice", - "startLine": 29, + "startLine": 24, "startColumn": 7, - "endLine": 29, - "endColumn": 18, + "endLine": 24, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'Function1' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Function1", + "logicalId": "DDBTableTransformBoth", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.KeySchema", "category": "Best Practice", - "startLine": 6, - "startColumn": 5, - "endLine": 6, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 37, + "startColumn": 7, + "endLine": 37, + "endColumn": 16, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Function2' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "message": "Resource 'DDBTableTransformAttributeDefinitions' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Function2", + "logicalId": "DDBTableTransformAttributeDefinitions", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::DynamoDB::Table" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 15, + "startLine": 9, "startColumn": 5, - "endLine": 15, + "endLine": 9, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -17380,120 +16803,55 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Function3' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "message": "Resource 'DDBTableTransformKeySchema' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Function3", + "logicalId": "DDBTableTransformKeySchema", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::DynamoDB::Table" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 25, + "startLine": 20, "startColumn": 5, - "endLine": 25, + "endLine": 20, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" - } - ] - }, - "good/resources/name.yaml": { - "filePath": "good/resources/name.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 0, - "informational": 2, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "E1152", - "severity": "ERROR", - "message": "'ami-123456' does not match format 'AWS::EC2::Image.Id'", - "source": "CFN_LINT", - "entity": { - "logicalId": "myInstance", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.ImageId", - "category": "Intrinsic Function", - "startLine": 6, - "startColumn": 7, - "endLine": 6, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate AMI id format", - "phase": "SCHEMA", - "context": { - "actualValue": "ami-123456" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "myInstance", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.ImageId", - "category": "Best Practice", - "startLine": 6, - "startColumn": 7, - "endLine": 6, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'myInstance' of type 'AWS::EC2::Instance' supports Tags but none are configured", + "message": "Resource 'DDBTableTransformBoth' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "myInstance", + "logicalId": "DDBTableTransformBoth", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::DynamoDB::Table" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 5, + "startLine": 31, "startColumn": 5, - "endLine": 5, + "endLine": 31, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "good/resources/primary_identifiers.yaml": { - "filePath": "good/resources/primary_identifiers.yaml", + "good/resources/dynamodb/attributes_transform_object.yaml": { + "filePath": "good/resources/dynamodb/attributes_transform_object.yaml", "status": "OK", "metadata": { - "resourcesScanned": 7, + "resourcesScanned": 3, "counts": { "fatal": 0, "errors": 0, "warnings": 0, - "informational": 17, + "informational": 12, "debug": 0 }, "suppressed": 0, @@ -17502,379 +16860,358 @@ }, "diagnostics": [ { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Path' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "RootRole", - "entityType": "Resource", - "resourceType": "AWS::IAM::Role" - }, - "propertyPath": "Properties.Path", - "category": "Best Practice", - "startLine": 17, - "startColumn": 7, - "endLine": 17, - "endColumn": 11, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'RoleName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "RootRole", + "logicalId": "DDBTableTransformAttributeDefinitions", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.RoleName", "category": "Best Practice", - "startLine": 18, - "startColumn": 7, - "endLine": 18, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 4, + "startColumn": 3, + "endLine": 4, + "endColumn": 40, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'Path' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "RootRole3", + "logicalId": "DDBTableTransformAttributeDefinitions", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.Path", "category": "Best Practice", - "startLine": 40, - "startColumn": 7, - "endLine": 40, - "endColumn": 11, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 4, + "startColumn": 3, + "endLine": 4, + "endColumn": 40, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'RoleName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "RootRole3", + "logicalId": "DDBTableTransformKeySchema", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.RoleName", "category": "Best Practice", - "startLine": 41, - "startColumn": 7, - "endLine": 41, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 16, + "startColumn": 3, + "endLine": 16, + "endColumn": 29, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'Path' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "RootRole4", + "logicalId": "DDBTableTransformKeySchema", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.Path", "category": "Best Practice", - "startLine": 63, - "startColumn": 7, - "endLine": 63, - "endColumn": 11, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 16, + "startColumn": 3, + "endLine": 16, + "endColumn": 29, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'RoleName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "RootRole4", + "logicalId": "DDBTableTransformBoth", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.RoleName", "category": "Best Practice", - "startLine": 64, - "startColumn": 7, - "endLine": 64, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 28, + "startColumn": 3, + "endLine": 28, + "endColumn": 24, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "FunctionPermission1", + "logicalId": "DDBTableTransformBoth", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.FunctionName", "category": "Best Practice", - "startLine": 91, - "startColumn": 7, - "endLine": 91, - "endColumn": 19, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 28, + "startColumn": 3, + "endLine": 28, + "endColumn": 24, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Action' is create-only; updating it will cause resource replacement", + "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FunctionPermission1", + "logicalId": "DDBTableTransformAttributeDefinitions", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.Action", + "propertyPath": "Properties.KeySchema", "category": "Best Practice", - "startLine": 92, + "startLine": 13, "startColumn": 7, - "endLine": 92, - "endColumn": 13, + "endLine": 13, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Principal' is create-only; updating it will cause resource replacement", + "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FunctionPermission1", + "logicalId": "DDBTableTransformKeySchema", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.Principal", + "propertyPath": "Properties.KeySchema", "category": "Best Practice", - "startLine": 93, + "startLine": 23, "startColumn": 7, - "endLine": 93, + "endLine": 23, "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only", + "resolutionSource": "dynamic (macro output)" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FunctionPermission2", + "logicalId": "DDBTableTransformBoth", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.FunctionName", + "propertyPath": "Properties.KeySchema", "category": "Best Practice", - "startLine": 97, + "startLine": 37, "startColumn": 7, - "endLine": 97, - "endColumn": 19, + "endLine": 37, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only", + "resolutionSource": "dynamic (macro output)" } }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Action' is create-only; updating it will cause resource replacement", + "message": "Resource 'DDBTableTransformAttributeDefinitions' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "FunctionPermission2", + "logicalId": "DDBTableTransformAttributeDefinitions", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.Action", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 98, - "startColumn": 7, - "endLine": 98, - "endColumn": 13, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 6, + "startColumn": 5, + "endLine": 6, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Principal' is create-only; updating it will cause resource replacement", + "message": "Resource 'DDBTableTransformKeySchema' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "FunctionPermission2", + "logicalId": "DDBTableTransformKeySchema", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.Principal", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 99, - "startColumn": 7, - "endLine": 99, - "endColumn": 16, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 18, + "startColumn": 5, + "endLine": 18, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'RootRole' of type 'AWS::IAM::Role' supports Tags but none are configured", + "message": "Resource 'DDBTableTransformBoth' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "RootRole", + "logicalId": "DDBTableTransformBoth", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::DynamoDB::Table" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 7, + "startLine": 30, "startColumn": 5, - "endLine": 7, + "endLine": 30, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "good/resources/dynamodb/conditional_scenarios.yaml": { + "filePath": "good/resources/dynamodb/conditional_scenarios.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 2, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 5, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "CorrelatedBilling", + "entityType": "Resource", + "resourceType": "AWS::DynamoDB::Table" + }, + "category": "Best Practice", + "startLine": 9, + "startColumn": 3, + "endLine": 9, + "endColumn": 20, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9040", + "ruleId": "I3011", "severity": "INFO", - "message": "Resource 'RootRole3' of type 'AWS::IAM::Role' supports Tags but none are configured", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "RootRole3", + "logicalId": "CorrelatedBilling", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 30, - "startColumn": 5, - "endLine": 30, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "startLine": 9, + "startColumn": 3, + "endLine": 9, + "endColumn": 20, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "I9040", + "ruleId": "I3011", "severity": "INFO", - "message": "Resource 'RootRole4' of type 'AWS::IAM::Role' supports Tags but none are configured", - "source": "ENGINE", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "RootRole4", + "logicalId": "CorrelatedIndex", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 53, - "startColumn": 5, - "endLine": 53, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "startLine": 22, + "startColumn": 3, + "endLine": 22, + "endColumn": 18, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "I9040", + "ruleId": "I3011", "severity": "INFO", - "message": "Resource 'Bucket1' of type 'AWS::S3::Bucket' supports Tags but none are configured", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "Bucket1", + "logicalId": "CorrelatedIndex", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 76, - "startColumn": 5, - "endLine": 76, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "startLine": 22, + "startColumn": 3, + "endLine": 22, + "endColumn": 18, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'Bucket2' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Bucket2", + "logicalId": "CorrelatedIndex", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.KeySchema", "category": "Best Practice", - "startLine": 81, - "startColumn": 3, - "endLine": 81, - "endColumn": 10, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 31, + "startColumn": 7, + "endLine": 31, + "endColumn": 16, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } } ] }, - "good/resources/properties/allowed_pattern.yaml": { - "filePath": "good/resources/properties/allowed_pattern.yaml", + "good/resources/ecs/fargate_conditional_properties.yaml": { + "filePath": "good/resources/ecs/fargate_conditional_properties.yaml", "status": "OK", "metadata": { "resourcesScanned": 1, @@ -17882,7 +17219,25 @@ "fatal": 0, "errors": 0, "warnings": 0, - "informational": 3, + "informational": 0, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [] + }, + "good/resources/elasticache/cache_cluster_failover.yaml": { + "filePath": "good/resources/elasticache/cache_cluster_failover.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 10, + "counts": { + "fatal": 0, + "errors": 3, + "warnings": 0, + "informational": 44, "debug": 0 }, "suppressed": 0, @@ -17891,448 +17246,426 @@ }, "diagnostics": [ { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'RoleName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E1150", + "severity": "ERROR", + "message": "'sg-test' does not match format 'AWS::EC2::SecurityGroup.Id'", + "source": "CFN_LINT", "entity": { - "logicalId": "TESTROLE", + "logicalId": "FourthReplicationGroup", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::ElastiCache::ReplicationGroup" }, - "propertyPath": "Properties.RoleName", - "category": "Best Practice", - "startLine": 8, - "startColumn": 7, - "endLine": 8, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", - "ruleDescription": "Create-only property updated triggers resource replacement", + "propertyPath": "Properties.SecurityGroupIds.0", + "category": "Intrinsic Function", + "startLine": 121, + "startColumn": 9, + "endLine": 121, + "endColumn": 10, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-elasticache", + "ruleDescription": "Validate security group format", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "actualValue": "sg-test" } }, { - "ruleId": "I9001", + "ruleId": "E1150", + "severity": "ERROR", + "message": "'sg-test' does not match format 'AWS::EC2::SecurityGroup.Id'", + "source": "CFN_LINT", + "entity": { + "logicalId": "FifthReplicationGroup", + "entityType": "Resource", + "resourceType": "AWS::ElastiCache::ReplicationGroup" + }, + "propertyPath": "Properties.SecurityGroupIds.0", + "category": "Intrinsic Function", + "startLine": 138, + "startColumn": 9, + "endLine": 138, + "endColumn": 10, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-elasticache", + "ruleDescription": "Validate security group format", + "phase": "SCHEMA", + "context": { + "actualValue": "sg-test" + } + }, + { + "ruleId": "E1150", + "severity": "ERROR", + "message": "'sg-test' does not match format 'AWS::EC2::SecurityGroup.Id'", + "source": "CFN_LINT", + "entity": { + "logicalId": "SixthReplicationGroup", + "entityType": "Resource", + "resourceType": "AWS::ElastiCache::ReplicationGroup" + }, + "propertyPath": "Properties.SecurityGroupIds.0", + "category": "Intrinsic Function", + "startLine": 155, + "startColumn": 9, + "endLine": 155, + "endColumn": 10, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-elasticache", + "ruleDescription": "Validate security group format", + "phase": "SCHEMA", + "context": { + "actualValue": "sg-test" + } + }, + { + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'Path' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "TESTROLE", + "logicalId": "BasicReplicationGroup", + "entityType": "Resource", + "resourceType": "AWS::ElastiCache::ReplicationGroup" + }, + "category": "Best Practice", + "startLine": 48, + "startColumn": 3, + "endLine": 48, + "endColumn": 24, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "BasicReplicationGroup", + "entityType": "Resource", + "resourceType": "AWS::ElastiCache::ReplicationGroup" + }, + "category": "Best Practice", + "startLine": 48, + "startColumn": 3, + "endLine": 48, + "endColumn": 24, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "SecondReplicationGroup", + "entityType": "Resource", + "resourceType": "AWS::ElastiCache::ReplicationGroup" + }, + "category": "Best Practice", + "startLine": 67, + "startColumn": 3, + "endLine": 67, + "endColumn": 25, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "SecondReplicationGroup", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::ElastiCache::ReplicationGroup" }, - "propertyPath": "Properties.Path", "category": "Best Practice", - "startLine": 9, - "startColumn": 7, - "endLine": 9, - "endColumn": 11, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 67, + "startColumn": 3, + "endLine": 67, + "endColumn": 25, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9040", + "ruleId": "I3011", "severity": "INFO", - "message": "Resource 'TESTROLE' of type 'AWS::IAM::Role' supports Tags but none are configured", - "source": "ENGINE", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "TESTROLE", + "logicalId": "ThirdReplicationGroup", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::ElastiCache::ReplicationGroup" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 7, - "startColumn": 5, - "endLine": 7, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "startLine": 87, + "startColumn": 3, + "endLine": 87, + "endColumn": 24, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" - } - ] - }, - "good/resources/properties/az_cdk.yaml": { - "filePath": "good/resources/properties/az_cdk.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 2, - "counts": { - "fatal": 1, - "errors": 1, - "warnings": 0, - "informational": 3, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "F3058", - "severity": "FATAL", - "message": "One of ['CidrBlock', 'Ipv4IpamPoolId', 'Ipv6IpamPoolId', 'Ipv6CidrBlock'] is a required property", - "source": "SCHEMA", + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "Instance", + "logicalId": "ThirdReplicationGroup", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::ElastiCache::ReplicationGroup" }, - "propertyPath": "Properties", - "category": "Schema", - "startLine": 6, - "startColumn": 5, - "endLine": 6, - "endColumn": 15, - "ruleDescription": "One of properties required (requiredOr)", - "phase": "SCHEMA" + "category": "Best Practice", + "startLine": 87, + "startColumn": 3, + "endLine": 87, + "endColumn": 24, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "E1151", - "severity": "ERROR", - "message": "'vpc-1234567' does not match format 'AWS::EC2::VPC.Id'", + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "Instance", + "logicalId": "FourthReplicationGroup", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::ElastiCache::ReplicationGroup" }, - "propertyPath": "Properties.VpcId", - "category": "Intrinsic Function", - "startLine": 7, - "startColumn": 7, - "endLine": 7, - "endColumn": 12, - "ruleDescription": "Validate VPC id format", - "phase": "SCHEMA", - "context": { - "actualValue": "vpc-1234567" - } + "category": "Best Practice", + "startLine": 106, + "startColumn": 3, + "endLine": 106, + "endColumn": 25, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "Instance", + "logicalId": "FourthReplicationGroup", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::ElastiCache::ReplicationGroup" }, - "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 7, - "startColumn": 7, - "endLine": 7, - "endColumn": 12, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 106, + "startColumn": 3, + "endLine": 106, + "endColumn": 25, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "Instance", + "logicalId": "FifthReplicationGroup", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::ElastiCache::ReplicationGroup" }, - "propertyPath": "Properties.AvailabilityZone", "category": "Best Practice", - "startLine": 8, - "startColumn": 7, - "endLine": 8, - "endColumn": 23, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 122, + "startColumn": 3, + "endLine": 122, + "endColumn": 24, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9040", + "ruleId": "I3011", "severity": "INFO", - "message": "Resource 'Instance' of type 'AWS::EC2::Subnet' supports Tags but none are configured", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "Instance", + "logicalId": "FifthReplicationGroup", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::ElastiCache::ReplicationGroup" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 6, - "startColumn": 5, - "endLine": 6, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "startLine": 122, + "startColumn": 3, + "endLine": 122, + "endColumn": 24, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" - } - ] - }, - "good/resources/properties/custom.yaml": { - "filePath": "good/resources/properties/custom.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 0, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [] - }, - "good/resources/properties/exclusive.yaml": { - "filePath": "good/resources/properties/exclusive.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 2, - "counts": { - "fatal": 1, - "errors": 0, - "warnings": 0, - "informational": 6, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "F3020", - "severity": "FATAL", - "message": "'Dimensions' should not be included with 'Metrics'", - "source": "SCHEMA", + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "Alarm", + "logicalId": "SixthReplicationGroup", "entityType": "Resource", - "resourceType": "AWS::CloudWatch::Alarm" + "resourceType": "AWS::ElastiCache::ReplicationGroup" }, - "propertyPath": "Properties.Dimensions", - "category": "Schema", - "startLine": 17, - "startColumn": 7, - "endLine": 17, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-cloudwatch.git", - "ruleDescription": "Mutually exclusive properties", - "phase": "SCHEMA", - "context": { - "property": "Dimensions" - } + "category": "Best Practice", + "startLine": 139, + "startColumn": 3, + "endLine": 139, + "endColumn": 24, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'SourceSecurityGroupId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "Ingress", + "logicalId": "SixthReplicationGroup", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" + "resourceType": "AWS::ElastiCache::ReplicationGroup" }, - "propertyPath": "Properties.SourceSecurityGroupId", "category": "Best Practice", - "startLine": 5, - "startColumn": 7, - "endLine": 5, - "endColumn": 28, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 139, + "startColumn": 3, + "endLine": 139, + "endColumn": 24, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3100", "severity": "INFO", - "message": "Property 'CidrIp' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "Previous generation instance type 'cache.r3.large' - consider upgrading", + "source": "CFN_LINT", "entity": { - "logicalId": "Ingress", + "logicalId": "BasicReplicationGroup", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" + "resourceType": "AWS::ElastiCache::ReplicationGroup" }, - "propertyPath": "Properties.CidrIp", + "propertyPath": "Properties.CacheNodeType", + "suggestedFix": "Upgrade to a current generation instance type", "category": "Best Practice", - "startLine": 6, + "startLine": 54, "startColumn": 7, - "endLine": 6, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "endLine": 54, + "endColumn": 20, + "ruleDescription": "Checks for legacy instance type generations", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3100", "severity": "INFO", - "message": "Property 'IpProtocol' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "Previous generation instance type 'cache.r3.large' - consider upgrading", + "source": "CFN_LINT", "entity": { - "logicalId": "Ingress", + "logicalId": "SecondReplicationGroup", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" + "resourceType": "AWS::ElastiCache::ReplicationGroup" }, - "propertyPath": "Properties.IpProtocol", + "propertyPath": "Properties.CacheNodeType", + "suggestedFix": "Upgrade to a current generation instance type", "category": "Best Practice", - "startLine": 7, + "startLine": 73, "startColumn": 7, - "endLine": 7, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "endLine": 73, + "endColumn": 20, + "ruleDescription": "Checks for legacy instance type generations", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3100", "severity": "INFO", - "message": "Property 'GroupId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "Previous generation instance type 'cache.r3.large' - consider upgrading", + "source": "CFN_LINT", "entity": { - "logicalId": "Ingress", + "logicalId": "ThirdReplicationGroup", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" + "resourceType": "AWS::ElastiCache::ReplicationGroup" }, - "propertyPath": "Properties.GroupId", + "propertyPath": "Properties.CacheNodeType", + "suggestedFix": "Upgrade to a current generation instance type", "category": "Best Practice", - "startLine": 8, + "startLine": 92, "startColumn": 7, - "endLine": 8, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "endLine": 92, + "endColumn": 20, + "ruleDescription": "Checks for legacy instance type generations", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3100", "severity": "INFO", - "message": "Property 'AlarmName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "Previous generation instance type 'cache.r3.large' - consider upgrading", + "source": "CFN_LINT", "entity": { - "logicalId": "Alarm", + "logicalId": "FourthReplicationGroup", "entityType": "Resource", - "resourceType": "AWS::CloudWatch::Alarm" + "resourceType": "AWS::ElastiCache::ReplicationGroup" }, - "propertyPath": "Properties.AlarmName", + "propertyPath": "Properties.CacheNodeType", + "suggestedFix": "Upgrade to a current generation instance type", "category": "Best Practice", - "startLine": 12, + "startLine": 111, "startColumn": 7, - "endLine": 12, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-cloudwatch.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "endLine": 111, + "endColumn": 20, + "ruleDescription": "Checks for legacy instance type generations", + "phase": "LINT" }, { - "ruleId": "I9040", + "ruleId": "I3100", "severity": "INFO", - "message": "Resource 'Alarm' of type 'AWS::CloudWatch::Alarm' supports Tags but none are configured", - "source": "ENGINE", + "message": "Previous generation instance type 'cache.r3.large' - consider upgrading", + "source": "CFN_LINT", "entity": { - "logicalId": "Alarm", + "logicalId": "FifthReplicationGroup", "entityType": "Resource", - "resourceType": "AWS::CloudWatch::Alarm" + "resourceType": "AWS::ElastiCache::ReplicationGroup" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.CacheNodeType", + "suggestedFix": "Upgrade to a current generation instance type", "category": "Best Practice", - "startLine": 11, - "startColumn": 5, - "endLine": 11, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "startLine": 128, + "startColumn": 7, + "endLine": 128, + "endColumn": 20, + "ruleDescription": "Checks for legacy instance type generations", "phase": "LINT" - } - ] - }, - "good/resources/properties/hard_coded_arn_properties.yaml": { - "filePath": "good/resources/properties/hard_coded_arn_properties.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 4, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 3, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "I9001", + "ruleId": "I3100", "severity": "INFO", - "message": "Property 'RestApiId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "Previous generation instance type 'cache.r3.large' - consider upgrading", + "source": "CFN_LINT", "entity": { - "logicalId": "Authorizer", + "logicalId": "SixthReplicationGroup", "entityType": "Resource", - "resourceType": "AWS::ApiGateway::Authorizer" + "resourceType": "AWS::ElastiCache::ReplicationGroup" }, - "propertyPath": "Properties.RestApiId", + "propertyPath": "Properties.CacheNodeType", + "suggestedFix": "Upgrade to a current generation instance type", "category": "Best Practice", - "startLine": 6, + "startLine": 145, "startColumn": 7, - "endLine": 6, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "endLine": 145, + "endColumn": 20, + "ruleDescription": "Checks for legacy instance type generations", + "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Bucket' is create-only; updating it will cause resource replacement", + "message": "Property 'CacheParameterGroupFamily' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Bucket", + "logicalId": "MyParameterGroup", "entityType": "Resource", - "resourceType": "AWS::S3::BucketPolicy" + "resourceType": "AWS::ElastiCache::ParameterGroup" }, - "propertyPath": "Properties.Bucket", + "propertyPath": "Properties.CacheParameterGroupFamily", "category": "Best Practice", - "startLine": 20, + "startLine": 19, "startColumn": 7, - "endLine": 20, - "endColumn": 13, + "endLine": 19, + "endColumn": 32, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -18340,164 +17673,157 @@ } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'Stack' of type 'AWS::CloudFormation::Stack' supports Tags but none are configured", + "message": "Property 'CacheParameterGroupFamily' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Stack", + "logicalId": "MyClusterParameterGroup", "entityType": "Resource", - "resourceType": "AWS::CloudFormation::Stack" + "resourceType": "AWS::ElastiCache::ParameterGroup" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.CacheParameterGroupFamily", "category": "Best Practice", - "startLine": 13, - "startColumn": 5, - "endLine": 13, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "good/resources/properties/hard_coded_arn_properties_cdk.yaml": { - "filePath": "good/resources/properties/hard_coded_arn_properties_cdk.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 7, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 2, - "informational": 6, - "debug": 0 + "startLine": 27, + "startColumn": 7, + "endLine": 27, + "endColumn": 32, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'CacheParameterGroupFamily' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "S3BadBucket", + "logicalId": "MyNonClusterParameterGroup", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::ElastiCache::ParameterGroup" }, - "propertyPath": "Properties.NotificationConfiguration.TopicConfigurations.0.Topic.Fn::Sub", + "propertyPath": "Properties.CacheParameterGroupFamily", "category": "Best Practice", - "startLine": 12, - "startColumn": 11, - "endLine": 12, - "endColumn": 18, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" + "startLine": 35, + "startColumn": 7, + "endLine": 35, + "endColumn": 32, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W3045", - "severity": "WARN", - "message": "AccessControl property is deprecated. Use bucket policies instead", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'CacheParameterGroupFamily' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "S3BadBucket", + "logicalId": "MyOptionalClusterParameterGroup", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::ElastiCache::ParameterGroup" }, - "propertyPath": "Properties.AccessControl", - "suggestedFix": "Remove AccessControl and use an AWS::S3::BucketPolicy resource", - "category": "Deprecation", - "startLine": 9, + "propertyPath": "Properties.CacheParameterGroupFamily", + "category": "Best Practice", + "startLine": 44, "startColumn": 7, - "endLine": 9, - "endColumn": 20, - "ruleDescription": "Controlling access to an S3 bucket should be done with bucket policies", - "phase": "LINT", + "endLine": 44, + "endColumn": 32, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", "context": { - "actualValue": "Private" + "lifecycle": "create-only" } }, { - "ruleId": "I3042", + "ruleId": "I9001", "severity": "INFO", - "message": "ARN in Resource S3BadBucket contains hardcoded Partition in ARN or incorrectly placed Pseudo Parameters", - "source": "CFN_LINT", + "message": "Property 'CacheSubnetGroupName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "S3BadBucket", + "logicalId": "BasicReplicationGroup", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::ElastiCache::ReplicationGroup" }, - "propertyPath": "Properties.NotificationConfiguration.TopicConfigurations.0.Topic.Fn::Sub", + "propertyPath": "Properties.CacheSubnetGroupName", "category": "Best Practice", - "startLine": 12, - "startColumn": 11, - "endLine": 12, - "endColumn": 18, - "ruleDescription": "ARNs should use correctly placed Pseudo Parameters", - "phase": "LINT" + "startLine": 55, + "startColumn": 7, + "endLine": 55, + "endColumn": 27, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-elasticache", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3042", + "ruleId": "I9001", "severity": "INFO", - "message": "ARN in Resource SampleBadBucketPolicy contains hardcoded Partition in ARN or incorrectly placed Pseudo Parameters", - "source": "CFN_LINT", + "message": "Property 'Port' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "SampleBadBucketPolicy", + "logicalId": "BasicReplicationGroup", "entityType": "Resource", - "resourceType": "AWS::S3::BucketPolicy" + "resourceType": "AWS::ElastiCache::ReplicationGroup" }, - "propertyPath": "Properties.PolicyDocument.Statement.0.Resource.Fn::Sub", + "propertyPath": "Properties.Port", "category": "Best Practice", - "startLine": 24, - "startColumn": 13, - "endLine": 24, - "endColumn": 20, - "ruleDescription": "ARNs should use correctly placed Pseudo Parameters", - "phase": "LINT" + "startLine": 60, + "startColumn": 7, + "endLine": 60, + "endColumn": 11, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-elasticache", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Bucket' is create-only; updating it will cause resource replacement", + "message": "Property 'CacheSubnetGroupName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SampleBadBucketPolicy", + "logicalId": "SecondReplicationGroup", "entityType": "Resource", - "resourceType": "AWS::S3::BucketPolicy" + "resourceType": "AWS::ElastiCache::ReplicationGroup" }, - "propertyPath": "Properties.Bucket", + "propertyPath": "Properties.CacheSubnetGroupName", "category": "Best Practice", - "startLine": 18, + "startLine": 74, "startColumn": 7, - "endLine": 18, - "endColumn": 13, + "endLine": 74, + "endColumn": 27, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-elasticache", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'S3BadBucket'" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Path' is create-only; updating it will cause resource replacement", + "message": "Property 'Port' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SampleRole", + "logicalId": "SecondReplicationGroup", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::ElastiCache::ReplicationGroup" }, - "propertyPath": "Properties.Path", + "propertyPath": "Properties.Port", "category": "Best Practice", - "startLine": 39, + "startLine": 80, "startColumn": 7, - "endLine": 39, + "endLine": 80, "endColumn": 11, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-elasticache", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -18505,127 +17831,114 @@ } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'S3BadBucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Property 'CacheSubnetGroupName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "S3BadBucket", + "logicalId": "ThirdReplicationGroup", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::ElastiCache::ReplicationGroup" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.CacheSubnetGroupName", "category": "Best Practice", - "startLine": 8, - "startColumn": 5, - "endLine": 8, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 93, + "startColumn": 7, + "endLine": 93, + "endColumn": 27, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-elasticache", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'SampleRole' of type 'AWS::IAM::Role' supports Tags but none are configured", + "message": "Property 'Port' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SampleRole", + "logicalId": "ThirdReplicationGroup", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::ElastiCache::ReplicationGroup" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.Port", "category": "Best Practice", - "startLine": 29, - "startColumn": 5, - "endLine": 29, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "good/resources/properties/hard_coded_arn_properties_sam.yaml": { - "filePath": "good/resources/properties/hard_coded_arn_properties_sam.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 7, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 1, - "informational": 6, - "debug": 0 + "startLine": 99, + "startColumn": 7, + "endLine": 99, + "endColumn": 11, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-elasticache", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "W3045", - "severity": "WARN", - "message": "AccessControl property is deprecated. Use bucket policies instead", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'AtRestEncryptionEnabled' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "S3BadBucket", + "logicalId": "FourthReplicationGroup", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::ElastiCache::ReplicationGroup" }, - "propertyPath": "Properties.AccessControl", - "suggestedFix": "Remove AccessControl and use an AWS::S3::BucketPolicy resource", - "category": "Deprecation", - "startLine": 11, + "propertyPath": "Properties.AtRestEncryptionEnabled", + "category": "Best Practice", + "startLine": 109, "startColumn": 7, - "endLine": 11, - "endColumn": 20, - "ruleDescription": "Controlling access to an S3 bucket should be done with bucket policies", - "phase": "LINT", + "endLine": 109, + "endColumn": 30, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-elasticache", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", "context": { - "actualValue": "Private" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Bucket' is create-only; updating it will cause resource replacement", + "message": "Property 'CacheSubnetGroupName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SampleBadBucketPolicy", + "logicalId": "FourthReplicationGroup", "entityType": "Resource", - "resourceType": "AWS::S3::BucketPolicy" + "resourceType": "AWS::ElastiCache::ReplicationGroup" }, - "propertyPath": "Properties.Bucket", + "propertyPath": "Properties.CacheSubnetGroupName", "category": "Best Practice", - "startLine": 20, + "startLine": 113, "startColumn": 7, - "endLine": 20, - "endColumn": 13, + "endLine": 113, + "endColumn": 27, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-elasticache", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'S3BadBucket'" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Path' is create-only; updating it will cause resource replacement", + "message": "Property 'AtRestEncryptionEnabled' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SampleRole", + "logicalId": "FifthReplicationGroup", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::ElastiCache::ReplicationGroup" }, - "propertyPath": "Properties.Path", + "propertyPath": "Properties.AtRestEncryptionEnabled", "category": "Best Practice", - "startLine": 41, + "startLine": 126, "startColumn": 7, - "endLine": 41, - "endColumn": 11, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "endLine": 126, + "endColumn": 30, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-elasticache", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -18635,20 +17948,20 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'PipelineName' is create-only; updating it will cause resource replacement", + "message": "Property 'CacheSubnetGroupName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "IngestionPipeline", + "logicalId": "FifthReplicationGroup", "entityType": "Resource", - "resourceType": "AWS::OSIS::Pipeline" + "resourceType": "AWS::ElastiCache::ReplicationGroup" }, - "propertyPath": "Properties.PipelineName", + "propertyPath": "Properties.CacheSubnetGroupName", "category": "Best Practice", - "startLine": 89, + "startLine": 130, "startColumn": 7, - "endLine": 89, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-osis.git", + "endLine": 130, + "endColumn": 27, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-elasticache", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -18656,160 +17969,87 @@ } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'S3BadBucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Property 'AtRestEncryptionEnabled' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "S3BadBucket", + "logicalId": "SixthReplicationGroup", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::ElastiCache::ReplicationGroup" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.AtRestEncryptionEnabled", "category": "Best Practice", - "startLine": 10, - "startColumn": 5, - "endLine": 10, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 143, + "startColumn": 7, + "endLine": 143, + "endColumn": 30, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-elasticache", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'SampleRole' of type 'AWS::IAM::Role' supports Tags but none are configured", + "message": "Property 'CacheSubnetGroupName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SampleRole", + "logicalId": "SixthReplicationGroup", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::ElastiCache::ReplicationGroup" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.CacheSubnetGroupName", "category": "Best Practice", - "startLine": 31, - "startColumn": 5, - "endLine": 31, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 147, + "startColumn": 7, + "endLine": 147, + "endColumn": 27, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-elasticache", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'IngestionPipeline' of type 'AWS::OSIS::Pipeline' supports Tags but none are configured", + "message": "Resource 'MyParameterGroup' of type 'AWS::ElastiCache::ParameterGroup' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "IngestionPipeline", + "logicalId": "MyParameterGroup", "entityType": "Resource", - "resourceType": "AWS::OSIS::Pipeline" + "resourceType": "AWS::ElastiCache::ParameterGroup" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 88, + "startLine": 17, "startColumn": 5, - "endLine": 88, + "endLine": 17, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" - } - ] - }, - "good/resources/properties/list_duplicates.yaml": { - "filePath": "good/resources/properties/list_duplicates.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 3, - "counts": { - "fatal": 0, - "errors": 3, - "warnings": 0, - "informational": 3, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "E3530", - "severity": "ERROR", - "message": "'Statement' is a required property", - "source": "CFN_LINT", - "entity": { - "logicalId": "IamRole", - "entityType": "Resource", - "resourceType": "AWS::IAM::Role" - }, - "propertyPath": "Properties.AssumeRolePolicyDocument", - "suggestedFix": "Add a Statement array to the AssumeRolePolicyDocument", - "category": "Resource", - "startLine": 16, - "startColumn": 7, - "endLine": 16, - "endColumn": 31, - "ruleDescription": "Validate IAM trust policies", - "phase": "LINT" - }, - { - "ruleId": "E3530", - "severity": "ERROR", - "message": "'Statement' is a required property", - "source": "CFN_LINT", - "entity": { - "logicalId": "IamRoleWithConditions", - "entityType": "Resource", - "resourceType": "AWS::IAM::Role" - }, - "propertyPath": "Properties.AssumeRolePolicyDocument", - "suggestedFix": "Add a Statement array to the AssumeRolePolicyDocument", - "category": "Resource", - "startLine": 25, - "startColumn": 7, - "endLine": 25, - "endColumn": 31, - "ruleDescription": "Validate IAM trust policies", - "phase": "LINT" - }, - { - "ruleId": "E3530", - "severity": "ERROR", - "message": "'Statement' is a required property", - "source": "CFN_LINT", - "entity": { - "logicalId": "IamRoleWithNestedConditions", - "entityType": "Resource", - "resourceType": "AWS::IAM::Role" - }, - "propertyPath": "Properties.AssumeRolePolicyDocument", - "suggestedFix": "Add a Statement array to the AssumeRolePolicyDocument", - "category": "Resource", - "startLine": 37, - "startColumn": 7, - "endLine": 37, - "endColumn": 31, - "ruleDescription": "Validate IAM trust policies", - "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'IamRole' of type 'AWS::IAM::Role' supports Tags but none are configured", + "message": "Resource 'MyClusterParameterGroup' of type 'AWS::ElastiCache::ParameterGroup' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "IamRole", + "logicalId": "MyClusterParameterGroup", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::ElastiCache::ParameterGroup" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 15, + "startLine": 25, "startColumn": 5, - "endLine": 15, + "endLine": 25, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -18817,19 +18057,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'IamRoleWithConditions' of type 'AWS::IAM::Role' supports Tags but none are configured", + "message": "Resource 'MyNonClusterParameterGroup' of type 'AWS::ElastiCache::ParameterGroup' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "IamRoleWithConditions", + "logicalId": "MyNonClusterParameterGroup", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::ElastiCache::ParameterGroup" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 24, + "startLine": 33, "startColumn": 5, - "endLine": 24, + "endLine": 33, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -18837,209 +18077,213 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'IamRoleWithNestedConditions' of type 'AWS::IAM::Role' supports Tags but none are configured", + "message": "Resource 'MyOptionalClusterParameterGroup' of type 'AWS::ElastiCache::ParameterGroup' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "IamRoleWithNestedConditions", + "logicalId": "MyOptionalClusterParameterGroup", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::ElastiCache::ParameterGroup" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 36, + "startLine": 42, "startColumn": 5, - "endLine": 36, + "endLine": 42, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" - } - ] - }, - "good/resources/properties/password.yaml": { - "filePath": "good/resources/properties/password.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 4, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 8, - "informational": 21, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "W1011", - "severity": "WARN", - "message": "Use dynamic references (e.g., SSM SecureString) instead of parameter 'MyPassword' for secrets", - "source": "CFN_LINT", - "entity": { - "logicalId": "MyDB", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" - }, - "propertyPath": "Properties.MasterUserPassword", - "category": "Security", - "startLine": 22, - "startColumn": 7, - "endLine": 22, - "endColumn": 25, - "ruleDescription": "Instead of REFing a parameter for a secret use a dynamic reference", - "phase": "LINT" - }, - { - "ruleId": "W1020", - "severity": "WARN", - "message": "Fn::Sub isn't needed because there are no variables", - "source": "CFN_LINT", - "entity": { - "logicalId": "MyIAMUser", - "entityType": "Resource", - "resourceType": "AWS::IAM::User" - }, - "propertyPath": "Properties.LoginProfile.Password.Fn::Sub", - "category": "Best Practice", - "startLine": 47, - "startColumn": 9, - "endLine": 47, - "endColumn": 16, - "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", - "phase": "LINT" }, { - "ruleId": "W3011", - "severity": "WARN", - "message": "Both 'UpdateReplacePolicy' and 'DeletionPolicy' are needed to protect resource from deletion", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'BasicReplicationGroup' of type 'AWS::ElastiCache::ReplicationGroup' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "MyDB", + "logicalId": "BasicReplicationGroup", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::ElastiCache::ReplicationGroup" }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 15, - "startColumn": 3, - "endLine": 15, - "endColumn": 7, - "ruleDescription": "Check resources with UpdateReplacePolicy/DeletionPolicy have both", + "startLine": 50, + "startColumn": 5, + "endLine": 50, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "W3011", - "severity": "WARN", - "message": "Both 'UpdateReplacePolicy' and 'DeletionPolicy' are needed to protect resource from deletion", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'SecondReplicationGroup' of type 'AWS::ElastiCache::ReplicationGroup' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "myNewDb", + "logicalId": "SecondReplicationGroup", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::ElastiCache::ReplicationGroup" }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 24, - "startColumn": 3, - "endLine": 24, - "endColumn": 10, - "ruleDescription": "Check resources with UpdateReplacePolicy/DeletionPolicy have both", + "startLine": 69, + "startColumn": 5, + "endLine": 69, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "W3011", - "severity": "WARN", - "message": "Both 'UpdateReplacePolicy' and 'DeletionPolicy' are needed to protect resource from deletion", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'ThirdReplicationGroup' of type 'AWS::ElastiCache::ReplicationGroup' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "myThirdDb", + "logicalId": "ThirdReplicationGroup", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::ElastiCache::ReplicationGroup" }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 33, - "startColumn": 3, - "endLine": 33, - "endColumn": 12, - "ruleDescription": "Check resources with UpdateReplacePolicy/DeletionPolicy have both", + "startLine": 89, + "startColumn": 5, + "endLine": 89, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "W9008", - "severity": "WARN", - "message": "RDS instance should have StorageEncrypted set to true", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'FourthReplicationGroup' of type 'AWS::ElastiCache::ReplicationGroup' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "MyDB", + "logicalId": "FourthReplicationGroup", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::ElastiCache::ReplicationGroup" }, - "propertyPath": "Properties.StorageEncrypted", - "suggestedFix": "Set StorageEncrypted to true", - "category": "Security", - "startLine": 17, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 108, "startColumn": 5, - "endLine": 17, + "endLine": 108, "endColumn": 15, - "ruleDescription": "RDS instance should have StorageEncrypted", + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "W9008", - "severity": "WARN", - "message": "RDS instance should have StorageEncrypted set to true", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'FifthReplicationGroup' of type 'AWS::ElastiCache::ReplicationGroup' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "myNewDb", + "logicalId": "FifthReplicationGroup", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::ElastiCache::ReplicationGroup" }, - "propertyPath": "Properties.StorageEncrypted", - "suggestedFix": "Set StorageEncrypted to true", - "category": "Security", - "startLine": 26, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 125, "startColumn": 5, - "endLine": 26, + "endLine": 125, "endColumn": 15, - "ruleDescription": "RDS instance should have StorageEncrypted", + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "W9008", - "severity": "WARN", - "message": "RDS instance should have StorageEncrypted set to true", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'SixthReplicationGroup' of type 'AWS::ElastiCache::ReplicationGroup' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "myThirdDb", + "logicalId": "SixthReplicationGroup", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::ElastiCache::ReplicationGroup" }, - "propertyPath": "Properties.StorageEncrypted", - "suggestedFix": "Set StorageEncrypted to true", - "category": "Security", - "startLine": 35, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 142, "startColumn": 5, - "endLine": 35, + "endLine": 142, "endColumn": 15, - "ruleDescription": "RDS instance should have StorageEncrypted", + "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "good/resources/iam/iam_policy_conditional_policies.yaml": { + "filePath": "good/resources/iam/iam_policy_conditional_policies.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 2, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 0, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [] + }, + "good/resources/iam/identity_policy_wildcard_partition.yaml": { + "filePath": "good/resources/iam/identity_policy_wildcard_partition.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 0, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [] + }, + "good/resources/iam/instance_profile.yaml": { + "filePath": "good/resources/iam/instance_profile.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 2, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 6, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { "ruleId": "I3011", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "MyDB", + "logicalId": "IAMInstanceProfile", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::CloudFormation::Stack" }, "category": "Best Practice", - "startLine": 15, + "startLine": 3, "startColumn": 3, - "endLine": 15, - "endColumn": 7, + "endLine": 3, + "endColumn": 21, "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, @@ -19049,193 +18293,255 @@ "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "myNewDb", + "logicalId": "IAMInstanceProfile", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::CloudFormation::Stack" }, "category": "Best Practice", - "startLine": 24, + "startLine": 3, "startColumn": 3, - "endLine": 24, - "endColumn": 10, + "endLine": 3, + "endColumn": 21, "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { "ruleId": "I3011", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "myThirdDb", + "logicalId": "Instance", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::CloudFormation::Stack" }, "category": "Best Practice", - "startLine": 33, + "startLine": 7, "startColumn": 3, - "endLine": 33, - "endColumn": 12, + "endLine": 7, + "endColumn": 11, "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "I3013", + "ruleId": "I3011", "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "MyDB", + "logicalId": "Instance", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::CloudFormation::Stack" }, - "propertyPath": "Properties", "category": "Best Practice", - "startLine": 17, - "startColumn": 5, - "endLine": 17, - "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "startLine": 7, + "startColumn": 3, + "endLine": 7, + "endColumn": 11, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "I3013", + "ruleId": "I9040", "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", + "message": "Resource 'IAMInstanceProfile' of type 'AWS::CloudFormation::Stack' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "myNewDb", + "logicalId": "IAMInstanceProfile", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::CloudFormation::Stack" }, - "propertyPath": "Properties", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 26, + "startLine": 5, "startColumn": 5, - "endLine": 26, + "endLine": 5, "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "I3013", + "ruleId": "I9040", "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", + "message": "Resource 'Instance' of type 'AWS::CloudFormation::Stack' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "myThirdDb", + "logicalId": "Instance", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::CloudFormation::Stack" }, - "propertyPath": "Properties", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 35, + "startLine": 9, "startColumn": 5, - "endLine": 35, + "endLine": 9, "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "good/resources/iam/managed_policy_description.yaml": { + "filePath": "good/resources/iam/managed_policy_description.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 1, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I3100", + "ruleId": "I9001", "severity": "INFO", - "message": "Previous generation instance type 'db.m1.small' - consider upgrading", - "source": "CFN_LINT", + "message": "Property 'Description' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "MyDB", + "logicalId": "SomeManagedPolicy", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::IAM::ManagedPolicy" }, - "propertyPath": "Properties.DBInstanceClass", - "suggestedFix": "Upgrade to a current generation instance type", + "propertyPath": "Properties.Description", "category": "Best Practice", - "startLine": 19, + "startLine": 7, "startColumn": 7, - "endLine": 19, - "endColumn": 22, - "ruleDescription": "Checks for legacy instance type generations", - "phase": "LINT" + "endLine": 7, + "endColumn": 18, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + } + ] + }, + "good/resources/iam/policy.yaml": { + "filePath": "good/resources/iam/policy.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 1, + "warnings": 0, + "informational": 1, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I3100", - "severity": "INFO", - "message": "Previous generation instance type 'db.m1.small' - consider upgrading", + "ruleId": "E3510", + "severity": "ERROR", + "message": "'SomeOptionalParameter' does not match '^(arn:(aws[A-Za-z\\-]*?|[A-Za-z?*\\-]*[?*][A-Za-z?*\\-]*):[^:*?]+:[^:]*(:(?:\\d{12}|\\*|aws)?:.+|)|\\*)$'", "source": "CFN_LINT", "entity": { - "logicalId": "myNewDb", + "logicalId": "SomeManagedPolicy", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::IAM::ManagedPolicy" }, - "propertyPath": "Properties.DBInstanceClass", - "suggestedFix": "Upgrade to a current generation instance type", - "category": "Best Practice", - "startLine": 28, - "startColumn": 7, - "endLine": 28, - "endColumn": 22, - "ruleDescription": "Checks for legacy instance type generations", + "propertyPath": "Properties.PolicyDocument.Statement.1.Resource.0", + "category": "Resource", + "startLine": 29, + "startColumn": 19, + "endLine": 29, + "endColumn": 20, + "ruleDescription": "Validate identity based IAM policies", "phase": "LINT" }, { - "ruleId": "I3100", + "ruleId": "I9001", "severity": "INFO", - "message": "Previous generation instance type 'db.m1.small' - consider upgrading", - "source": "CFN_LINT", + "message": "Property 'Description' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "myThirdDb", + "logicalId": "SomeManagedPolicy", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::IAM::ManagedPolicy" }, - "propertyPath": "Properties.DBInstanceClass", - "suggestedFix": "Upgrade to a current generation instance type", + "propertyPath": "Properties.Description", "category": "Best Practice", - "startLine": 37, + "startLine": 14, "startColumn": 7, - "endLine": 37, - "endColumn": 22, - "ruleDescription": "Checks for legacy instance type generations", - "phase": "LINT" + "endLine": 14, + "endColumn": 18, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + } + ] + }, + "good/resources/iam/ref_with_path.yaml": { + "filePath": "good/resources/iam/ref_with_path.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 5, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 11, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'Path' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MyDB", + "logicalId": "CodeBuildRole", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.Path", "category": "Best Practice", - "startLine": 20, + "startLine": 43, "startColumn": 7, - "endLine": 20, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "endLine": 43, + "endColumn": 11, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'MasterUsername' is create-only; updating it will cause resource replacement", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MyDB", + "logicalId": "CodeBuildVPC", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::VPC" }, - "propertyPath": "Properties.MasterUsername", + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 21, + "startLine": 64, "startColumn": 7, - "endLine": 21, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "endLine": 64, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -19245,43 +18551,42 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "myNewDb", + "logicalId": "CodeBuildSubnet", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 29, + "startLine": 73, "startColumn": 7, - "endLine": 29, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "endLine": 73, + "endColumn": 12, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'CodeBuildVPC'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'MasterUsername' is create-only; updating it will cause resource replacement", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "myNewDb", + "logicalId": "CodeBuildSubnet", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.MasterUsername", + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 30, + "startLine": 75, "startColumn": 7, - "endLine": 30, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "endLine": 75, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -19291,43 +18596,41 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'GroupName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "myThirdDb", + "logicalId": "CodeBuildSecurityGroup", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.GroupName", "category": "Best Practice", - "startLine": 38, + "startLine": 79, "startColumn": 7, - "endLine": 38, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "endLine": 79, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'MasterUsername' is create-only; updating it will cause resource replacement", + "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "myThirdDb", + "logicalId": "CodeBuildSecurityGroup", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.MasterUsername", + "propertyPath": "Properties.GroupDescription", "category": "Best Practice", - "startLine": 39, + "startLine": 80, "startColumn": 7, - "endLine": 39, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "endLine": 80, + "endColumn": 23, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -19337,52 +18640,42 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'UserName' is create-only; updating it will cause resource replacement", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MyIAMUser", + "logicalId": "CodeBuildSecurityGroup", "entityType": "Resource", - "resourceType": "AWS::IAM::User" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.UserName", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 45, + "startLine": 81, "startColumn": 7, - "endLine": 45, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "endLine": 81, + "endColumn": 12, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "parameter 'Environment' (type String)" + "resolutionSource": "Ref to 'CodeBuildVPC'" } }, - { - "ruleId": "I9003", - "severity": "INFO", - "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", - "source": "ENGINE", - "category": "Best Practice", - "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", - "phase": "LINT" - }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'MyDB' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "message": "Resource 'CodeBuildProject' of type 'AWS::CodeBuild::Project' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "MyDB", + "logicalId": "CodeBuildProject", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::CodeBuild::Project" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 17, + "startLine": 6, "startColumn": 5, - "endLine": 17, + "endLine": 6, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -19390,19 +18683,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'myNewDb' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "message": "Resource 'CodeBuildRole' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "myNewDb", + "logicalId": "CodeBuildRole", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::IAM::Role" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 26, + "startLine": 35, "startColumn": 5, - "endLine": 26, + "endLine": 35, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -19410,19 +18703,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'myThirdDb' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "message": "Resource 'CodeBuildSubnet' of type 'AWS::EC2::Subnet' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "myThirdDb", + "logicalId": "CodeBuildSubnet", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Subnet" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 35, + "startLine": 72, "startColumn": 5, - "endLine": 35, + "endLine": 72, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -19430,27 +18723,27 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'MyIAMUser' of type 'AWS::IAM::User' supports Tags but none are configured", + "message": "Resource 'CodeBuildSecurityGroup' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "MyIAMUser", + "logicalId": "CodeBuildSecurityGroup", "entityType": "Resource", - "resourceType": "AWS::IAM::User" + "resourceType": "AWS::EC2::SecurityGroup" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 44, + "startLine": 78, "startColumn": 5, - "endLine": 44, + "endLine": 78, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "good/resources/properties/string_size.yaml": { - "filePath": "good/resources/properties/string_size.yaml", + "good/resources/iam/resource_policy.yaml": { + "filePath": "good/resources/iam/resource_policy.yaml", "status": "OK", "metadata": { "resourcesScanned": 1, @@ -19469,12 +18762,12 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'myRepository' of type 'AWS::CodeCommit::Repository' supports Tags but none are configured", + "message": "Resource 'Ecr' of type 'AWS::ECR::Repository' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "myRepository", + "logicalId": "Ecr", "entityType": "Resource", - "resourceType": "AWS::CodeCommit::Repository" + "resourceType": "AWS::ECR::Repository" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", @@ -19488,16 +18781,16 @@ } ] }, - "good/resources/properties/templated_code.yaml": { - "filePath": "good/resources/properties/templated_code.yaml", + "good/resources/lambda/required_properties.yaml": { + "filePath": "good/resources/lambda/required_properties.yaml", "status": "OK", "metadata": { - "resourcesScanned": 2, + "resourcesScanned": 3, "counts": { "fatal": 0, "errors": 0, - "warnings": 0, - "informational": 2, + "warnings": 4, + "informational": 4, "debug": 0 }, "suppressed": 0, @@ -19505,61 +18798,177 @@ "severityLevel": "DEBUG" }, "diagnostics": [ + { + "ruleId": "W2531", + "severity": "WARN", + "message": "Runtime 'python3.9' was deprecated on '2025-12-15'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'python3.14'", + "source": "CFN_LINT", + "entity": { + "logicalId": "Function1", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 12, + "startColumn": 7, + "endLine": 12, + "endColumn": 14, + "ruleDescription": "Check if EOL Lambda Function Runtimes are used", + "phase": "SCHEMA", + "context": { + "actualValue": "python3.9", + "lifecycle": "deprecated" + } + }, + { + "ruleId": "W9013", + "severity": "WARN", + "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", + "source": "ENGINE", + "entity": { + "logicalId": "Function1", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "category": "Security", + "startLine": 4, + "startColumn": 3, + "endLine": 4, + "endColumn": 12, + "ruleDescription": "Hardcoded account ID in ARN", + "phase": "LINT" + }, + { + "ruleId": "W9013", + "severity": "WARN", + "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", + "source": "ENGINE", + "entity": { + "logicalId": "Function2", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "category": "Security", + "startLine": 13, + "startColumn": 3, + "endLine": 13, + "endColumn": 12, + "ruleDescription": "Hardcoded account ID in ARN", + "phase": "LINT" + }, + { + "ruleId": "W9013", + "severity": "WARN", + "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", + "source": "ENGINE", + "entity": { + "logicalId": "Function3", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "category": "Security", + "startLine": 23, + "startColumn": 3, + "endLine": 23, + "endColumn": 12, + "ruleDescription": "Hardcoded account ID in ARN", + "phase": "LINT" + }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ApiId' is create-only; updating it will cause resource replacement", + "message": "Property 'PackageType' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "AppSyncSchema", + "logicalId": "Function3", "entityType": "Resource", - "resourceType": "AWS::AppSync::GraphQLSchema" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.ApiId", + "propertyPath": "Properties.PackageType", "category": "Best Practice", - "startLine": 10, + "startLine": 29, "startColumn": 7, - "endLine": 10, - "endColumn": 12, + "endLine": 29, + "endColumn": 18, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'AppSync'" + "lifecycle": "create-only" } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'AppSync' of type 'AWS::AppSync::GraphQLApi' supports Tags but none are configured", + "message": "Resource 'Function1' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "Function1", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 6, + "startColumn": 5, + "endLine": 6, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Function2' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "AppSync", + "logicalId": "Function2", "entityType": "Resource", - "resourceType": "AWS::AppSync::GraphQLApi" + "resourceType": "AWS::Lambda::Function" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 4, + "startLine": 15, "startColumn": 5, - "endLine": 4, + "endLine": 15, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Function3' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "Function3", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 25, + "startColumn": 5, + "endLine": 25, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "good/resources/properties/templated_code_sam.yaml": { - "filePath": "good/resources/properties/templated_code_sam.yaml", + "good/resources/name.yaml": { + "filePath": "good/resources/name.yaml", "status": "OK", "metadata": { "resourcesScanned": 1, "counts": { "fatal": 0, - "errors": 0, + "errors": 1, "warnings": 0, - "informational": 3, + "informational": 2, "debug": 0 }, "suppressed": 0, @@ -19568,50 +18977,60 @@ }, "diagnostics": [ { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "ruleId": "E1152", + "severity": "ERROR", + "message": "'ami-123456' does not match format 'AWS::EC2::Image.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "Function", + "logicalId": "myInstance", "entityType": "Resource", - "resourceType": "AWS::Serverless::Application" + "resourceType": "AWS::EC2::Instance" }, - "category": "Best Practice", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 11, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "propertyPath": "Properties.ImageId", + "category": "Intrinsic Function", + "startLine": 6, + "startColumn": 7, + "endLine": 6, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate AMI id format", + "phase": "SCHEMA", + "context": { + "actualValue": "ami-123456" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Function", + "logicalId": "myInstance", "entityType": "Resource", - "resourceType": "AWS::Serverless::Application" + "resourceType": "AWS::EC2::Instance" }, + "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 11, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 6, + "startColumn": 7, + "endLine": 6, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Function' of type 'AWS::Serverless::Application' supports Tags but none are configured", + "message": "Resource 'myInstance' of type 'AWS::EC2::Instance' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Function", + "logicalId": "myInstance", "entityType": "Resource", - "resourceType": "AWS::Serverless::Application" + "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", @@ -19625,695 +19044,809 @@ } ] }, - "good/resources/rds/instance_sizes.yaml": { - "filePath": "good/resources/rds/instance_sizes.yaml", + "good/resources/primary_identifiers.yaml": { + "filePath": "good/resources/primary_identifiers.yaml", "status": "OK", "metadata": { - "resourcesScanned": 6, + "resourcesScanned": 7, "counts": { "fatal": 0, "errors": 0, - "warnings": 4, - "informational": 30, + "warnings": 0, + "informational": 17, "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Path' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "RootRole", + "entityType": "Resource", + "resourceType": "AWS::IAM::Role" + }, + "propertyPath": "Properties.Path", + "category": "Best Practice", + "startLine": 17, + "startColumn": 7, + "endLine": 17, + "endColumn": 11, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, { - "ruleId": "W9008", - "severity": "WARN", - "message": "RDS instance should have StorageEncrypted set to true", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'RoleName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DBInstance3", + "logicalId": "RootRole", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.StorageEncrypted", - "suggestedFix": "Set StorageEncrypted to true", - "category": "Security", - "startLine": 24, - "startColumn": 5, - "endLine": 24, + "propertyPath": "Properties.RoleName", + "category": "Best Practice", + "startLine": 18, + "startColumn": 7, + "endLine": 18, "endColumn": 15, - "ruleDescription": "RDS instance should have StorageEncrypted", - "phase": "LINT" + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W9008", - "severity": "WARN", - "message": "RDS instance should have StorageEncrypted set to true", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Path' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DBInstance4", + "logicalId": "RootRole3", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.StorageEncrypted", - "suggestedFix": "Set StorageEncrypted to true", - "category": "Security", - "startLine": 31, - "startColumn": 5, - "endLine": 31, - "endColumn": 15, - "ruleDescription": "RDS instance should have StorageEncrypted", - "phase": "LINT" + "propertyPath": "Properties.Path", + "category": "Best Practice", + "startLine": 40, + "startColumn": 7, + "endLine": 40, + "endColumn": 11, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W9008", - "severity": "WARN", - "message": "RDS instance should have StorageEncrypted set to true", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'RoleName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DBInstance5", + "logicalId": "RootRole3", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.StorageEncrypted", - "suggestedFix": "Set StorageEncrypted to true", - "category": "Security", - "startLine": 38, - "startColumn": 5, - "endLine": 38, + "propertyPath": "Properties.RoleName", + "category": "Best Practice", + "startLine": 41, + "startColumn": 7, + "endLine": 41, "endColumn": 15, - "ruleDescription": "RDS instance should have StorageEncrypted", - "phase": "LINT" + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W9008", - "severity": "WARN", - "message": "RDS instance should have StorageEncrypted set to true", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Path' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DBInstance6", + "logicalId": "RootRole4", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.StorageEncrypted", - "suggestedFix": "Set StorageEncrypted to true", - "category": "Security", - "startLine": 44, - "startColumn": 5, - "endLine": 44, - "endColumn": 15, - "ruleDescription": "RDS instance should have StorageEncrypted", - "phase": "LINT" + "propertyPath": "Properties.Path", + "category": "Best Practice", + "startLine": 63, + "startColumn": 7, + "endLine": 63, + "endColumn": 11, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'RoleName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "DBInstance1", + "logicalId": "RootRole4", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::IAM::Role" }, + "propertyPath": "Properties.RoleName", "category": "Best Practice", - "startLine": 10, - "startColumn": 3, - "endLine": 10, - "endColumn": 14, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 64, + "startColumn": 7, + "endLine": 64, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "DBInstance1", + "logicalId": "FunctionPermission1", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Permission" }, + "propertyPath": "Properties.FunctionName", "category": "Best Practice", - "startLine": 10, - "startColumn": 3, - "endLine": 10, - "endColumn": 14, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 91, + "startColumn": 7, + "endLine": 91, + "endColumn": 19, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'Action' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "DBInstance2", + "logicalId": "FunctionPermission1", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Permission" }, + "propertyPath": "Properties.Action", "category": "Best Practice", - "startLine": 16, - "startColumn": 3, - "endLine": 16, - "endColumn": 14, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 92, + "startColumn": 7, + "endLine": 92, + "endColumn": 13, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'Principal' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "DBInstance2", + "logicalId": "FunctionPermission1", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Permission" }, + "propertyPath": "Properties.Principal", "category": "Best Practice", - "startLine": 16, - "startColumn": 3, - "endLine": 16, - "endColumn": 14, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 93, + "startColumn": 7, + "endLine": 93, + "endColumn": 16, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "DBInstance3", + "logicalId": "FunctionPermission2", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Permission" }, + "propertyPath": "Properties.FunctionName", "category": "Best Practice", - "startLine": 22, - "startColumn": 3, - "endLine": 22, - "endColumn": 14, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 97, + "startColumn": 7, + "endLine": 97, + "endColumn": 19, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'Action' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "DBInstance3", + "logicalId": "FunctionPermission2", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Permission" }, + "propertyPath": "Properties.Action", "category": "Best Practice", - "startLine": 22, - "startColumn": 3, - "endLine": 22, - "endColumn": 14, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 98, + "startColumn": 7, + "endLine": 98, + "endColumn": 13, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'Principal' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "DBInstance4", + "logicalId": "FunctionPermission2", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::Lambda::Permission" }, + "propertyPath": "Properties.Principal", "category": "Best Practice", - "startLine": 29, - "startColumn": 3, - "endLine": 29, - "endColumn": 14, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 99, + "startColumn": 7, + "endLine": 99, + "endColumn": 16, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9040", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Resource 'RootRole' of type 'AWS::IAM::Role' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "DBInstance4", + "logicalId": "RootRole", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::IAM::Role" }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 29, - "startColumn": 3, - "endLine": 29, - "endColumn": 14, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "startLine": 7, + "startColumn": 5, + "endLine": 7, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "I3011", + "ruleId": "I9040", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Resource 'RootRole3' of type 'AWS::IAM::Role' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "DBInstance5", + "logicalId": "RootRole3", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::IAM::Role" }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 36, - "startColumn": 3, - "endLine": 36, - "endColumn": 14, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "startLine": 30, + "startColumn": 5, + "endLine": 30, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "I3011", + "ruleId": "I9040", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Resource 'RootRole4' of type 'AWS::IAM::Role' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "DBInstance5", + "logicalId": "RootRole4", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::IAM::Role" }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 36, - "startColumn": 3, - "endLine": 36, - "endColumn": 14, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "startLine": 53, + "startColumn": 5, + "endLine": 53, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "I3011", + "ruleId": "I9040", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Resource 'Bucket1' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "DBInstance6", + "logicalId": "Bucket1", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::S3::Bucket" }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 42, - "startColumn": 3, - "endLine": 42, - "endColumn": 14, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "startLine": 76, + "startColumn": 5, + "endLine": 76, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "I3011", + "ruleId": "I9040", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Resource 'Bucket2' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "DBInstance6", + "logicalId": "Bucket2", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::S3::Bucket" }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 42, + "startLine": 81, "startColumn": 3, - "endLine": 42, - "endColumn": 14, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "endLine": 81, + "endColumn": 10, + "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "good/resources/properties/allowed_pattern.yaml": { + "filePath": "good/resources/properties/allowed_pattern.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 3, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I3013", + "ruleId": "I9001", "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", + "message": "Property 'RoleName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "DBInstance3", + "logicalId": "TESTROLE", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties", + "propertyPath": "Properties.RoleName", "category": "Best Practice", - "startLine": 24, - "startColumn": 5, - "endLine": 24, + "startLine": 8, + "startColumn": 7, + "endLine": 8, "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", - "phase": "LINT" + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3013", + "ruleId": "I9001", "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", + "message": "Property 'Path' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "DBInstance4", + "logicalId": "TESTROLE", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties", + "propertyPath": "Properties.Path", "category": "Best Practice", - "startLine": 31, - "startColumn": 5, - "endLine": 31, - "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", - "phase": "LINT" + "startLine": 9, + "startColumn": 7, + "endLine": 9, + "endColumn": 11, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3013", + "ruleId": "I9040", "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", + "message": "Resource 'TESTROLE' of type 'AWS::IAM::Role' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "DBInstance5", + "logicalId": "TESTROLE", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 38, + "startLine": 7, "startColumn": 5, - "endLine": 38, + "endLine": 7, "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "good/resources/properties/az_cdk.yaml": { + "filePath": "good/resources/properties/az_cdk.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 2, + "counts": { + "fatal": 1, + "errors": 1, + "warnings": 0, + "informational": 3, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I3013", - "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", + "ruleId": "F3058", + "severity": "FATAL", + "message": "One of ['CidrBlock', 'Ipv4IpamPoolId', 'Ipv6IpamPoolId', 'Ipv6CidrBlock'] is a required property", + "source": "SCHEMA", "entity": { - "logicalId": "DBInstance6", + "logicalId": "Instance", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Subnet" }, "propertyPath": "Properties", - "category": "Best Practice", - "startLine": 44, + "category": "Schema", + "startLine": 6, "startColumn": 5, - "endLine": 44, + "endLine": 6, "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", - "phase": "LINT" + "ruleDescription": "One of properties required (requiredOr)", + "phase": "SCHEMA" }, { - "ruleId": "I3100", - "severity": "INFO", - "message": "Previous generation instance type 'db.m3.medium' - consider upgrading", + "ruleId": "E1151", + "severity": "ERROR", + "message": "'vpc-1234567' does not match format 'AWS::EC2::VPC.Id'", "source": "CFN_LINT", "entity": { - "logicalId": "DBInstance6", + "logicalId": "Instance", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.DBInstanceClass", - "suggestedFix": "Upgrade to a current generation instance type", - "category": "Best Practice", - "startLine": 45, + "propertyPath": "Properties.VpcId", + "category": "Intrinsic Function", + "startLine": 7, "startColumn": 7, - "endLine": 45, - "endColumn": 22, - "ruleDescription": "Checks for legacy instance type generations", - "phase": "LINT" + "endLine": 7, + "endColumn": 12, + "ruleDescription": "Validate VPC id format", + "phase": "SCHEMA", + "context": { + "actualValue": "vpc-1234567" + } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DBInstance1", + "logicalId": "Instance", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 14, + "startLine": 7, "startColumn": 7, - "endLine": 14, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "endLine": 7, + "endColumn": 12, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only", - "resolutionSource": "Fn::If on condition 'snapshot'" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DBInstance2", + "logicalId": "Instance", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.AvailabilityZone", "category": "Best Practice", - "startLine": 20, + "startLine": 8, "startColumn": 7, - "endLine": 20, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "endLine": 8, + "endColumn": 23, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only" } }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Resource 'Instance' of type 'AWS::EC2::Subnet' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "DBInstance3", + "logicalId": "Instance", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 26, - "startColumn": 7, - "endLine": 26, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 6, + "startColumn": 5, + "endLine": 6, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "good/resources/properties/custom.yaml": { + "filePath": "good/resources/properties/custom.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 0, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [] + }, + "good/resources/properties/exclusive.yaml": { + "filePath": "good/resources/properties/exclusive.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 2, + "counts": { + "fatal": 1, + "errors": 0, + "warnings": 0, + "informational": 6, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "F3020", + "severity": "FATAL", + "message": "'Dimensions' should not be included with 'Metrics'", + "source": "SCHEMA", "entity": { - "logicalId": "DBInstance4", + "logicalId": "Alarm", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::CloudWatch::Alarm" }, - "propertyPath": "Properties.Engine", - "category": "Best Practice", - "startLine": 33, + "propertyPath": "Properties.Dimensions", + "category": "Schema", + "startLine": 17, "startColumn": 7, - "endLine": 33, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", + "endLine": 17, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-cloudwatch.git", + "ruleDescription": "Mutually exclusive properties", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "property": "Dimensions" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'SourceSecurityGroupId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DBInstance5", + "logicalId": "Ingress", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::SecurityGroupIngress" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.SourceSecurityGroupId", "category": "Best Practice", - "startLine": 40, + "startLine": 5, "startColumn": 7, - "endLine": 40, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "endLine": 5, + "endColumn": 28, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'CidrIp' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DBInstance6", + "logicalId": "Ingress", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::SecurityGroupIngress" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.CidrIp", "category": "Best Practice", - "startLine": 46, + "startLine": 6, "startColumn": 7, - "endLine": 46, + "endLine": 6, "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } - }, - { - "ruleId": "I9003", - "severity": "INFO", - "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", - "source": "ENGINE", - "category": "Best Practice", - "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'DBInstance1' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "DBInstance1", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 12, - "startColumn": 5, - "endLine": 12, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'DBInstance2' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "DBInstance2", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 18, - "startColumn": 5, - "endLine": 18, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'DBInstance3' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "message": "Property 'IpProtocol' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DBInstance3", + "logicalId": "Ingress", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::SecurityGroupIngress" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.IpProtocol", "category": "Best Practice", - "startLine": 24, - "startColumn": 5, - "endLine": 24, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 7, + "startColumn": 7, + "endLine": 7, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'DBInstance4' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "message": "Property 'GroupId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DBInstance4", + "logicalId": "Ingress", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::SecurityGroupIngress" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.GroupId", "category": "Best Practice", - "startLine": 31, - "startColumn": 5, - "endLine": 31, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 8, + "startColumn": 7, + "endLine": 8, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'DBInstance5' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "message": "Property 'AlarmName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DBInstance5", + "logicalId": "Alarm", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::CloudWatch::Alarm" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.AlarmName", "category": "Best Practice", - "startLine": 38, - "startColumn": 5, - "endLine": 38, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 12, + "startColumn": 7, + "endLine": 12, + "endColumn": 16, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-cloudwatch.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'DBInstance6' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "message": "Resource 'Alarm' of type 'AWS::CloudWatch::Alarm' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "DBInstance6", + "logicalId": "Alarm", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::CloudWatch::Alarm" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 44, + "startLine": 11, "startColumn": 5, - "endLine": 44, + "endLine": 11, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "good/resources/rds/not_enum_master_username_parameter.yaml": { - "filePath": "good/resources/rds/not_enum_master_username_parameter.yaml", + "good/resources/properties/hard_coded_arn_properties.yaml": { + "filePath": "good/resources/properties/hard_coded_arn_properties.yaml", "status": "OK", "metadata": { - "resourcesScanned": 1, + "resourcesScanned": 4, "counts": { "fatal": 0, "errors": 0, "warnings": 0, - "informational": 2, + "informational": 3, "debug": 0 }, "suppressed": 0, @@ -20324,61 +19857,80 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'RestApiId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ParameterUsername", + "logicalId": "Authorizer", "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" + "resourceType": "AWS::ApiGateway::Authorizer" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.RestApiId", "category": "Best Practice", - "startLine": 12, + "startLine": 6, "startColumn": 7, - "endLine": 12, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", + "endLine": 6, + "endColumn": 16, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'MasterUsername' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'Bucket' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ParameterUsername", + "logicalId": "Bucket", "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" + "resourceType": "AWS::S3::BucketPolicy" }, - "propertyPath": "Properties.MasterUsername", + "propertyPath": "Properties.Bucket", "category": "Best Practice", - "startLine": 13, + "startLine": 20, "startColumn": 7, - "endLine": 13, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", + "endLine": 20, + "endColumn": 13, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only" } + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Stack' of type 'AWS::CloudFormation::Stack' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "Stack", + "entityType": "Resource", + "resourceType": "AWS::CloudFormation::Stack" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 13, + "startColumn": 5, + "endLine": 13, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" } ] }, - "good/resources/s3/access-control-obsolete.yaml": { - "filePath": "good/resources/s3/access-control-obsolete.yaml", + "good/resources/properties/hard_coded_arn_properties_cdk.yaml": { + "filePath": "good/resources/properties/hard_coded_arn_properties_cdk.yaml", "status": "OK", "metadata": { - "resourcesScanned": 3, + "resourcesScanned": 7, "counts": { "fatal": 0, "errors": 0, - "warnings": 0, - "informational": 4, + "warnings": 2, + "informational": 6, "debug": 0 }, "suppressed": 0, @@ -20387,66 +19939,147 @@ }, "diagnostics": [ { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", + "source": "CFN_LINT", "entity": { - "logicalId": "Bucket2", + "logicalId": "S3BadBucket", "entityType": "Resource", "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.BucketName", + "propertyPath": "Properties.NotificationConfiguration.TopicConfigurations.0.Topic.Fn::Sub", "category": "Best Practice", + "startLine": 12, + "startColumn": 11, + "endLine": 12, + "endColumn": 18, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" + }, + { + "ruleId": "W3045", + "severity": "WARN", + "message": "AccessControl property is deprecated. Use bucket policies instead", + "source": "CFN_LINT", + "entity": { + "logicalId": "S3BadBucket", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" + }, + "propertyPath": "Properties.AccessControl", + "suggestedFix": "Remove AccessControl and use an AWS::S3::BucketPolicy resource", + "category": "Deprecation", "startLine": 9, "startColumn": 7, "endLine": 9, - "endColumn": 17, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", + "endColumn": 20, + "ruleDescription": "Controlling access to an S3 bucket should be done with bucket policies", + "phase": "LINT", "context": { - "lifecycle": "create-only" + "actualValue": "Private" } }, + { + "ruleId": "I3042", + "severity": "INFO", + "message": "ARN in Resource S3BadBucket contains hardcoded Partition in ARN or incorrectly placed Pseudo Parameters", + "source": "CFN_LINT", + "entity": { + "logicalId": "S3BadBucket", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" + }, + "propertyPath": "Properties.NotificationConfiguration.TopicConfigurations.0.Topic.Fn::Sub", + "category": "Best Practice", + "startLine": 12, + "startColumn": 11, + "endLine": 12, + "endColumn": 18, + "ruleDescription": "ARNs should use correctly placed Pseudo Parameters", + "phase": "LINT" + }, + { + "ruleId": "I3042", + "severity": "INFO", + "message": "ARN in Resource SampleBadBucketPolicy contains hardcoded Partition in ARN or incorrectly placed Pseudo Parameters", + "source": "CFN_LINT", + "entity": { + "logicalId": "SampleBadBucketPolicy", + "entityType": "Resource", + "resourceType": "AWS::S3::BucketPolicy" + }, + "propertyPath": "Properties.PolicyDocument.Statement.0.Resource.Fn::Sub", + "category": "Best Practice", + "startLine": 24, + "startColumn": 13, + "endLine": 24, + "endColumn": 20, + "ruleDescription": "ARNs should use correctly placed Pseudo Parameters", + "phase": "LINT" + }, { "ruleId": "I9001", "severity": "INFO", "message": "Property 'Bucket' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "BucketPolicy", + "logicalId": "SampleBadBucketPolicy", "entityType": "Resource", "resourceType": "AWS::S3::BucketPolicy" }, "propertyPath": "Properties.Bucket", "category": "Best Practice", - "startLine": 13, + "startLine": 18, "startColumn": 7, - "endLine": 13, + "endLine": 18, "endColumn": 13, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'Bucket2'" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'S3BadBucket'" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Path' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "SampleRole", + "entityType": "Resource", + "resourceType": "AWS::IAM::Role" + }, + "propertyPath": "Properties.Path", + "category": "Best Practice", + "startLine": 39, + "startColumn": 7, + "endLine": 39, + "endColumn": 11, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Bucket1' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Resource 'S3BadBucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Bucket1", + "logicalId": "S3BadBucket", "entityType": "Resource", "resourceType": "AWS::S3::Bucket" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 5, + "startLine": 8, "startColumn": 5, - "endLine": 5, + "endLine": 8, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -20454,35 +20087,35 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Bucket2' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Resource 'SampleRole' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Bucket2", + "logicalId": "SampleRole", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::IAM::Role" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 8, + "startLine": 29, "startColumn": 5, - "endLine": 8, + "endLine": 29, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "good/resources/update_policy_supported.yaml": { - "filePath": "good/resources/update_policy_supported.yaml", + "good/resources/properties/hard_coded_arn_properties_sam.yaml": { + "filePath": "good/resources/properties/hard_coded_arn_properties_sam.yaml", "status": "OK", "metadata": { - "resourcesScanned": 5, + "resourcesScanned": 7, "counts": { "fatal": 0, "errors": 0, - "warnings": 2, - "informational": 9, + "warnings": 1, + "informational": 6, "debug": 0 }, "suppressed": 0, @@ -20491,157 +20124,68 @@ }, "diagnostics": [ { - "ruleId": "W2531", - "severity": "WARN", - "message": "Runtime 'python3.9' was deprecated on '2025-12-15'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'python3.14'", - "source": "CFN_LINT", - "entity": { - "logicalId": "MyFunction", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 30, - "startColumn": 7, - "endLine": 30, - "endColumn": 14, - "ruleDescription": "Check if EOL Lambda Function Runtimes are used", - "phase": "SCHEMA", - "context": { - "actualValue": "python3.9", - "lifecycle": "deprecated" - } - }, - { - "ruleId": "W3697", + "ruleId": "W3045", "severity": "WARN", - "message": "Resource type 'AWS::AutoScaling::LaunchConfiguration' is from a service in maintenance mode since 2024-10-01. Consider migrating to an alternative", + "message": "AccessControl property is deprecated. Use bucket policies instead", "source": "CFN_LINT", "entity": { - "logicalId": "LaunchConfig", + "logicalId": "S3BadBucket", "entityType": "Resource", - "resourceType": "AWS::AutoScaling::LaunchConfiguration" + "resourceType": "AWS::S3::Bucket" }, + "propertyPath": "Properties.AccessControl", + "suggestedFix": "Remove AccessControl and use an AWS::S3::BucketPolicy resource", "category": "Deprecation", - "startLine": 12, - "startColumn": 3, - "endLine": 12, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", - "ruleDescription": "Resource type is from a service in maintenance mode", - "phase": "SCHEMA" - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'LaunchConfigurationName' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "MyASG", - "entityType": "Resource", - "resourceType": "AWS::AutoScaling::AutoScalingGroup" - }, - "propertyPath": "Properties.LaunchConfigurationName", - "category": "Best Practice", "startLine": 11, "startColumn": 7, "endLine": 11, - "endColumn": 30, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only", - "resolutionSource": "Ref to 'LaunchConfig'" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "LaunchConfig", - "entityType": "Resource", - "resourceType": "AWS::AutoScaling::LaunchConfiguration" - }, - "propertyPath": "Properties.ImageId", - "category": "Best Practice", - "startLine": 15, - "startColumn": 7, - "endLine": 15, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'InstanceType' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "LaunchConfig", - "entityType": "Resource", - "resourceType": "AWS::AutoScaling::LaunchConfiguration" - }, - "propertyPath": "Properties.InstanceType", - "category": "Best Practice", - "startLine": 16, - "startColumn": 7, - "endLine": 16, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", + "endColumn": 20, + "ruleDescription": "Controlling access to an S3 bucket should be done with bucket policies", + "phase": "LINT", "context": { - "lifecycle": "create-only" + "actualValue": "Private" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "message": "Property 'Bucket' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MyAlias", + "logicalId": "SampleBadBucketPolicy", "entityType": "Resource", - "resourceType": "AWS::Lambda::Alias" + "resourceType": "AWS::S3::BucketPolicy" }, - "propertyPath": "Properties.FunctionName", + "propertyPath": "Properties.Bucket", "category": "Best Practice", - "startLine": 23, + "startLine": 20, "startColumn": 7, - "endLine": 23, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-lambda", + "endLine": 20, + "endColumn": 13, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "Ref to 'MyFunction'" + "resolutionSource": "Ref to 'S3BadBucket'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Name' is create-only; updating it will cause resource replacement", + "message": "Property 'Path' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MyAlias", + "logicalId": "SampleRole", "entityType": "Resource", - "resourceType": "AWS::Lambda::Alias" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.Name", + "propertyPath": "Properties.Path", "category": "Best Practice", - "startLine": 25, + "startLine": 41, "startColumn": 7, - "endLine": 25, + "endLine": 41, "endColumn": 11, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-lambda", + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -20651,19 +20195,20 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "message": "Property 'PipelineName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MyFunction", + "logicalId": "IngestionPipeline", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::OSIS::Pipeline" }, - "propertyPath": "Properties.FunctionName", + "propertyPath": "Properties.PipelineName", "category": "Best Practice", - "startLine": 29, + "startLine": 89, "startColumn": 7, - "endLine": 29, + "endLine": 89, "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-osis.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -20673,39 +20218,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'MyASG' of type 'AWS::AutoScaling::AutoScalingGroup' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "MyASG", - "entityType": "Resource", - "resourceType": "AWS::AutoScaling::AutoScalingGroup" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 8, - "startColumn": 5, - "endLine": 8, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'MyFunction' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "message": "Resource 'S3BadBucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "MyFunction", + "logicalId": "S3BadBucket", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::S3::Bucket" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 28, + "startLine": 10, "startColumn": 5, - "endLine": 28, + "endLine": 10, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -20713,100 +20238,39 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'FunctionRole' of type 'AWS::IAM::Role' supports Tags but none are configured", + "message": "Resource 'SampleRole' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "FunctionRole", + "logicalId": "SampleRole", "entityType": "Resource", "resourceType": "AWS::IAM::Role" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 39, + "startLine": 31, "startColumn": 5, - "endLine": 39, + "endLine": 31, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" - } - ] - }, - "good/resources_codepipeline.yaml": { - "filePath": "good/resources_codepipeline.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 1, - "informational": 2, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "W9002", - "severity": "WARN", - "message": "Property 'RoleArn' has a hardcoded ARN - use Ref, GetAtt, or a parameter instead", - "source": "ENGINE", - "entity": { - "logicalId": "TestPipeline", - "entityType": "Resource", - "resourceType": "AWS::CodePipeline::Pipeline" - }, - "propertyPath": "Properties.RoleArn", - "category": "Best Practice", - "startLine": 12, - "startColumn": 7, - "endLine": 12, - "endColumn": 14, - "ruleDescription": "Hardcoded ARN property", - "phase": "LINT" - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Name' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "TestPipeline", - "entityType": "Resource", - "resourceType": "AWS::CodePipeline::Pipeline" - }, - "propertyPath": "Properties.Name", - "category": "Best Practice", - "startLine": 8, - "startColumn": 7, - "endLine": 8, - "endColumn": 11, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-codepipeline", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'TestPipeline' of type 'AWS::CodePipeline::Pipeline' supports Tags but none are configured", + "message": "Resource 'IngestionPipeline' of type 'AWS::OSIS::Pipeline' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "TestPipeline", + "logicalId": "IngestionPipeline", "entityType": "Resource", - "resourceType": "AWS::CodePipeline::Pipeline" + "resourceType": "AWS::OSIS::Pipeline" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 7, + "startLine": 88, "startColumn": 5, - "endLine": 7, + "endLine": 88, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" diff --git a/src/resources/expected/validation_reports7.json b/src/resources/expected/validation_reports7.json index 34f0dc83..4dd73ae7 100644 --- a/src/resources/expected/validation_reports7.json +++ b/src/resources/expected/validation_reports7.json @@ -1,14 +1,14 @@ { - "good/resources_cognito_userpool_tag_is_string_map.yaml": { - "filePath": "good/resources_cognito_userpool_tag_is_string_map.yaml", + "good/resources/properties/list_duplicates.yaml": { + "filePath": "good/resources/properties/list_duplicates.yaml", "status": "OK", "metadata": { - "resourcesScanned": 1, + "resourcesScanned": 3, "counts": { "fatal": 0, - "errors": 0, + "errors": 3, "warnings": 0, - "informational": 2, + "informational": 3, "debug": 0 }, "suppressed": 0, @@ -17,183 +17,137 @@ }, "diagnostics": [ { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "ruleId": "E3530", + "severity": "ERROR", + "message": "'Statement' is a required property", "source": "CFN_LINT", "entity": { - "logicalId": "MyCognitoUserPool", + "logicalId": "IamRole", "entityType": "Resource", - "resourceType": "AWS::Cognito::UserPool" + "resourceType": "AWS::IAM::Role" }, - "category": "Best Practice", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 20, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "propertyPath": "Properties.AssumeRolePolicyDocument", + "suggestedFix": "Add a Statement array to the AssumeRolePolicyDocument", + "category": "Resource", + "startLine": 16, + "startColumn": 7, + "endLine": 16, + "endColumn": 31, + "ruleDescription": "Validate IAM trust policies", "phase": "LINT" }, { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "ruleId": "E3530", + "severity": "ERROR", + "message": "'Statement' is a required property", "source": "CFN_LINT", "entity": { - "logicalId": "MyCognitoUserPool", + "logicalId": "IamRoleWithConditions", "entityType": "Resource", - "resourceType": "AWS::Cognito::UserPool" + "resourceType": "AWS::IAM::Role" }, - "category": "Best Practice", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 20, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "propertyPath": "Properties.AssumeRolePolicyDocument", + "suggestedFix": "Add a Statement array to the AssumeRolePolicyDocument", + "category": "Resource", + "startLine": 25, + "startColumn": 7, + "endLine": 25, + "endColumn": 31, + "ruleDescription": "Validate IAM trust policies", "phase": "LINT" - } - ] - }, - "good/resources_deletionpolicy.yaml": { - "filePath": "good/resources_deletionpolicy.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 3, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 1, - "informational": 5, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "W9008", - "severity": "WARN", - "message": "RDS instance should have StorageEncrypted set to true", - "source": "ENGINE", + "ruleId": "E3530", + "severity": "ERROR", + "message": "'Statement' is a required property", + "source": "CFN_LINT", "entity": { - "logicalId": "PolicyList", + "logicalId": "IamRoleWithNestedConditions", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.StorageEncrypted", - "suggestedFix": "Set StorageEncrypted to true", - "category": "Security", - "startLine": 28, - "startColumn": 5, - "endLine": 28, - "endColumn": 15, - "ruleDescription": "RDS instance should have StorageEncrypted", + "propertyPath": "Properties.AssumeRolePolicyDocument", + "suggestedFix": "Add a Statement array to the AssumeRolePolicyDocument", + "category": "Resource", + "startLine": 37, + "startColumn": 7, + "endLine": 37, + "endColumn": 31, + "ruleDescription": "Validate IAM trust policies", "phase": "LINT" }, { - "ruleId": "I3013", + "ruleId": "I9040", "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", + "message": "Resource 'IamRole' of type 'AWS::IAM::Role' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "PolicyList", + "logicalId": "IamRole", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 28, + "startLine": 15, "startColumn": 5, - "endLine": 28, + "endLine": 15, "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", - "phase": "LINT" - }, - { - "ruleId": "I3100", - "severity": "INFO", - "message": "Previous generation instance type 'db.m1.small' - consider upgrading", - "source": "CFN_LINT", - "entity": { - "logicalId": "PolicyList", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" - }, - "propertyPath": "Properties.DBInstanceClass", - "suggestedFix": "Upgrade to a current generation instance type", - "category": "Best Practice", - "startLine": 30, - "startColumn": 7, - "endLine": 30, - "endColumn": 22, - "ruleDescription": "Checks for legacy instance type generations", + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Resource 'IamRoleWithConditions' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "PolicyList", + "logicalId": "IamRoleWithConditions", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.Engine", - "category": "Best Practice", - "startLine": 31, - "startColumn": 7, - "endLine": 31, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } - }, - { - "ruleId": "I9003", - "severity": "INFO", - "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", - "source": "ENGINE", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", + "startLine": 24, + "startColumn": 5, + "endLine": 24, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'PolicyList' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "message": "Resource 'IamRoleWithNestedConditions' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "PolicyList", + "logicalId": "IamRoleWithNestedConditions", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::IAM::Role" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 28, + "startLine": 36, "startColumn": 5, - "endLine": 28, + "endLine": 36, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "good/resources_updatereplacepolicy.yaml": { - "filePath": "good/resources_updatereplacepolicy.yaml", + "good/resources/properties/password.yaml": { + "filePath": "good/resources/properties/password.yaml", "status": "OK", "metadata": { - "resourcesScanned": 3, + "resourcesScanned": 4, "counts": { "fatal": 0, "errors": 0, - "warnings": 1, - "informational": 5, + "warnings": 8, + "informational": 21, "debug": 0 }, "suppressed": 0, @@ -202,431 +156,414 @@ }, "diagnostics": [ { - "ruleId": "W9008", + "ruleId": "W1011", "severity": "WARN", - "message": "RDS instance should have StorageEncrypted set to true", - "source": "ENGINE", + "message": "Use dynamic references (e.g., SSM SecureString) instead of parameter 'MyPassword' for secrets", + "source": "CFN_LINT", "entity": { - "logicalId": "PolicyList", + "logicalId": "MyDB", "entityType": "Resource", "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.StorageEncrypted", - "suggestedFix": "Set StorageEncrypted to true", + "propertyPath": "Properties.MasterUserPassword", "category": "Security", - "startLine": 28, - "startColumn": 5, - "endLine": 28, - "endColumn": 15, - "ruleDescription": "RDS instance should have StorageEncrypted", + "startLine": 22, + "startColumn": 7, + "endLine": 22, + "endColumn": 25, + "ruleDescription": "Instead of REFing a parameter for a secret use a dynamic reference", "phase": "LINT" }, { - "ruleId": "I3013", - "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "ruleId": "W1020", + "severity": "WARN", + "message": "Fn::Sub isn't needed because there are no variables", "source": "CFN_LINT", "entity": { - "logicalId": "PolicyList", + "logicalId": "MyIAMUser", + "entityType": "Resource", + "resourceType": "AWS::IAM::User" + }, + "propertyPath": "Properties.LoginProfile.Password.Fn::Sub", + "category": "Best Practice", + "startLine": 47, + "startColumn": 9, + "endLine": 47, + "endColumn": 16, + "ruleDescription": "Sub isn't needed if it doesn't have a variable defined", + "phase": "LINT" + }, + { + "ruleId": "W3011", + "severity": "WARN", + "message": "Both 'UpdateReplacePolicy' and 'DeletionPolicy' are needed to protect resource from deletion", + "source": "CFN_LINT", + "entity": { + "logicalId": "MyDB", "entityType": "Resource", "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties", "category": "Best Practice", - "startLine": 28, - "startColumn": 5, - "endLine": 28, - "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "startLine": 15, + "startColumn": 3, + "endLine": 15, + "endColumn": 7, + "ruleDescription": "Check resources with UpdateReplacePolicy/DeletionPolicy have both", "phase": "LINT" }, { - "ruleId": "I3100", - "severity": "INFO", - "message": "Previous generation instance type 'db.m1.small' - consider upgrading", + "ruleId": "W3011", + "severity": "WARN", + "message": "Both 'UpdateReplacePolicy' and 'DeletionPolicy' are needed to protect resource from deletion", "source": "CFN_LINT", "entity": { - "logicalId": "PolicyList", + "logicalId": "myNewDb", "entityType": "Resource", "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.DBInstanceClass", - "suggestedFix": "Upgrade to a current generation instance type", "category": "Best Practice", - "startLine": 30, - "startColumn": 7, - "endLine": 30, - "endColumn": 22, - "ruleDescription": "Checks for legacy instance type generations", + "startLine": 24, + "startColumn": 3, + "endLine": 24, + "endColumn": 10, + "ruleDescription": "Check resources with UpdateReplacePolicy/DeletionPolicy have both", "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "W3011", + "severity": "WARN", + "message": "Both 'UpdateReplacePolicy' and 'DeletionPolicy' are needed to protect resource from deletion", + "source": "CFN_LINT", "entity": { - "logicalId": "PolicyList", + "logicalId": "myThirdDb", "entityType": "Resource", "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Engine", "category": "Best Practice", - "startLine": 31, - "startColumn": 7, - "endLine": 31, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 33, + "startColumn": 3, + "endLine": 33, + "endColumn": 12, + "ruleDescription": "Check resources with UpdateReplacePolicy/DeletionPolicy have both", + "phase": "LINT" }, { - "ruleId": "I9003", - "severity": "INFO", - "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", + "ruleId": "W9008", + "severity": "WARN", + "message": "RDS instance should have StorageEncrypted set to true", "source": "ENGINE", - "category": "Best Practice", - "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", + "entity": { + "logicalId": "MyDB", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.StorageEncrypted", + "suggestedFix": "Set StorageEncrypted to true", + "category": "Security", + "startLine": 17, + "startColumn": 5, + "endLine": 17, + "endColumn": 15, + "ruleDescription": "RDS instance should have StorageEncrypted", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'PolicyList' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "ruleId": "W9008", + "severity": "WARN", + "message": "RDS instance should have StorageEncrypted set to true", "source": "ENGINE", "entity": { - "logicalId": "PolicyList", + "logicalId": "myNewDb", "entityType": "Resource", "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 28, + "propertyPath": "Properties.StorageEncrypted", + "suggestedFix": "Set StorageEncrypted to true", + "category": "Security", + "startLine": 26, "startColumn": 5, - "endLine": 28, + "endLine": 26, "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "RDS instance should have StorageEncrypted", "phase": "LINT" - } - ] - }, - "good/route53_conditional_record_arrays.yaml": { - "filePath": "good/route53_conditional_record_arrays.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 6, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 2, - "informational": 6, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "W1028", + "ruleId": "W9008", "severity": "WARN", - "message": "['Fn::If', 2] is not reachable. When setting condition 'ChooseFirst' to False from current status True", - "source": "CFN_LINT", + "message": "RDS instance should have StorageEncrypted set to true", + "source": "ENGINE", "entity": { - "logicalId": "StandaloneUnreachableInvalid", + "logicalId": "myThirdDb", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSet" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.ResourceRecords.Fn::If.2", - "category": "Best Practice", - "startLine": 32, - "startColumn": 11, - "endLine": 32, - "endColumn": 12, - "ruleDescription": "Check Fn::If has a path that cannot be reached", + "propertyPath": "Properties.StorageEncrypted", + "suggestedFix": "Set StorageEncrypted to true", + "category": "Security", + "startLine": 35, + "startColumn": 5, + "endLine": 35, + "endColumn": 15, + "ruleDescription": "RDS instance should have StorageEncrypted", "phase": "LINT" }, { - "ruleId": "W1028", - "severity": "WARN", - "message": "['Fn::If', 2] is not reachable. When setting condition 'ChooseFirst' to False from current status True", + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "GroupUnreachableInvalid", + "logicalId": "MyDB", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSetGroup" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.RecordSets.Fn::If.2", "category": "Best Practice", - "startLine": 58, - "startColumn": 11, - "endLine": 58, - "endColumn": 12, - "ruleDescription": "Check Fn::If has a path that cannot be reached", + "startLine": 15, + "startColumn": 3, + "endLine": 15, + "endColumn": 7, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'HostedZoneName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "StandaloneBothBranchesValid", + "logicalId": "myNewDb", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSet" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.HostedZoneName", "category": "Best Practice", - "startLine": 13, - "startColumn": 7, - "endLine": 13, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53-recordset", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 24, + "startColumn": 3, + "endLine": 24, + "endColumn": 10, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'HostedZoneName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "StandaloneUnreachableInvalid", + "logicalId": "myThirdDb", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSet" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.HostedZoneName", "category": "Best Practice", - "startLine": 25, - "startColumn": 7, - "endLine": 25, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53-recordset", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 33, + "startColumn": 3, + "endLine": 33, + "endColumn": 12, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3013", "severity": "INFO", - "message": "Property 'HostedZoneName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "GroupBothBranchesValid", + "logicalId": "MyDB", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSetGroup" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.HostedZoneName", + "propertyPath": "Properties", "category": "Best Practice", - "startLine": 36, - "startColumn": 7, - "endLine": 36, - "endColumn": 21, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 17, + "startColumn": 5, + "endLine": 17, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3013", "severity": "INFO", - "message": "Property 'HostedZoneName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "GroupUnreachableInvalid", + "logicalId": "myNewDb", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSetGroup" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.HostedZoneName", + "propertyPath": "Properties", "category": "Best Practice", - "startLine": 51, - "startColumn": 7, - "endLine": 51, - "endColumn": 21, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 26, + "startColumn": 5, + "endLine": 26, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3013", "severity": "INFO", - "message": "Property 'HostedZoneName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "StandaloneMutuallyExclusiveCnameItems", + "logicalId": "myThirdDb", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSet" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.HostedZoneName", + "propertyPath": "Properties", "category": "Best Practice", - "startLine": 65, - "startColumn": 7, - "endLine": 65, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53-recordset", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 35, + "startColumn": 5, + "endLine": 35, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3100", "severity": "INFO", - "message": "Property 'HostedZoneName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "Previous generation instance type 'db.m1.small' - consider upgrading", + "source": "CFN_LINT", "entity": { - "logicalId": "GroupMutuallyExclusiveCnameItems", + "logicalId": "MyDB", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSetGroup" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.HostedZoneName", + "propertyPath": "Properties.DBInstanceClass", + "suggestedFix": "Upgrade to a current generation instance type", "category": "Best Practice", - "startLine": 75, + "startLine": 19, "startColumn": 7, - "endLine": 75, - "endColumn": 21, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - } - ] - }, - "good/route53_conditional_record_items.yaml": { - "filePath": "good/route53_conditional_record_items.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 2, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 2, - "debug": 0 + "endLine": 19, + "endColumn": 22, + "ruleDescription": "Checks for legacy instance type generations", + "phase": "LINT" + }, + { + "ruleId": "I3100", + "severity": "INFO", + "message": "Previous generation instance type 'db.m1.small' - consider upgrading", + "source": "CFN_LINT", + "entity": { + "logicalId": "myNewDb", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.DBInstanceClass", + "suggestedFix": "Upgrade to a current generation instance type", + "category": "Best Practice", + "startLine": 28, + "startColumn": 7, + "endLine": 28, + "endColumn": 22, + "ruleDescription": "Checks for legacy instance type generations", + "phase": "LINT" + }, + { + "ruleId": "I3100", + "severity": "INFO", + "message": "Previous generation instance type 'db.m1.small' - consider upgrading", + "source": "CFN_LINT", + "entity": { + "logicalId": "myThirdDb", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.DBInstanceClass", + "suggestedFix": "Upgrade to a current generation instance type", + "category": "Best Practice", + "startLine": 37, + "startColumn": 7, + "endLine": 37, + "endColumn": 22, + "ruleDescription": "Checks for legacy instance type generations", + "phase": "LINT" }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'HostedZoneName' is create-only; updating it will cause resource replacement", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Standalone", + "logicalId": "MyDB", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSet" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.HostedZoneName", + "propertyPath": "Properties.Engine", "category": "Best Practice", - "startLine": 12, + "startLine": 20, "startColumn": 7, - "endLine": 12, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53-recordset", + "endLine": 20, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'HostedZoneName' is create-only; updating it will cause resource replacement", + "message": "Property 'MasterUsername' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Group", + "logicalId": "MyDB", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSetGroup" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.HostedZoneName", + "propertyPath": "Properties.MasterUsername", "category": "Best Practice", "startLine": 21, "startColumn": 7, "endLine": 21, "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only" } - } - ] - }, - "good/route53_conditional_scenarios.yaml": { - "filePath": "good/route53_conditional_scenarios.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 4, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 6, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'HostedZoneName' is create-only; updating it will cause resource replacement", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConditionalProperties", + "logicalId": "myNewDb", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSet" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.HostedZoneName", + "propertyPath": "Properties.Engine", "category": "Best Practice", - "startLine": 14, + "startLine": 29, "startColumn": 7, - "endLine": 14, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53-recordset", + "endLine": 29, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'HostedZoneName' is create-only; updating it will cause resource replacement", + "message": "Property 'MasterUsername' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MutuallyExclusiveConditions", + "logicalId": "myNewDb", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSet" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.HostedZoneName", + "propertyPath": "Properties.MasterUsername", "category": "Best Practice", "startLine": 30, "startColumn": 7, "endLine": 30, "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53-recordset", + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -636,233 +573,166 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'HostedZoneName' is create-only; updating it will cause resource replacement", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "LiteralNoValueAlias", + "logicalId": "myThirdDb", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSet" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.HostedZoneName", + "propertyPath": "Properties.Engine", "category": "Best Practice", - "startLine": 61, + "startLine": 38, "startColumn": 7, - "endLine": 61, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53-recordset", + "endLine": 38, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } }, { - "ruleId": "I9002", + "ruleId": "I9001", "severity": "INFO", - "message": "'TTL' is ignored in this configuration (from extension)", + "message": "Property 'MasterUsername' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConditionalProperties", + "logicalId": "myThirdDb", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSet" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.TTL", + "propertyPath": "Properties.MasterUsername", "category": "Best Practice", - "startLine": 22, + "startLine": 39, "startColumn": 7, - "endLine": 22, - "endColumn": 10, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53-recordset", - "ruleDescription": "Property is ignored in this configuration (from extension)", + "endLine": 39, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "resolutionSource": "Fn::If on condition 'IsAlias'" + "lifecycle": "create-only" } }, { - "ruleId": "I9002", + "ruleId": "I9001", "severity": "INFO", - "message": "'TTL' is ignored in this configuration (from extension)", + "message": "Property 'UserName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MutuallyExclusiveConditions", + "logicalId": "MyIAMUser", "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSet" + "resourceType": "AWS::IAM::User" }, - "propertyPath": "Properties.TTL", + "propertyPath": "Properties.UserName", "category": "Best Practice", - "startLine": 38, + "startLine": 45, "startColumn": 7, - "endLine": 38, - "endColumn": 10, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53-recordset", - "ruleDescription": "Property is ignored in this configuration (from extension)", + "endLine": 45, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "resolutionSource": "Fn::If on condition 'IsStandard'" + "lifecycle": "create-only", + "resolutionSource": "parameter 'Environment' (type String)" } }, { - "ruleId": "I9002", + "ruleId": "I9003", "severity": "INFO", - "message": "'TTL' is ignored in this configuration (from extension)", + "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", "source": "ENGINE", - "entity": { - "logicalId": "LiteralNoValueAlias", - "entityType": "Resource", - "resourceType": "AWS::Route53::RecordSet" - }, - "propertyPath": "Properties.TTL", "category": "Best Practice", - "startLine": 65, - "startColumn": 7, - "endLine": 65, - "endColumn": 10, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53-recordset", - "ruleDescription": "Property is ignored in this configuration (from extension)", - "phase": "SCHEMA" - } - ] - }, - "good/sam/api_stagename_valid.yaml": { - "filePath": "good/sam/api_stagename_valid.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 1, - "debug": 0 + "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", + "phase": "LINT" }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'MyApi' of type 'AWS::Serverless::Api' supports Tags but none are configured", + "message": "Resource 'MyDB' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "MyApi", + "logicalId": "MyDB", "entityType": "Resource", - "resourceType": "AWS::Serverless::Api" + "resourceType": "AWS::RDS::DBInstance" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 5, + "startLine": 17, "startColumn": 5, - "endLine": 5, + "endLine": 17, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" - } - ] - }, - "good/sam/connector_valid.yaml": { - "filePath": "good/sam/connector_valid.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 3, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 2, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'MyTopic' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'myNewDb' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "MyTopic", + "logicalId": "myNewDb", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::RDS::DBInstance" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 10, + "startLine": 26, + "startColumn": 5, + "endLine": 26, + "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'MyFn' of type 'AWS::Serverless::Function' supports Tags but none are configured", + "message": "Resource 'myThirdDb' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "MyFn", + "logicalId": "myThirdDb", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::RDS::DBInstance" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 7, + "startLine": 35, "startColumn": 5, - "endLine": 7, + "endLine": 35, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" - } - ] - }, - "good/sam/function_deploymentpreference_with_alias.yaml": { - "filePath": "good/sam/function_deploymentpreference_with_alias.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 1, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Fn' of type 'AWS::Serverless::Function' supports Tags but none are configured", + "message": "Resource 'MyIAMUser' of type 'AWS::IAM::User' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Fn", + "logicalId": "MyIAMUser", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::IAM::User" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 5, + "startLine": 44, "startColumn": 5, - "endLine": 5, + "endLine": 44, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "good/sam/function_dlq_valid.yaml": { - "filePath": "good/sam/function_dlq_valid.yaml", + "good/resources/properties/string_size.yaml": { + "filePath": "good/resources/properties/string_size.yaml", "status": "OK", "metadata": { "resourcesScanned": 1, @@ -881,35 +751,35 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Fn' of type 'AWS::Serverless::Function' supports Tags but none are configured", + "message": "Resource 'myRepository' of type 'AWS::CodeCommit::Repository' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Fn", + "logicalId": "myRepository", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::CodeCommit::Repository" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 5, + "startLine": 6, "startColumn": 5, - "endLine": 5, + "endLine": 6, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "good/sam/function_image_valid.yaml": { - "filePath": "good/sam/function_image_valid.yaml", + "good/resources/properties/templated_code.yaml": { + "filePath": "good/resources/properties/templated_code.yaml", "status": "OK", "metadata": { - "resourcesScanned": 1, + "resourcesScanned": 2, "counts": { "fatal": 0, "errors": 0, "warnings": 0, - "informational": 1, + "informational": 2, "debug": 0 }, "suppressed": 0, @@ -918,68 +788,52 @@ }, "diagnostics": [ { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'Fn' of type 'AWS::Serverless::Function' supports Tags but none are configured", + "message": "Property 'ApiId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Fn", + "logicalId": "AppSyncSchema", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::AppSync::GraphQLSchema" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.ApiId", "category": "Best Practice", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "good/sam/function_provisioned_concurrency_with_alias.yaml": { - "filePath": "good/sam/function_provisioned_concurrency_with_alias.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 1, - "debug": 0 + "startLine": 10, + "startColumn": 7, + "endLine": 10, + "endColumn": 12, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'AppSync'" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Fn' of type 'AWS::Serverless::Function' supports Tags but none are configured", + "message": "Resource 'AppSync' of type 'AWS::AppSync::GraphQLApi' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Fn", + "logicalId": "AppSync", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::AppSync::GraphQLApi" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 5, + "startLine": 4, "startColumn": 5, - "endLine": 5, + "endLine": 4, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "good/sam/function_runtime_handler_via_globals.yaml": { - "filePath": "good/sam/function_runtime_handler_via_globals.yaml", + "good/resources/properties/templated_code_sam.yaml": { + "filePath": "good/resources/properties/templated_code_sam.yaml", "status": "OK", "metadata": { "resourcesScanned": 1, @@ -987,7 +841,7 @@ "fatal": 0, "errors": 0, "warnings": 0, - "informational": 1, + "informational": 3, "debug": 0 }, "suppressed": 0, @@ -996,92 +850,50 @@ }, "diagnostics": [ { - "ruleId": "I9040", + "ruleId": "I3011", "severity": "INFO", - "message": "Resource 'Fn' of type 'AWS::Serverless::Function' supports Tags but none are configured", - "source": "ENGINE", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "Fn", + "logicalId": "Function", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::Serverless::Application" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 9, - "startColumn": 5, - "endLine": 9, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 11, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" - } - ] - }, - "good/sam/function_url_config_valid.yaml": { - "filePath": "good/sam/function_url_config_valid.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 1, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "I9040", + "ruleId": "I3011", "severity": "INFO", - "message": "Resource 'Fn' of type 'AWS::Serverless::Function' supports Tags but none are configured", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "Fn", + "logicalId": "Function", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::Serverless::Application" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 11, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" - } - ] - }, - "good/sam/function_zip_valid.yaml": { - "filePath": "good/sam/function_zip_valid.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 1, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Fn' of type 'AWS::Serverless::Function' supports Tags but none are configured", + "message": "Resource 'Function' of type 'AWS::Serverless::Application' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Fn", + "logicalId": "Function", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::Serverless::Application" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", @@ -1095,16 +907,16 @@ } ] }, - "good/sam/globals_all_valid_sections.yaml": { - "filePath": "good/sam/globals_all_valid_sections.yaml", + "good/resources/rds/instance_sizes.yaml": { + "filePath": "good/resources/rds/instance_sizes.yaml", "status": "OK", "metadata": { - "resourcesScanned": 1, + "resourcesScanned": 6, "counts": { "fatal": 0, "errors": 0, - "warnings": 0, - "informational": 1, + "warnings": 4, + "informational": 30, "debug": 0 }, "suppressed": 0, @@ -1113,392 +925,244 @@ }, "diagnostics": [ { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Fn' of type 'AWS::Serverless::Function' supports Tags but none are configured", + "ruleId": "W9008", + "severity": "WARN", + "message": "RDS instance should have StorageEncrypted set to true", "source": "ENGINE", "entity": { - "logicalId": "Fn", + "logicalId": "DBInstance3", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 19, + "propertyPath": "Properties.StorageEncrypted", + "suggestedFix": "Set StorageEncrypted to true", + "category": "Security", + "startLine": 24, "startColumn": 5, - "endLine": 19, + "endLine": 24, "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "RDS instance should have StorageEncrypted", "phase": "LINT" - } - ] - }, - "good/sam/globals_empty.yaml": { - "filePath": "good/sam/globals_empty.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 1, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Fn' of type 'AWS::Serverless::Function' supports Tags but none are configured", + "ruleId": "W9008", + "severity": "WARN", + "message": "RDS instance should have StorageEncrypted set to true", "source": "ENGINE", "entity": { - "logicalId": "Fn", + "logicalId": "DBInstance4", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 6, + "propertyPath": "Properties.StorageEncrypted", + "suggestedFix": "Set StorageEncrypted to true", + "category": "Security", + "startLine": 31, "startColumn": 5, - "endLine": 6, + "endLine": 31, "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "RDS instance should have StorageEncrypted", "phase": "LINT" - } - ] - }, - "good/sam/implicit_alias_ref.yaml": { - "filePath": "good/sam/implicit_alias_ref.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 2, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 2, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'MyFn' of type 'AWS::Serverless::Function' supports Tags but none are configured", + "ruleId": "W9008", + "severity": "WARN", + "message": "RDS instance should have StorageEncrypted set to true", "source": "ENGINE", "entity": { - "logicalId": "MyFn", + "logicalId": "DBInstance5", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 5, + "propertyPath": "Properties.StorageEncrypted", + "suggestedFix": "Set StorageEncrypted to true", + "category": "Security", + "startLine": 38, "startColumn": 5, - "endLine": 5, + "endLine": 38, "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "RDS instance should have StorageEncrypted", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'AliasParam' of type 'AWS::SSM::Parameter' supports Tags but none are configured", + "ruleId": "W9008", + "severity": "WARN", + "message": "RDS instance should have StorageEncrypted set to true", "source": "ENGINE", "entity": { - "logicalId": "AliasParam", + "logicalId": "DBInstance6", "entityType": "Resource", - "resourceType": "AWS::SSM::Parameter" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 12, + "propertyPath": "Properties.StorageEncrypted", + "suggestedFix": "Set StorageEncrypted to true", + "category": "Security", + "startLine": 44, "startColumn": 5, - "endLine": 12, + "endLine": 44, "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "RDS instance should have StorageEncrypted", "phase": "LINT" - } - ] - }, - "good/sam/implicit_httpapi_ref.yaml": { - "filePath": "good/sam/implicit_httpapi_ref.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 3, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 3, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "I9040", + "ruleId": "I3011", "severity": "INFO", - "message": "Resource 'MyFn' of type 'AWS::Serverless::Function' supports Tags but none are configured", - "source": "ENGINE", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "MyFn", + "logicalId": "DBInstance1", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "startLine": 10, + "startColumn": 3, + "endLine": 10, + "endColumn": 14, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "I9040", + "ruleId": "I3011", "severity": "INFO", - "message": "Resource 'ApiIdParam' of type 'AWS::SSM::Parameter' supports Tags but none are configured", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "ApiIdParam", + "logicalId": "DBInstance1", "entityType": "Resource", - "resourceType": "AWS::SSM::Parameter" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 17, - "startColumn": 5, - "endLine": 17, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "startLine": 10, + "startColumn": 3, + "endLine": 10, + "endColumn": 14, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "I9040", + "ruleId": "I3011", "severity": "INFO", - "message": "Resource 'ApiSubParam' of type 'AWS::SSM::Parameter' supports Tags but none are configured", - "source": "ENGINE", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "ApiSubParam", + "logicalId": "DBInstance2", "entityType": "Resource", - "resourceType": "AWS::SSM::Parameter" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 22, - "startColumn": 5, - "endLine": 22, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "startLine": 16, + "startColumn": 3, + "endLine": 16, + "endColumn": 14, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" - } - ] - }, - "good/sam/implicit_restapi_stage_ref.yaml": { - "filePath": "good/sam/implicit_restapi_stage_ref.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 2, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 2, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "I9040", + "ruleId": "I3011", "severity": "INFO", - "message": "Resource 'MyFn' of type 'AWS::Serverless::Function' supports Tags but none are configured", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "MyFn", + "logicalId": "DBInstance2", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "startLine": 16, + "startColumn": 3, + "endLine": 16, + "endColumn": 14, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "I9040", + "ruleId": "I3011", "severity": "INFO", - "message": "Resource 'StageParam' of type 'AWS::SSM::Parameter' supports Tags but none are configured", - "source": "ENGINE", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "StageParam", + "logicalId": "DBInstance3", "entityType": "Resource", - "resourceType": "AWS::SSM::Parameter" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 17, - "startColumn": 5, - "endLine": 17, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "startLine": 22, + "startColumn": 3, + "endLine": 22, + "endColumn": 14, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" - } - ] - }, - "good/sam/implicit_role_getatt_dependson.yaml": { - "filePath": "good/sam/implicit_role_getatt_dependson.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 3, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 3, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "I9040", + "ruleId": "I3011", "severity": "INFO", - "message": "Resource 'MyFn' of type 'AWS::Serverless::Function' supports Tags but none are configured", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "MyFn", + "logicalId": "DBInstance3", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 6, - "startColumn": 5, - "endLine": 6, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "startLine": 22, + "startColumn": 3, + "endLine": 22, + "endColumn": 14, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "I9040", + "ruleId": "I3011", "severity": "INFO", - "message": "Resource 'RoleArnParam' of type 'AWS::SSM::Parameter' supports Tags but none are configured", - "source": "ENGINE", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "RoleArnParam", + "logicalId": "DBInstance4", "entityType": "Resource", - "resourceType": "AWS::SSM::Parameter" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 12, - "startColumn": 5, - "endLine": 12, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "startLine": 29, + "startColumn": 3, + "endLine": 29, + "endColumn": 14, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "I9040", + "ruleId": "I3011", "severity": "INFO", - "message": "Resource 'RoleRefParam' of type 'AWS::SSM::Parameter' supports Tags but none are configured", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "RoleRefParam", + "logicalId": "DBInstance4", "entityType": "Resource", - "resourceType": "AWS::SSM::Parameter" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 17, - "startColumn": 5, - "endLine": 17, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "startLine": 29, + "startColumn": 3, + "endLine": 29, + "endColumn": 14, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" - } - ] - }, - "good/sam/layerversion_valid_retention_and_arch.yaml": { - "filePath": "good/sam/layerversion_valid_retention_and_arch.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 0, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [] - }, - "good/sam/simpletable_no_primarykey.yaml": { - "filePath": "good/sam/simpletable_no_primarykey.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 3, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { "ruleId": "I3011", "severity": "INFO", "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "MyTable", + "logicalId": "DBInstance5", "entityType": "Resource", - "resourceType": "AWS::Serverless::SimpleTable" + "resourceType": "AWS::RDS::DBInstance" }, "category": "Best Practice", - "startLine": 3, + "startLine": 36, "startColumn": 3, - "endLine": 3, - "endColumn": 10, + "endLine": 36, + "endColumn": 14, "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, @@ -1508,400 +1172,314 @@ "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "MyTable", + "logicalId": "DBInstance5", "entityType": "Resource", - "resourceType": "AWS::Serverless::SimpleTable" + "resourceType": "AWS::RDS::DBInstance" }, "category": "Best Practice", - "startLine": 3, + "startLine": 36, "startColumn": 3, - "endLine": 3, - "endColumn": 10, + "endLine": 36, + "endColumn": 14, "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "I9040", + "ruleId": "I3011", "severity": "INFO", - "message": "Resource 'MyTable' of type 'AWS::Serverless::SimpleTable' supports Tags but none are configured", - "source": "ENGINE", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "MyTable", + "logicalId": "DBInstance6", "entityType": "Resource", - "resourceType": "AWS::Serverless::SimpleTable" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "startLine": 42, + "startColumn": 3, + "endLine": 42, + "endColumn": 14, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" - } - ] - }, - "good/sam/simpletable_valid.yaml": { - "filePath": "good/sam/simpletable_valid.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 3, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { "ruleId": "I3011", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "MyTable", + "logicalId": "DBInstance6", "entityType": "Resource", - "resourceType": "AWS::Serverless::SimpleTable" + "resourceType": "AWS::RDS::DBInstance" }, "category": "Best Practice", - "startLine": 3, + "startLine": 42, "startColumn": 3, - "endLine": 3, - "endColumn": 10, + "endLine": 42, + "endColumn": 14, "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "I3011", + "ruleId": "I3013", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", "source": "CFN_LINT", "entity": { - "logicalId": "MyTable", + "logicalId": "DBInstance3", "entityType": "Resource", - "resourceType": "AWS::Serverless::SimpleTable" + "resourceType": "AWS::RDS::DBInstance" }, + "propertyPath": "Properties", "category": "Best Practice", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 10, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "startLine": 24, + "startColumn": 5, + "endLine": 24, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", "phase": "LINT" }, { - "ruleId": "I9040", + "ruleId": "I3013", "severity": "INFO", - "message": "Resource 'MyTable' of type 'AWS::Serverless::SimpleTable' supports Tags but none are configured", - "source": "ENGINE", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "MyTable", + "logicalId": "DBInstance4", "entityType": "Resource", - "resourceType": "AWS::Serverless::SimpleTable" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties", "category": "Best Practice", - "startLine": 5, + "startLine": 31, "startColumn": 5, - "endLine": 5, + "endLine": 31, "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check resources with auto expiring content have explicit retention period", "phase": "LINT" - } - ] - }, - "good/sam/statemachine_definition_only.yaml": { - "filePath": "good/sam/statemachine_definition_only.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 1, - "informational": 1, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "W9013", - "severity": "WARN", - "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", - "source": "ENGINE", + "ruleId": "I3013", + "severity": "INFO", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "MySM", + "logicalId": "DBInstance5", "entityType": "Resource", - "resourceType": "AWS::Serverless::StateMachine" + "resourceType": "AWS::RDS::DBInstance" }, - "category": "Security", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 7, - "ruleDescription": "Hardcoded account ID in ARN", + "propertyPath": "Properties", + "category": "Best Practice", + "startLine": 38, + "startColumn": 5, + "endLine": 38, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", "phase": "LINT" }, { - "ruleId": "I9040", + "ruleId": "I3013", "severity": "INFO", - "message": "Resource 'MySM' of type 'AWS::Serverless::StateMachine' supports Tags but none are configured", - "source": "ENGINE", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "MySM", + "logicalId": "DBInstance6", "entityType": "Resource", - "resourceType": "AWS::Serverless::StateMachine" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties", "category": "Best Practice", - "startLine": 5, + "startLine": 44, "startColumn": 5, - "endLine": 5, + "endLine": 44, "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check resources with auto expiring content have explicit retention period", "phase": "LINT" - } - ] - }, - "good/schema_required_xor_resource_condition.yaml": { - "filePath": "good/schema_required_xor_resource_condition.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 1, - "informational": 5, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "W1028", - "severity": "WARN", - "message": "['Fn::If', 1] is not reachable. When setting condition 'DuplicateTarget' to True", + "ruleId": "I3100", + "severity": "INFO", + "message": "Previous generation instance type 'db.m3.medium' - consider upgrading", "source": "CFN_LINT", "entity": { - "logicalId": "Policy", + "logicalId": "DBInstance6", "entityType": "Resource", - "resourceType": "AWS::ApplicationAutoScaling::ScalingPolicy" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.ResourceId.Fn::If.1", + "propertyPath": "Properties.DBInstanceClass", + "suggestedFix": "Upgrade to a current generation instance type", "category": "Best Practice", - "startLine": 19, - "startColumn": 46, - "endLine": 19, - "endColumn": 47, - "ruleDescription": "Check Fn::If has a path that cannot be reached", + "startLine": 45, + "startColumn": 7, + "endLine": 45, + "endColumn": 22, + "ruleDescription": "Checks for legacy instance type generations", "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'PolicyName' is create-only; updating it will cause resource replacement", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Policy", + "logicalId": "DBInstance1", "entityType": "Resource", - "resourceType": "AWS::ApplicationAutoScaling::ScalingPolicy" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.PolicyName", + "propertyPath": "Properties.Engine", "category": "Best Practice", - "startLine": 16, + "startLine": 14, "startColumn": 7, - "endLine": 16, - "endColumn": 17, + "endLine": 14, + "endColumn": 13, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only", + "resolutionSource": "Fn::If on condition 'snapshot'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ScalingTargetId' is create-only; updating it will cause resource replacement", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Policy", + "logicalId": "DBInstance2", "entityType": "Resource", - "resourceType": "AWS::ApplicationAutoScaling::ScalingPolicy" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.ScalingTargetId", + "propertyPath": "Properties.Engine", "category": "Best Practice", - "startLine": 18, + "startLine": 20, "startColumn": 7, - "endLine": 18, - "endColumn": 22, + "endLine": 20, + "endColumn": 13, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter 'TargetId' (type String)" + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ResourceId' is create-only; updating it will cause resource replacement", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Policy", + "logicalId": "DBInstance3", "entityType": "Resource", - "resourceType": "AWS::ApplicationAutoScaling::ScalingPolicy" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.ResourceId", + "propertyPath": "Properties.Engine", "category": "Best Practice", - "startLine": 19, + "startLine": 26, "startColumn": 7, - "endLine": 19, - "endColumn": 17, + "endLine": 26, + "endColumn": 13, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Fn::If on condition 'DuplicateTarget'" + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ScalableDimension' is create-only; updating it will cause resource replacement", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Policy", + "logicalId": "DBInstance4", "entityType": "Resource", - "resourceType": "AWS::ApplicationAutoScaling::ScalingPolicy" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.ScalableDimension", + "propertyPath": "Properties.Engine", "category": "Best Practice", - "startLine": 20, + "startLine": 33, "startColumn": 7, - "endLine": 20, - "endColumn": 24, + "endLine": 33, + "endColumn": 13, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ServiceNamespace' is create-only; updating it will cause resource replacement", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Policy", + "logicalId": "DBInstance5", "entityType": "Resource", - "resourceType": "AWS::ApplicationAutoScaling::ScalingPolicy" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.ServiceNamespace", + "propertyPath": "Properties.Engine", "category": "Best Practice", - "startLine": 21, + "startLine": 40, "startColumn": 7, - "endLine": 21, - "endColumn": 23, + "endLine": 40, + "endColumn": 13, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } - } - ] - }, - "good/schema_resource.yaml": { - "filePath": "good/schema_resource.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 0, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [] - }, - "good/schema_valid_resources.yaml": { - "filePath": "good/schema_valid_resources.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 2, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 3, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Bucket", + "logicalId": "DBInstance6", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.BucketName", + "propertyPath": "Properties.Engine", "category": "Best Practice", - "startLine": 6, + "startLine": 46, "startColumn": 7, - "endLine": 6, - "endColumn": 17, + "endLine": 46, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } }, + { + "ruleId": "I9003", + "severity": "INFO", + "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", + "source": "ENGINE", + "category": "Best Practice", + "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", + "phase": "LINT" + }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Resource 'DBInstance1' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Bucket", + "logicalId": "DBInstance1", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::RDS::DBInstance" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 5, + "startLine": 12, "startColumn": 5, - "endLine": 5, + "endLine": 12, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -1909,219 +1487,203 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Role' of type 'AWS::IAM::Role' supports Tags but none are configured", + "message": "Resource 'DBInstance2' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Role", + "logicalId": "DBInstance2", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::RDS::DBInstance" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 9, + "startLine": 18, "startColumn": 5, - "endLine": 9, + "endLine": 18, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" - } - ] - }, - "good/sg_icmpv6_type_code.yaml": { - "filePath": "good/sg_icmpv6_type_code.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 5, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 18, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Resource 'DBInstance3' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Vpc", + "logicalId": "DBInstance3", "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 10, - "startColumn": 7, - "endLine": 10, - "endColumn": 16, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 24, + "startColumn": 5, + "endLine": 24, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", + "message": "Resource 'DBInstance4' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "SecurityGroup", + "logicalId": "DBInstance4", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.GroupDescription", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 14, - "startColumn": 7, - "endLine": 14, - "endColumn": 23, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "SecurityGroup", - "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" - }, - "propertyPath": "Properties.VpcId", - "category": "Best Practice", - "startLine": 15, - "startColumn": 7, - "endLine": 15, - "endColumn": 12, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'Vpc'" - } + "startLine": 31, + "startColumn": 5, + "endLine": 31, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'GroupId' is create-only; updating it will cause resource replacement", + "message": "Resource 'DBInstance5' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "StandaloneIngressIcmpv6", + "logicalId": "DBInstance5", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.GroupId", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 53, - "startColumn": 7, - "endLine": 53, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'SecurityGroup'" - } + "startLine": 38, + "startColumn": 5, + "endLine": 38, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'IpProtocol' is create-only; updating it will cause resource replacement", + "message": "Resource 'DBInstance6' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "StandaloneIngressIcmpv6", + "logicalId": "DBInstance6", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.IpProtocol", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 54, - "startColumn": 7, - "endLine": 54, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 44, + "startColumn": 5, + "endLine": 44, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "good/resources/rds/not_enum_master_username_parameter.yaml": { + "filePath": "good/resources/rds/not_enum_master_username_parameter.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 2, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'FromPort' is create-only; updating it will cause resource replacement", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "StandaloneIngressIcmpv6", + "logicalId": "ParameterUsername", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" + "resourceType": "AWS::RDS::DBCluster" }, - "propertyPath": "Properties.FromPort", + "propertyPath": "Properties.Engine", "category": "Best Practice", - "startLine": 55, + "startLine": 12, "startColumn": 7, - "endLine": 55, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 12, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ToPort' is create-only; updating it will cause resource replacement", + "message": "Property 'MasterUsername' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "StandaloneIngressIcmpv6", + "logicalId": "ParameterUsername", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" + "resourceType": "AWS::RDS::DBCluster" }, - "propertyPath": "Properties.ToPort", + "propertyPath": "Properties.MasterUsername", "category": "Best Practice", - "startLine": 56, + "startLine": 13, "startColumn": 7, - "endLine": 56, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 13, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } + } + ] + }, + "good/resources/s3/access-control-obsolete.yaml": { + "filePath": "good/resources/s3/access-control-obsolete.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 3, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 4, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'CidrIpv6' is create-only; updating it will cause resource replacement", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "StandaloneIngressIcmpv6", + "logicalId": "Bucket2", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.CidrIpv6", + "propertyPath": "Properties.BucketName", "category": "Best Practice", - "startLine": 57, + "startLine": 9, "startColumn": 7, - "endLine": 57, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 9, + "endColumn": 17, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -2131,90 +1693,167 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'GroupId' is create-only; updating it will cause resource replacement", + "message": "Property 'Bucket' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "StandaloneEgressIcmpv6", + "logicalId": "BucketPolicy", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupEgress" + "resourceType": "AWS::S3::BucketPolicy" }, - "propertyPath": "Properties.GroupId", + "propertyPath": "Properties.Bucket", "category": "Best Practice", - "startLine": 61, + "startLine": 13, "startColumn": 7, - "endLine": 61, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 13, + "endColumn": 13, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "Ref to 'SecurityGroup'" + "resolutionSource": "Ref to 'Bucket2'" } }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'IpProtocol' is create-only; updating it will cause resource replacement", + "message": "Resource 'Bucket1' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "StandaloneEgressIcmpv6", + "logicalId": "Bucket1", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupEgress" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.IpProtocol", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 62, - "startColumn": 7, - "endLine": 62, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'FromPort' is create-only; updating it will cause resource replacement", + "message": "Resource 'Bucket2' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "StandaloneEgressIcmpv6", + "logicalId": "Bucket2", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupEgress" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.FromPort", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 63, - "startColumn": 7, - "endLine": 63, + "startLine": 8, + "startColumn": 5, + "endLine": 8, "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "good/resources/update_policy_supported.yaml": { + "filePath": "good/resources/update_policy_supported.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 5, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 2, + "informational": 9, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ToPort' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W2531", + "severity": "WARN", + "message": "Runtime 'python3.9' was deprecated on '2025-12-15'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'python3.14'", + "source": "CFN_LINT", "entity": { - "logicalId": "StandaloneEgressIcmpv6", + "logicalId": "MyFunction", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupEgress" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.ToPort", - "category": "Best Practice", - "startLine": 64, + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 30, "startColumn": 7, - "endLine": 64, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 30, + "endColumn": 14, + "ruleDescription": "Check if EOL Lambda Function Runtimes are used", + "phase": "SCHEMA", + "context": { + "actualValue": "python3.9", + "lifecycle": "deprecated" + } + }, + { + "ruleId": "W3697", + "severity": "WARN", + "message": "Resource type 'AWS::AutoScaling::LaunchConfiguration' is from a service in maintenance mode since 2024-10-01. Consider migrating to an alternative", + "source": "CFN_LINT", + "entity": { + "logicalId": "LaunchConfig", + "entityType": "Resource", + "resourceType": "AWS::AutoScaling::LaunchConfiguration" + }, + "category": "Deprecation", + "startLine": 12, + "startColumn": 3, + "endLine": 12, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", + "ruleDescription": "Resource type is from a service in maintenance mode", + "phase": "SCHEMA" + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'LaunchConfigurationName' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "MyASG", + "entityType": "Resource", + "resourceType": "AWS::AutoScaling::AutoScalingGroup" + }, + "propertyPath": "Properties.LaunchConfigurationName", + "category": "Best Practice", + "startLine": 11, + "startColumn": 7, + "endLine": 11, + "endColumn": 30, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only", + "resolutionSource": "Ref to 'LaunchConfig'" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "LaunchConfig", + "entityType": "Resource", + "resourceType": "AWS::AutoScaling::LaunchConfiguration" + }, + "propertyPath": "Properties.ImageId", + "category": "Best Practice", + "startLine": 15, + "startColumn": 7, + "endLine": 15, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -2224,20 +1863,20 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'CidrIpv6' is create-only; updating it will cause resource replacement", + "message": "Property 'InstanceType' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "StandaloneEgressIcmpv6", + "logicalId": "LaunchConfig", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupEgress" + "resourceType": "AWS::AutoScaling::LaunchConfiguration" }, - "propertyPath": "Properties.CidrIpv6", + "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 65, + "startLine": 16, "startColumn": 7, - "endLine": 65, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 16, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -2247,44 +1886,44 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'GroupId' is create-only; updating it will cause resource replacement", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "StandaloneEgressIcmpv6WithoutTypeCode", + "logicalId": "MyAlias", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupEgress" + "resourceType": "AWS::Lambda::Alias" }, - "propertyPath": "Properties.GroupId", + "propertyPath": "Properties.FunctionName", "category": "Best Practice", - "startLine": 69, + "startLine": 23, "startColumn": 7, - "endLine": 69, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 23, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-lambda", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "Ref to 'SecurityGroup'" + "resolutionSource": "Ref to 'MyFunction'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'IpProtocol' is create-only; updating it will cause resource replacement", + "message": "Property 'Name' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "StandaloneEgressIcmpv6WithoutTypeCode", + "logicalId": "MyAlias", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupEgress" + "resourceType": "AWS::Lambda::Alias" }, - "propertyPath": "Properties.IpProtocol", + "propertyPath": "Properties.Name", "category": "Best Practice", - "startLine": 70, + "startLine": 25, "startColumn": 7, - "endLine": 70, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 25, + "endColumn": 11, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-lambda", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -2294,20 +1933,19 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'CidrIpv6' is create-only; updating it will cause resource replacement", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "StandaloneEgressIcmpv6WithoutTypeCode", + "logicalId": "MyFunction", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupEgress" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.CidrIpv6", + "propertyPath": "Properties.FunctionName", "category": "Best Practice", - "startLine": 71, + "startLine": 29, "startColumn": 7, - "endLine": 71, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 29, + "endColumn": 19, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -2317,19 +1955,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Vpc' of type 'AWS::EC2::VPC' supports Tags but none are configured", + "message": "Resource 'MyASG' of type 'AWS::AutoScaling::AutoScalingGroup' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Vpc", + "logicalId": "MyASG", "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" + "resourceType": "AWS::AutoScaling::AutoScalingGroup" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 9, + "startLine": 8, "startColumn": 5, - "endLine": 9, + "endLine": 8, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -2337,34 +1975,54 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'SecurityGroup' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", + "message": "Resource 'MyFunction' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "SecurityGroup", + "logicalId": "MyFunction", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::Lambda::Function" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 13, + "startLine": 28, "startColumn": 5, - "endLine": 13, + "endLine": 28, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'FunctionRole' of type 'AWS::IAM::Role' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "FunctionRole", + "entityType": "Resource", + "resourceType": "AWS::IAM::Role" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 39, + "startColumn": 5, + "endLine": 39, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "good/simple_sub_prefix.yaml": { - "filePath": "good/simple_sub_prefix.yaml", + "good/resources_codepipeline.yaml": { + "filePath": "good/resources_codepipeline.yaml", "status": "OK", "metadata": { "resourcesScanned": 1, "counts": { "fatal": 0, "errors": 0, - "warnings": 0, + "warnings": 1, "informational": 2, "debug": 0 }, @@ -2373,61 +2031,80 @@ "severityLevel": "DEBUG" }, "diagnostics": [ + { + "ruleId": "W9002", + "severity": "WARN", + "message": "Property 'RoleArn' has a hardcoded ARN - use Ref, GetAtt, or a parameter instead", + "source": "ENGINE", + "entity": { + "logicalId": "TestPipeline", + "entityType": "Resource", + "resourceType": "AWS::CodePipeline::Pipeline" + }, + "propertyPath": "Properties.RoleArn", + "category": "Best Practice", + "startLine": 12, + "startColumn": 7, + "endLine": 12, + "endColumn": 14, + "ruleDescription": "Hardcoded ARN property", + "phase": "LINT" + }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", + "message": "Property 'Name' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Bucket", + "logicalId": "TestPipeline", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::CodePipeline::Pipeline" }, - "propertyPath": "Properties.BucketName", + "propertyPath": "Properties.Name", "category": "Best Practice", - "startLine": 9, + "startLine": 8, "startColumn": 7, - "endLine": 9, - "endColumn": 17, + "endLine": 8, + "endColumn": 11, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-codepipeline", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "dynamic (Sub:prefix-${Env})" + "lifecycle": "create-only" } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Resource 'TestPipeline' of type 'AWS::CodePipeline::Pipeline' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Bucket", + "logicalId": "TestPipeline", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::CodePipeline::Pipeline" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 8, + "startLine": 7, "startColumn": 5, - "endLine": 8, + "endLine": 7, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "good/some_logs_stream_lambda.yaml": { - "filePath": "good/some_logs_stream_lambda.yaml", + "good/resources_cognito_userpool_tag_is_string_map.yaml": { + "filePath": "good/resources_cognito_userpool_tag_is_string_map.yaml", "status": "OK", "metadata": { - "resourcesScanned": 8, + "resourcesScanned": 1, "counts": { "fatal": 0, - "errors": 4, + "errors": 0, "warnings": 0, - "informational": 20, + "informational": 2, "debug": 0 }, "suppressed": 0, @@ -2436,509 +2113,505 @@ }, "diagnostics": [ { - "ruleId": "E2533", - "severity": "ERROR", - "message": "Runtime 'python3.6' was deprecated on '2022-07-18'. Creation was disabled on '2022-07-18', and updates were disabled on '2022-08-29'. Please consider updating to 'python3.14'", + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "FunctionA", + "logicalId": "MyCognitoUserPool", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::Cognito::UserPool" }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 21, - "startColumn": 7, - "endLine": 21, - "endColumn": 14, - "ruleDescription": "Check if Lambda Function Runtimes are updatable", - "phase": "SCHEMA", - "context": { - "actualValue": "python3.6", - "lifecycle": "end-of-life" - } + "category": "Best Practice", + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 20, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "E2533", - "severity": "ERROR", - "message": "Runtime 'python3.6' was deprecated on '2022-07-18'. Creation was disabled on '2022-07-18', and updates were disabled on '2022-08-29'. Please consider updating to 'python3.14'", + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "FunctionB", + "logicalId": "MyCognitoUserPool", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::Cognito::UserPool" }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 33, - "startColumn": 7, - "endLine": 33, - "endColumn": 14, - "ruleDescription": "Check if Lambda Function Runtimes are updatable", - "phase": "SCHEMA", - "context": { - "actualValue": "python3.6", - "lifecycle": "end-of-life" - } + "category": "Best Practice", + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 20, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + } + ] + }, + "good/resources_deletionpolicy.yaml": { + "filePath": "good/resources_deletionpolicy.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 3, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 1, + "informational": 5, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "E2533", - "severity": "ERROR", - "message": "Runtime 'python3.6' was deprecated on '2022-07-18'. Creation was disabled on '2022-07-18', and updates were disabled on '2022-08-29'. Please consider updating to 'python3.14'", - "source": "CFN_LINT", + "ruleId": "W9008", + "severity": "WARN", + "message": "RDS instance should have StorageEncrypted set to true", + "source": "ENGINE", "entity": { - "logicalId": "FunctionC", + "logicalId": "PolicyList", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 44, - "startColumn": 7, - "endLine": 44, - "endColumn": 14, - "ruleDescription": "Check if Lambda Function Runtimes are updatable", - "phase": "SCHEMA", - "context": { - "actualValue": "python3.6", - "lifecycle": "end-of-life" - } + "propertyPath": "Properties.StorageEncrypted", + "suggestedFix": "Set StorageEncrypted to true", + "category": "Security", + "startLine": 28, + "startColumn": 5, + "endLine": 28, + "endColumn": 15, + "ruleDescription": "RDS instance should have StorageEncrypted", + "phase": "LINT" }, { - "ruleId": "E2533", - "severity": "ERROR", - "message": "Runtime 'python3.6' was deprecated on '2022-07-18'. Creation was disabled on '2022-07-18', and updates were disabled on '2022-08-29'. Please consider updating to 'python3.14'", + "ruleId": "I3013", + "severity": "INFO", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", "source": "CFN_LINT", "entity": { - "logicalId": "LogSubscriptionFunction", + "logicalId": "PolicyList", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 56, - "startColumn": 7, - "endLine": 56, - "endColumn": 14, - "ruleDescription": "Check if Lambda Function Runtimes are updatable", - "phase": "SCHEMA", - "context": { - "actualValue": "python3.6", - "lifecycle": "end-of-life" - } + "propertyPath": "Properties", + "category": "Best Practice", + "startLine": 28, + "startColumn": 5, + "endLine": 28, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "phase": "LINT" }, { - "ruleId": "I3011", + "ruleId": "I3100", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "message": "Previous generation instance type 'db.m1.small' - consider upgrading", "source": "CFN_LINT", "entity": { - "logicalId": "FunctionALogGroup", + "logicalId": "PolicyList", "entityType": "Resource", - "resourceType": "AWS::Logs::LogGroup" + "resourceType": "AWS::RDS::DBInstance" }, + "propertyPath": "Properties.DBInstanceClass", + "suggestedFix": "Upgrade to a current generation instance type", "category": "Best Practice", - "startLine": 22, - "startColumn": 3, - "endLine": 22, - "endColumn": 20, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "startLine": 30, + "startColumn": 7, + "endLine": 30, + "endColumn": 22, + "ruleDescription": "Checks for legacy instance type generations", "phase": "LINT" }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "FunctionALogGroup", + "logicalId": "PolicyList", "entityType": "Resource", - "resourceType": "AWS::Logs::LogGroup" + "resourceType": "AWS::RDS::DBInstance" }, + "propertyPath": "Properties.Engine", "category": "Best Practice", - "startLine": 22, - "startColumn": 3, - "endLine": 22, - "endColumn": 20, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 31, + "startColumn": 7, + "endLine": 31, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9003", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "FunctionBLogGroup", - "entityType": "Resource", - "resourceType": "AWS::Logs::LogGroup" - }, + "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", + "source": "ENGINE", "category": "Best Practice", - "startLine": 34, - "startColumn": 3, - "endLine": 34, - "endColumn": 20, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", "phase": "LINT" }, { - "ruleId": "I3011", + "ruleId": "I9040", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Resource 'PolicyList' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "FunctionBLogGroup", + "logicalId": "PolicyList", "entityType": "Resource", - "resourceType": "AWS::Logs::LogGroup" + "resourceType": "AWS::RDS::DBInstance" }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 34, - "startColumn": 3, - "endLine": 34, - "endColumn": 20, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "startLine": 28, + "startColumn": 5, + "endLine": 28, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "good/resources_updatereplacepolicy.yaml": { + "filePath": "good/resources_updatereplacepolicy.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 3, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 1, + "informational": 5, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "ruleId": "W9008", + "severity": "WARN", + "message": "RDS instance should have StorageEncrypted set to true", + "source": "ENGINE", "entity": { - "logicalId": "FunctionCLogGroup", + "logicalId": "PolicyList", "entityType": "Resource", - "resourceType": "AWS::Logs::LogGroup" + "resourceType": "AWS::RDS::DBInstance" }, - "category": "Best Practice", - "startLine": 45, - "startColumn": 3, - "endLine": 45, - "endColumn": 20, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "propertyPath": "Properties.StorageEncrypted", + "suggestedFix": "Set StorageEncrypted to true", + "category": "Security", + "startLine": 28, + "startColumn": 5, + "endLine": 28, + "endColumn": 15, + "ruleDescription": "RDS instance should have StorageEncrypted", "phase": "LINT" }, { - "ruleId": "I3011", + "ruleId": "I3013", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", "source": "CFN_LINT", "entity": { - "logicalId": "FunctionCLogGroup", + "logicalId": "PolicyList", "entityType": "Resource", - "resourceType": "AWS::Logs::LogGroup" + "resourceType": "AWS::RDS::DBInstance" }, + "propertyPath": "Properties", "category": "Best Practice", - "startLine": 45, - "startColumn": 3, - "endLine": 45, - "endColumn": 20, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "startLine": 28, + "startColumn": 5, + "endLine": 28, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", "phase": "LINT" }, { - "ruleId": "I3011", + "ruleId": "I3100", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "message": "Previous generation instance type 'db.m1.small' - consider upgrading", "source": "CFN_LINT", "entity": { - "logicalId": "LogSubscriptionFunctionLogGroup", + "logicalId": "PolicyList", "entityType": "Resource", - "resourceType": "AWS::Logs::LogGroup" + "resourceType": "AWS::RDS::DBInstance" }, + "propertyPath": "Properties.DBInstanceClass", + "suggestedFix": "Upgrade to a current generation instance type", "category": "Best Practice", - "startLine": 73, - "startColumn": 3, - "endLine": 73, - "endColumn": 34, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "startLine": 30, + "startColumn": 7, + "endLine": 30, + "endColumn": 22, + "ruleDescription": "Checks for legacy instance type generations", "phase": "LINT" }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "LogSubscriptionFunctionLogGroup", + "logicalId": "PolicyList", "entityType": "Resource", - "resourceType": "AWS::Logs::LogGroup" + "resourceType": "AWS::RDS::DBInstance" }, + "propertyPath": "Properties.Engine", "category": "Best Practice", - "startLine": 73, - "startColumn": 3, - "endLine": 73, - "endColumn": 34, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "startLine": 31, + "startColumn": 7, + "endLine": 31, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } + }, + { + "ruleId": "I9003", + "severity": "INFO", + "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", + "source": "ENGINE", + "category": "Best Practice", + "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'LogGroupName' is create-only; updating it will cause resource replacement", + "message": "Resource 'PolicyList' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "FunctionALogGroup", + "logicalId": "PolicyList", "entityType": "Resource", - "resourceType": "AWS::Logs::LogGroup" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.LogGroupName", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 25, - "startColumn": 7, - "endLine": 25, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-logs.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "dynamic (Sub:/aws/lambda/${FunctionA})" - } + "startLine": 28, + "startColumn": 5, + "endLine": 28, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "good/route53_conditional_record_arrays.yaml": { + "filePath": "good/route53_conditional_record_arrays.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 6, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 2, + "informational": 6, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "W1028", + "severity": "WARN", + "message": "['Fn::If', 2] is not reachable. When setting condition 'ChooseFirst' to False from current status True", + "source": "CFN_LINT", + "entity": { + "logicalId": "StandaloneUnreachableInvalid", + "entityType": "Resource", + "resourceType": "AWS::Route53::RecordSet" + }, + "propertyPath": "Properties.ResourceRecords.Fn::If.2", + "category": "Best Practice", + "startLine": 32, + "startColumn": 11, + "endLine": 32, + "endColumn": 12, + "ruleDescription": "Check Fn::If has a path that cannot be reached", + "phase": "LINT" + }, + { + "ruleId": "W1028", + "severity": "WARN", + "message": "['Fn::If', 2] is not reachable. When setting condition 'ChooseFirst' to False from current status True", + "source": "CFN_LINT", + "entity": { + "logicalId": "GroupUnreachableInvalid", + "entityType": "Resource", + "resourceType": "AWS::Route53::RecordSetGroup" + }, + "propertyPath": "Properties.RecordSets.Fn::If.2", + "category": "Best Practice", + "startLine": 58, + "startColumn": 11, + "endLine": 58, + "endColumn": 12, + "ruleDescription": "Check Fn::If has a path that cannot be reached", + "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'LogGroupName' is create-only; updating it will cause resource replacement", + "message": "Property 'HostedZoneName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FunctionBLogGroup", + "logicalId": "StandaloneBothBranchesValid", "entityType": "Resource", - "resourceType": "AWS::Logs::LogGroup" + "resourceType": "AWS::Route53::RecordSet" }, - "propertyPath": "Properties.LogGroupName", + "propertyPath": "Properties.HostedZoneName", "category": "Best Practice", - "startLine": 37, + "startLine": 13, "startColumn": 7, - "endLine": 37, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-logs.git", + "endLine": 13, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53-recordset", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "dynamic (Sub:/aws/lambda/${FunctionB})" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'LogGroupName' is create-only; updating it will cause resource replacement", + "message": "Property 'HostedZoneName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FunctionCLogGroup", + "logicalId": "StandaloneUnreachableInvalid", "entityType": "Resource", - "resourceType": "AWS::Logs::LogGroup" + "resourceType": "AWS::Route53::RecordSet" }, - "propertyPath": "Properties.LogGroupName", + "propertyPath": "Properties.HostedZoneName", "category": "Best Practice", - "startLine": 48, + "startLine": 25, "startColumn": 7, - "endLine": 48, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-logs.git", + "endLine": 25, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53-recordset", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "dynamic (Sub:/aws/lambda/${FunctionC})" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'LogGroupName' is create-only; updating it will cause resource replacement", + "message": "Property 'HostedZoneName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "LogSubscriptionFunctionLogGroup", + "logicalId": "GroupBothBranchesValid", "entityType": "Resource", - "resourceType": "AWS::Logs::LogGroup" + "resourceType": "AWS::Route53::RecordSetGroup" }, - "propertyPath": "Properties.LogGroupName", + "propertyPath": "Properties.HostedZoneName", "category": "Best Practice", - "startLine": 76, + "startLine": 36, "startColumn": 7, - "endLine": 76, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-logs.git", + "endLine": 36, + "endColumn": 21, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "dynamic (Sub:/aws/lambda/${LogSubscriptionFunction})" + "lifecycle": "create-only" } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'FunctionA' of type 'AWS::Serverless::Function' supports Tags but none are configured", + "message": "Property 'HostedZoneName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FunctionA", + "logicalId": "GroupUnreachableInvalid", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::Route53::RecordSetGroup" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.HostedZoneName", "category": "Best Practice", - "startLine": 18, - "startColumn": 5, - "endLine": 18, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 51, + "startColumn": 7, + "endLine": 51, + "endColumn": 21, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'FunctionALogGroup' of type 'AWS::Logs::LogGroup' supports Tags but none are configured", + "message": "Property 'HostedZoneName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FunctionALogGroup", + "logicalId": "StandaloneMutuallyExclusiveCnameItems", "entityType": "Resource", - "resourceType": "AWS::Logs::LogGroup" + "resourceType": "AWS::Route53::RecordSet" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.HostedZoneName", "category": "Best Practice", - "startLine": 24, - "startColumn": 5, - "endLine": 24, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 65, + "startColumn": 7, + "endLine": 65, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53-recordset", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'FunctionB' of type 'AWS::Serverless::Function' supports Tags but none are configured", + "message": "Property 'HostedZoneName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FunctionB", + "logicalId": "GroupMutuallyExclusiveCnameItems", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::Route53::RecordSetGroup" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 30, - "startColumn": 5, - "endLine": 30, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'FunctionBLogGroup' of type 'AWS::Logs::LogGroup' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "FunctionBLogGroup", - "entityType": "Resource", - "resourceType": "AWS::Logs::LogGroup" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 36, - "startColumn": 5, - "endLine": 36, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'FunctionC' of type 'AWS::Serverless::Function' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "FunctionC", - "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 41, - "startColumn": 5, - "endLine": 41, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'FunctionCLogGroup' of type 'AWS::Logs::LogGroup' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "FunctionCLogGroup", - "entityType": "Resource", - "resourceType": "AWS::Logs::LogGroup" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 47, - "startColumn": 5, - "endLine": 47, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'LogSubscriptionFunction' of type 'AWS::Serverless::Function' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "LogSubscriptionFunction", - "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 53, - "startColumn": 5, - "endLine": 53, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'LogSubscriptionFunctionLogGroup' of type 'AWS::Logs::LogGroup' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "LogSubscriptionFunctionLogGroup", - "entityType": "Resource", - "resourceType": "AWS::Logs::LogGroup" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.HostedZoneName", "category": "Best Practice", "startLine": 75, - "startColumn": 5, + "startColumn": 7, "endLine": 75, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "endColumn": 21, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } } ] }, - "good/sqs_fifo_valid.yaml": { - "filePath": "good/sqs_fifo_valid.yaml", + "good/route53_conditional_record_items.yaml": { + "filePath": "good/route53_conditional_record_items.yaml", "status": "OK", "metadata": { - "resourcesScanned": 1, + "resourcesScanned": 2, "counts": { "fatal": 0, "errors": 0, "warnings": 0, - "informational": 6, + "informational": 2, "debug": 0 }, "suppressed": 0, @@ -2946,78 +2619,23 @@ "severityLevel": "DEBUG" }, "diagnostics": [ - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "FifoQueue", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "category": "Best Practice", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 12, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "FifoQueue", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "category": "Best Practice", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 12, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I3013", - "severity": "INFO", - "message": "'MessageRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "FifoQueue", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "propertyPath": "Properties", - "category": "Best Practice", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", - "phase": "LINT" - }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'QueueName' is create-only; updating it will cause resource replacement", + "message": "Property 'HostedZoneName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FifoQueue", + "logicalId": "Standalone", "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" + "resourceType": "AWS::Route53::RecordSet" }, - "propertyPath": "Properties.QueueName", + "propertyPath": "Properties.HostedZoneName", "category": "Best Practice", - "startLine": 6, + "startLine": 12, "startColumn": 7, - "endLine": 6, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sqs.git", + "endLine": 12, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53-recordset", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -3027,58 +2645,37 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'FifoQueue' is create-only; updating it will cause resource replacement", + "message": "Property 'HostedZoneName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FifoQueue", + "logicalId": "Group", "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" + "resourceType": "AWS::Route53::RecordSetGroup" }, - "propertyPath": "Properties.FifoQueue", + "propertyPath": "Properties.HostedZoneName", "category": "Best Practice", - "startLine": 7, + "startLine": 21, "startColumn": 7, - "endLine": 7, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sqs.git", + "endLine": 21, + "endColumn": 21, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only" } - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'FifoQueue' of type 'AWS::SQS::Queue' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "FifoQueue", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" } ] }, - "good/ssm_document_valid.yaml": { - "filePath": "good/ssm_document_valid.yaml", + "good/route53_conditional_scenarios.yaml": { + "filePath": "good/route53_conditional_scenarios.yaml", "status": "OK", "metadata": { - "resourcesScanned": 1, + "resourcesScanned": 4, "counts": { "fatal": 0, "errors": 0, "warnings": 0, - "informational": 3, + "informational": 6, "debug": 0 }, "suppressed": 0, @@ -3089,20 +2686,20 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'DocumentType' is create-only; updating it will cause resource replacement", + "message": "Property 'HostedZoneName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Doc", + "logicalId": "ConditionalProperties", "entityType": "Resource", - "resourceType": "AWS::SSM::Document" + "resourceType": "AWS::Route53::RecordSet" }, - "propertyPath": "Properties.DocumentType", + "propertyPath": "Properties.HostedZoneName", "category": "Best Practice", - "startLine": 6, + "startLine": 14, "startColumn": 7, - "endLine": 6, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ssm", + "endLine": 14, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53-recordset", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -3112,50 +2709,119 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Content' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'HostedZoneName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Doc", + "logicalId": "MutuallyExclusiveConditions", "entityType": "Resource", - "resourceType": "AWS::SSM::Document" + "resourceType": "AWS::Route53::RecordSet" }, - "propertyPath": "Properties.Content", + "propertyPath": "Properties.HostedZoneName", "category": "Best Practice", - "startLine": 7, + "startLine": 30, "startColumn": 7, - "endLine": 7, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ssm", + "endLine": 30, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53-recordset", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only" } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'Doc' of type 'AWS::SSM::Document' supports Tags but none are configured", + "message": "Property 'HostedZoneName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Doc", + "logicalId": "LiteralNoValueAlias", "entityType": "Resource", - "resourceType": "AWS::SSM::Document" + "resourceType": "AWS::Route53::RecordSet" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.HostedZoneName", "category": "Best Practice", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 61, + "startColumn": 7, + "endLine": 61, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53-recordset", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9002", + "severity": "INFO", + "message": "'TTL' is ignored in this configuration (from extension)", + "source": "ENGINE", + "entity": { + "logicalId": "ConditionalProperties", + "entityType": "Resource", + "resourceType": "AWS::Route53::RecordSet" + }, + "propertyPath": "Properties.TTL", + "category": "Best Practice", + "startLine": 22, + "startColumn": 7, + "endLine": 22, + "endColumn": 10, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53-recordset", + "ruleDescription": "Property is ignored in this configuration (from extension)", + "phase": "SCHEMA", + "context": { + "resolutionSource": "Fn::If on condition 'IsAlias'" + } + }, + { + "ruleId": "I9002", + "severity": "INFO", + "message": "'TTL' is ignored in this configuration (from extension)", + "source": "ENGINE", + "entity": { + "logicalId": "MutuallyExclusiveConditions", + "entityType": "Resource", + "resourceType": "AWS::Route53::RecordSet" + }, + "propertyPath": "Properties.TTL", + "category": "Best Practice", + "startLine": 38, + "startColumn": 7, + "endLine": 38, + "endColumn": 10, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53-recordset", + "ruleDescription": "Property is ignored in this configuration (from extension)", + "phase": "SCHEMA", + "context": { + "resolutionSource": "Fn::If on condition 'IsStandard'" + } + }, + { + "ruleId": "I9002", + "severity": "INFO", + "message": "'TTL' is ignored in this configuration (from extension)", + "source": "ENGINE", + "entity": { + "logicalId": "LiteralNoValueAlias", + "entityType": "Resource", + "resourceType": "AWS::Route53::RecordSet" + }, + "propertyPath": "Properties.TTL", + "category": "Best Practice", + "startLine": 65, + "startColumn": 7, + "endLine": 65, + "endColumn": 10, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53-recordset", + "ruleDescription": "Property is ignored in this configuration (from extension)", + "phase": "SCHEMA" } ] }, - "good/ssm_parameter_name_type.yaml": { - "filePath": "good/ssm_parameter_name_type.yaml", + "good/sam/api_stagename_valid.yaml": { + "filePath": "good/sam/api_stagename_valid.yaml", "status": "OK", "metadata": { "resourcesScanned": 1, @@ -3163,7 +2829,7 @@ "fatal": 0, "errors": 0, "warnings": 0, - "informational": 2, + "informational": 1, "debug": 0 }, "suppressed": 0, @@ -3171,56 +2837,33 @@ "severityLevel": "DEBUG" }, "diagnostics": [ - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Bucket", - "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" - }, - "propertyPath": "Properties.BucketName", - "category": "Best Practice", - "startLine": 11, - "startColumn": 7, - "endLine": 11, - "endColumn": 17, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter 'SsmParamName' (type AWS::SSM::Parameter::Name)" - } - }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Resource 'MyApi' of type 'AWS::Serverless::Api' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Bucket", + "logicalId": "MyApi", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::Serverless::Api" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 10, + "startLine": 5, "startColumn": 5, - "endLine": 10, + "endLine": 5, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "good/stackset_conditional_template_source.yaml": { - "filePath": "good/stackset_conditional_template_source.yaml", + "good/sam/connector_valid.yaml": { + "filePath": "good/sam/connector_valid.yaml", "status": "OK", "metadata": { - "resourcesScanned": 1, + "resourcesScanned": 3, "counts": { "fatal": 0, "errors": 0, @@ -3234,62 +2877,56 @@ }, "diagnostics": [ { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'StackSetName' is create-only; updating it will cause resource replacement", + "message": "Resource 'MyTopic' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ConditionalTemplateSource", + "logicalId": "MyTopic", "entityType": "Resource", - "resourceType": "AWS::CloudFormation::StackSet" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.StackSetName", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 8, - "startColumn": 7, - "endLine": 8, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-cloudformation.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 10, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'PermissionModel' is create-only; updating it will cause resource replacement", + "message": "Resource 'MyFn' of type 'AWS::Serverless::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ConditionalTemplateSource", + "logicalId": "MyFn", "entityType": "Resource", - "resourceType": "AWS::CloudFormation::StackSet" + "resourceType": "AWS::Serverless::Function" }, - "propertyPath": "Properties.PermissionModel", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 9, - "startColumn": 7, - "endLine": 9, - "endColumn": 22, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-cloudformation.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 7, + "startColumn": 5, + "endLine": 7, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" } ] }, - "good/stepfunctions_valid.yaml": { - "filePath": "good/stepfunctions_valid.yaml", + "good/sam/function_deploymentpreference_with_alias.yaml": { + "filePath": "good/sam/function_deploymentpreference_with_alias.yaml", "status": "OK", "metadata": { "resourcesScanned": 1, "counts": { "fatal": 0, "errors": 0, - "warnings": 1, + "warnings": 0, "informational": 1, "debug": 0 }, @@ -3298,34 +2935,15 @@ "severityLevel": "DEBUG" }, "diagnostics": [ - { - "ruleId": "W9002", - "severity": "WARN", - "message": "Property 'RoleArn' has a hardcoded ARN - use Ref, GetAtt, or a parameter instead", - "source": "ENGINE", - "entity": { - "logicalId": "SM", - "entityType": "Resource", - "resourceType": "AWS::StepFunctions::StateMachine" - }, - "propertyPath": "Properties.RoleArn", - "category": "Best Practice", - "startLine": 20, - "startColumn": 7, - "endLine": 20, - "endColumn": 14, - "ruleDescription": "Hardcoded ARN property", - "phase": "LINT" - }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'SM' of type 'AWS::StepFunctions::StateMachine' supports Tags but none are configured", + "message": "Resource 'Fn' of type 'AWS::Serverless::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "SM", + "logicalId": "Fn", "entityType": "Resource", - "resourceType": "AWS::StepFunctions::StateMachine" + "resourceType": "AWS::Serverless::Function" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", @@ -3339,16 +2957,16 @@ } ] }, - "good/string_length_unknowable_values.json": { - "filePath": "good/string_length_unknowable_values.json", + "good/sam/function_dlq_valid.yaml": { + "filePath": "good/sam/function_dlq_valid.yaml", "status": "OK", "metadata": { - "resourcesScanned": 5, + "resourcesScanned": 1, "counts": { "fatal": 0, "errors": 0, "warnings": 0, - "informational": 9, + "informational": 1, "debug": 0 }, "suppressed": 0, @@ -3357,201 +2975,224 @@ }, "diagnostics": [ { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", + "message": "Resource 'Fn' of type 'AWS::Serverless::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "JoinedFromAReference", + "logicalId": "Fn", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::Serverless::Function" }, - "propertyPath": "Properties.BucketName", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 16, - "startColumn": 9, - "endLine": 16, - "endColumn": 20, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "dynamic (Join:{ref:NameProviderWithADeliberatelyLongLogicalIdentifierForThisTest}-data)" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "JoinedFromAParameter", - "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" - }, - "propertyPath": "Properties.BucketName", - "category": "Best Practice", - "startLine": 24, - "startColumn": 9, - "endLine": 24, - "endColumn": 20, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "dynamic (Join:{dynamic}-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "SubstitutedFromAParameter", - "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" - }, - "propertyPath": "Properties.BucketName", - "category": "Best Practice", - "startLine": 38, - "startColumn": 9, - "endLine": 38, - "endColumn": 20, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "dynamic (Sub:${NamePrefix}-data)" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "OnlySomeChoicesTooLong", - "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" - }, - "propertyPath": "Properties.BucketName", - "category": "Best Practice", - "startLine": 44, - "startColumn": 9, - "endLine": 44, - "endColumn": 20, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter with AllowedValues" - } + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "good/sam/function_image_valid.yaml": { + "filePath": "good/sam/function_image_valid.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 1, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'NameProviderWithADeliberatelyLongLogicalIdentifierForThisTest' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Resource 'Fn' of type 'AWS::Serverless::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "NameProviderWithADeliberatelyLongLogicalIdentifierForThisTest", + "logicalId": "Fn", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::Serverless::Function" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 10, + "startLine": 5, "startColumn": 5, - "endLine": 10, - "endColumn": 67, + "endLine": 5, + "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "good/sam/function_provisioned_concurrency_with_alias.yaml": { + "filePath": "good/sam/function_provisioned_concurrency_with_alias.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 1, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'JoinedFromAReference' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Resource 'Fn' of type 'AWS::Serverless::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "JoinedFromAReference", + "logicalId": "Fn", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::Serverless::Function" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 15, - "startColumn": 7, - "endLine": 15, - "endColumn": 18, + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "good/sam/function_runtime_handler_via_globals.yaml": { + "filePath": "good/sam/function_runtime_handler_via_globals.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 1, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'JoinedFromAParameter' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Resource 'Fn' of type 'AWS::Serverless::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "JoinedFromAParameter", + "logicalId": "Fn", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::Serverless::Function" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 23, - "startColumn": 7, - "endLine": 23, - "endColumn": 18, + "startLine": 9, + "startColumn": 5, + "endLine": 9, + "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "good/sam/function_url_config_valid.yaml": { + "filePath": "good/sam/function_url_config_valid.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 1, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'SubstitutedFromAParameter' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Resource 'Fn' of type 'AWS::Serverless::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "SubstitutedFromAParameter", + "logicalId": "Fn", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::Serverless::Function" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 37, - "startColumn": 7, - "endLine": 37, - "endColumn": 18, + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "good/sam/function_zip_valid.yaml": { + "filePath": "good/sam/function_zip_valid.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 1, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'OnlySomeChoicesTooLong' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Resource 'Fn' of type 'AWS::Serverless::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "OnlySomeChoicesTooLong", + "logicalId": "Fn", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::Serverless::Function" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 43, - "startColumn": 7, - "endLine": 43, - "endColumn": 18, + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "good/sub_not_needed.yaml": { - "filePath": "good/sub_not_needed.yaml", + "good/sam/globals_all_valid_sections.yaml": { + "filePath": "good/sam/globals_all_valid_sections.yaml", "status": "OK", "metadata": { "resourcesScanned": 1, @@ -3559,7 +3200,7 @@ "fatal": 0, "errors": 0, "warnings": 0, - "informational": 2, + "informational": 1, "debug": 0 }, "suppressed": 0, @@ -3568,60 +3209,76 @@ }, "diagnostics": [ { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", + "message": "Resource 'Fn' of type 'AWS::Serverless::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Bucket", + "logicalId": "Fn", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::Serverless::Function" }, - "propertyPath": "Properties.BucketName", - "category": "Best Practice", - "startLine": 9, - "startColumn": 7, - "endLine": 9, - "endColumn": 17, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "dynamic (Sub:${MyParam}-bucket)" - } + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 19, + "startColumn": 5, + "endLine": 19, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "good/sam/globals_empty.yaml": { + "filePath": "good/sam/globals_empty.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 1, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Resource 'Fn' of type 'AWS::Serverless::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Bucket", + "logicalId": "Fn", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::Serverless::Function" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 8, + "startLine": 6, "startColumn": 5, - "endLine": 8, + "endLine": 6, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "good/subnet_cidrs_across_vpcs_and_secondary_blocks.yaml": { - "filePath": "good/subnet_cidrs_across_vpcs_and_secondary_blocks.yaml", + "good/sam/implicit_alias_ref.yaml": { + "filePath": "good/sam/implicit_alias_ref.yaml", "status": "OK", "metadata": { - "resourcesScanned": 12, + "resourcesScanned": 2, "counts": { "fatal": 0, "errors": 0, "warnings": 0, - "informational": 22, + "informational": 2, "debug": 0 }, "suppressed": 0, @@ -3630,516 +3287,367 @@ }, "diagnostics": [ { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Resource 'MyFn' of type 'AWS::Serverless::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "VpcA", + "logicalId": "MyFn", "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" + "resourceType": "AWS::Serverless::Function" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 17, - "startColumn": 7, - "endLine": 17, - "endColumn": 16, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Resource 'AliasParam' of type 'AWS::SSM::Parameter' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "VpcB", + "logicalId": "AliasParam", "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" + "resourceType": "AWS::SSM::Parameter" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 24, - "startColumn": 7, - "endLine": 24, - "endColumn": 16, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 12, + "startColumn": 5, + "endLine": 12, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "good/sam/implicit_httpapi_ref.yaml": { + "filePath": "good/sam/implicit_httpapi_ref.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 3, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 3, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "message": "Resource 'MyFn' of type 'AWS::Serverless::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "VpcASecondaryBlock", + "logicalId": "MyFn", "entityType": "Resource", - "resourceType": "AWS::EC2::VPCCidrBlock" + "resourceType": "AWS::Serverless::Function" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 31, - "startColumn": 7, - "endLine": 31, - "endColumn": 12, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'VpcA'" - } + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Resource 'ApiIdParam' of type 'AWS::SSM::Parameter' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "VpcASecondaryBlock", + "logicalId": "ApiIdParam", "entityType": "Resource", - "resourceType": "AWS::EC2::VPCCidrBlock" + "resourceType": "AWS::SSM::Parameter" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 32, - "startColumn": 7, - "endLine": 32, - "endColumn": 16, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 17, + "startColumn": 5, + "endLine": 17, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "message": "Resource 'ApiSubParam' of type 'AWS::SSM::Parameter' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "SubnetA1", + "logicalId": "ApiSubParam", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::SSM::Parameter" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 36, - "startColumn": 7, - "endLine": 36, - "endColumn": 12, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'VpcA'" - } + "startLine": 22, + "startColumn": 5, + "endLine": 22, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "good/sam/implicit_restapi_stage_ref.yaml": { + "filePath": "good/sam/implicit_restapi_stage_ref.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 2, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 2, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Resource 'MyFn' of type 'AWS::Serverless::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "SubnetA1", + "logicalId": "MyFn", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::Serverless::Function" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 37, - "startColumn": 7, - "endLine": 37, - "endColumn": 16, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "message": "Resource 'StageParam' of type 'AWS::SSM::Parameter' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "SubnetB1", + "logicalId": "StageParam", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::SSM::Parameter" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 44, - "startColumn": 7, - "endLine": 44, - "endColumn": 12, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'VpcB'" - } + "startLine": 17, + "startColumn": 5, + "endLine": 17, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "good/sam/implicit_role_getatt_dependson.yaml": { + "filePath": "good/sam/implicit_role_getatt_dependson.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 3, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 3, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Resource 'MyFn' of type 'AWS::Serverless::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "SubnetB1", + "logicalId": "MyFn", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::Serverless::Function" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 45, - "startColumn": 7, - "endLine": 45, - "endColumn": 16, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 6, + "startColumn": 5, + "endLine": 6, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "message": "Resource 'RoleArnParam' of type 'AWS::SSM::Parameter' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "SubnetA2ViaAttribute", + "logicalId": "RoleArnParam", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::SSM::Parameter" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 52, - "startColumn": 7, - "endLine": 52, - "endColumn": 12, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt VpcA.VpcId" - } + "startLine": 12, + "startColumn": 5, + "endLine": 12, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Resource 'RoleRefParam' of type 'AWS::SSM::Parameter' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "SubnetA2ViaAttribute", + "logicalId": "RoleRefParam", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::SSM::Parameter" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 53, - "startColumn": 7, - "endLine": 53, - "endColumn": 16, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 17, + "startColumn": 5, + "endLine": 17, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "good/sam/layerversion_valid_retention_and_arch.yaml": { + "filePath": "good/sam/layerversion_valid_retention_and_arch.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 0, + "debug": 0 }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "SubnetInSecondaryBlock", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.VpcId", - "category": "Best Practice", - "startLine": 60, - "startColumn": 7, - "endLine": 60, - "endColumn": 12, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'VpcA'" - } + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [] + }, + "good/sam/simpletable_no_primarykey.yaml": { + "filePath": "good/sam/simpletable_no_primarykey.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 3, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "SubnetInSecondaryBlock", + "logicalId": "MyTable", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::Serverless::SimpleTable" }, - "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 61, - "startColumn": 7, - "endLine": 61, - "endColumn": 16, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 10, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "SubnetProdOrDev", + "logicalId": "MyTable", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::Serverless::SimpleTable" }, - "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 68, - "startColumn": 7, - "endLine": 68, - "endColumn": 12, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'VpcA'" - } + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 10, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Resource 'MyTable' of type 'AWS::Serverless::SimpleTable' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "SubnetProdOrDev", + "logicalId": "MyTable", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::Serverless::SimpleTable" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 69, - "startColumn": 7, - "endLine": 69, - "endColumn": 16, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Fn::If on condition 'IsProd'" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "SubnetDevOrProd", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.VpcId", - "category": "Best Practice", - "startLine": 76, - "startColumn": 7, - "endLine": 76, - "endColumn": 12, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'VpcA'" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "SubnetDevOrProd", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.CidrBlock", - "category": "Best Practice", - "startLine": 77, - "startColumn": 7, - "endLine": 77, - "endColumn": 16, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Fn::If on condition 'IsProd'" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "SubnetFromAttribute", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.VpcId", - "category": "Best Practice", - "startLine": 84, - "startColumn": 7, - "endLine": 84, - "endColumn": 12, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'VpcA'" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "SubnetFromAttribute", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.CidrBlock", - "category": "Best Practice", - "startLine": 85, - "startColumn": 7, - "endLine": 85, - "endColumn": 16, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt VpcA.CidrBlock" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "SubnetFromImport", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.VpcId", - "category": "Best Practice", - "startLine": 92, - "startColumn": 7, - "endLine": 92, - "endColumn": 12, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'VpcA'" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "SubnetFromImport", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.CidrBlock", - "category": "Best Practice", - "startLine": 93, - "startColumn": 7, - "endLine": 93, - "endColumn": 16, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "dynamic (cross-stack import: SharedSubnetCidr)" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "SubnetFromCidrFunction", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.VpcId", - "category": "Best Practice", - "startLine": 100, - "startColumn": 7, - "endLine": 100, - "endColumn": 12, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'VpcA'" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "SubnetFromCidrFunction", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.CidrBlock", - "category": "Best Practice", - "startLine": 101, - "startColumn": 7, - "endLine": 101, - "endColumn": 16, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "dynamic (Select with unresolvable arguments)" - } + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" } ] }, - "good/transform.yaml": { - "filePath": "good/transform.yaml", + "good/sam/simpletable_valid.yaml": { + "filePath": "good/sam/simpletable_valid.yaml", "status": "OK", "metadata": { - "resourcesScanned": 3, + "resourcesScanned": 1, "counts": { "fatal": 0, "errors": 0, "warnings": 0, - "informational": 4, + "informational": 3, "debug": 0 }, "suppressed": 0, @@ -4153,14 +3661,14 @@ "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "AppName", + "logicalId": "MyTable", "entityType": "Resource", - "resourceType": "AWS::Serverless::Application" + "resourceType": "AWS::Serverless::SimpleTable" }, "category": "Best Practice", - "startLine": 18, + "startLine": 3, "startColumn": 3, - "endLine": 18, + "endLine": 3, "endColumn": 10, "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" @@ -4171,14 +3679,14 @@ "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "AppName", + "logicalId": "MyTable", "entityType": "Resource", - "resourceType": "AWS::Serverless::Application" + "resourceType": "AWS::Serverless::SimpleTable" }, "category": "Best Practice", - "startLine": 18, + "startLine": 3, "startColumn": 3, - "endLine": 18, + "endLine": 3, "endColumn": 10, "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" @@ -4186,55 +3694,35 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'MyServerlessFunctionLogicalID' of type 'AWS::Serverless::Function' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "MyServerlessFunctionLogicalID", - "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 7, - "startColumn": 5, - "endLine": 7, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'AppName' of type 'AWS::Serverless::Application' supports Tags but none are configured", + "message": "Resource 'MyTable' of type 'AWS::Serverless::SimpleTable' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "AppName", + "logicalId": "MyTable", "entityType": "Resource", - "resourceType": "AWS::Serverless::Application" + "resourceType": "AWS::Serverless::SimpleTable" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 20, + "startLine": 5, "startColumn": 5, - "endLine": 20, + "endLine": 5, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "good/transform/applications_location.yaml": { - "filePath": "good/transform/applications_location.yaml", + "good/sam/statemachine_definition_only.yaml": { + "filePath": "good/sam/statemachine_definition_only.yaml", "status": "OK", "metadata": { - "resourcesScanned": 2, + "resourcesScanned": 1, "counts": { "fatal": 0, "errors": 0, - "warnings": 0, - "informational": 6, + "warnings": 1, + "informational": 1, "debug": 0 }, "suppressed": 0, @@ -4243,180 +3731,202 @@ }, "diagnostics": [ { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "App1", + "ruleId": "W9013", + "severity": "WARN", + "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", + "source": "ENGINE", + "entity": { + "logicalId": "MySM", "entityType": "Resource", - "resourceType": "AWS::Serverless::Application" + "resourceType": "AWS::Serverless::StateMachine" }, - "category": "Best Practice", + "category": "Security", "startLine": 3, "startColumn": 3, "endLine": 3, "endColumn": 7, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "ruleDescription": "Hardcoded account ID in ARN", "phase": "LINT" }, { - "ruleId": "I3011", + "ruleId": "I9040", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Resource 'MySM' of type 'AWS::Serverless::StateMachine' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "App1", + "logicalId": "MySM", "entityType": "Resource", - "resourceType": "AWS::Serverless::Application" + "resourceType": "AWS::Serverless::StateMachine" }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 7, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "good/schema_required_xor_resource_condition.yaml": { + "filePath": "good/schema_required_xor_resource_condition.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 1, + "informational": 5, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "ruleId": "W1028", + "severity": "WARN", + "message": "['Fn::If', 1] is not reachable. When setting condition 'DuplicateTarget' to True", "source": "CFN_LINT", "entity": { - "logicalId": "App2", + "logicalId": "Policy", "entityType": "Resource", - "resourceType": "AWS::Serverless::Application" + "resourceType": "AWS::ApplicationAutoScaling::ScalingPolicy" }, + "propertyPath": "Properties.ResourceId.Fn::If.1", "category": "Best Practice", - "startLine": 7, - "startColumn": 3, - "endLine": 7, - "endColumn": 7, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "startLine": 19, + "startColumn": 46, + "endLine": 19, + "endColumn": 47, + "ruleDescription": "Check Fn::If has a path that cannot be reached", "phase": "LINT" }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'PolicyName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "App2", + "logicalId": "Policy", "entityType": "Resource", - "resourceType": "AWS::Serverless::Application" + "resourceType": "AWS::ApplicationAutoScaling::ScalingPolicy" }, + "propertyPath": "Properties.PolicyName", "category": "Best Practice", - "startLine": 7, - "startColumn": 3, - "endLine": 7, - "endColumn": 7, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 16, + "startColumn": 7, + "endLine": 16, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'App1' of type 'AWS::Serverless::Application' supports Tags but none are configured", + "message": "Property 'ScalingTargetId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "App1", + "logicalId": "Policy", "entityType": "Resource", - "resourceType": "AWS::Serverless::Application" + "resourceType": "AWS::ApplicationAutoScaling::ScalingPolicy" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.ScalingTargetId", "category": "Best Practice", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 18, + "startColumn": 7, + "endLine": 18, + "endColumn": 22, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "parameter 'TargetId' (type String)" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'App2' of type 'AWS::Serverless::Application' supports Tags but none are configured", + "message": "Property 'ResourceId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "App2", + "logicalId": "Policy", "entityType": "Resource", - "resourceType": "AWS::Serverless::Application" + "resourceType": "AWS::ApplicationAutoScaling::ScalingPolicy" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.ResourceId", "category": "Best Practice", - "startLine": 9, - "startColumn": 5, - "endLine": 9, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "good/transform/auto_publish_alias.yaml": { - "filePath": "good/transform/auto_publish_alias.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 2, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 2, - "debug": 0 + "startLine": 19, + "startColumn": 7, + "endLine": 19, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Fn::If on condition 'DuplicateTarget'" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'SkillFunction' of type 'AWS::Serverless::Function' supports Tags but none are configured", + "message": "Property 'ScalableDimension' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SkillFunction", + "logicalId": "Policy", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::ApplicationAutoScaling::ScalingPolicy" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.ScalableDimension", "category": "Best Practice", - "startLine": 22, - "startColumn": 5, - "endLine": 22, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 20, + "startColumn": 7, + "endLine": 20, + "endColumn": 24, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'SkillFunction2' of type 'AWS::Serverless::Function' supports Tags but none are configured", + "message": "Property 'ServiceNamespace' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SkillFunction2", + "logicalId": "Policy", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::ApplicationAutoScaling::ScalingPolicy" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.ServiceNamespace", "category": "Best Practice", - "startLine": 31, - "startColumn": 5, - "endLine": 31, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 21, + "startColumn": 7, + "endLine": 21, + "endColumn": 23, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } } ] }, - "good/transform/auto_publish_code_sha256.yaml": { - "filePath": "good/transform/auto_publish_code_sha256.yaml", + "good/schema_resource.yaml": { + "filePath": "good/schema_resource.yaml", "status": "OK", "metadata": { "resourcesScanned": 1, @@ -4424,7 +3934,25 @@ "fatal": 0, "errors": 0, "warnings": 0, - "informational": 1, + "informational": 0, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [] + }, + "good/schema_valid_resources.yaml": { + "filePath": "good/schema_valid_resources.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 2, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 3, "debug": 0 }, "suppressed": 0, @@ -4433,133 +3961,79 @@ }, "diagnostics": [ { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'LambdaFunction' of type 'AWS::Serverless::Function' supports Tags but none are configured", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "LambdaFunction", + "logicalId": "Bucket", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.BucketName", "category": "Best Practice", - "startLine": 12, - "startColumn": 5, - "endLine": 12, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "good/transform/function_use_s3_uri.yaml": { - "filePath": "good/transform/function_use_s3_uri.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 1, - "debug": 0 + "startLine": 6, + "startColumn": 7, + "endLine": 6, + "endColumn": 17, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Function' of type 'AWS::Serverless::Function' supports Tags but none are configured", + "message": "Resource 'Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Function", + "logicalId": "Bucket", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::S3::Bucket" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 18, + "startLine": 5, "startColumn": 5, - "endLine": 18, + "endLine": 5, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" - } - ] - }, - "good/transform/function_using_image.yaml": { - "filePath": "good/transform/function_using_image.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 1, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'HelloWorldFunction' of type 'AWS::Serverless::Function' supports Tags but none are configured", + "message": "Resource 'Role' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "HelloWorldFunction", + "logicalId": "Role", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::IAM::Role" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 6, + "startLine": 9, "startColumn": 5, - "endLine": 6, + "endLine": 9, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "good/transform/include_object_form.yaml": { - "filePath": "good/transform/include_object_form.yaml", + "good/sg_icmpv6_type_code.yaml": { + "filePath": "good/sg_icmpv6_type_code.yaml", "status": "OK", "metadata": { - "resourcesScanned": 1, + "resourcesScanned": 5, "counts": { "fatal": 0, "errors": 0, "warnings": 0, - "informational": 0, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [] - }, - "good/transform/language_extension.yaml": { - "filePath": "good/transform/language_extension.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 7, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 2, - "informational": 14, + "informational": 18, "debug": 0 }, "suppressed": 0, @@ -4567,109 +4041,26 @@ "severityLevel": "DEBUG" }, "diagnostics": [ - { - "ruleId": "W2531", - "severity": "WARN", - "message": "Runtime 'python3.9' was deprecated on '2025-12-15'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'python3.14'", - "source": "CFN_LINT", - "entity": { - "logicalId": "TestLambdaFunction", - "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" - }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 78, - "startColumn": 7, - "endLine": 78, - "endColumn": 14, - "ruleDescription": "Check if EOL Lambda Function Runtimes are used", - "phase": "SCHEMA", - "context": { - "actualValue": "python3.9", - "lifecycle": "deprecated" - } - }, - { - "ruleId": "W9008", - "severity": "WARN", - "message": "RDS instance should have StorageEncrypted set to true", - "source": "ENGINE", - "entity": { - "logicalId": "PolicyList", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" - }, - "propertyPath": "Properties.StorageEncrypted", - "suggestedFix": "Set StorageEncrypted to true", - "category": "Security", - "startLine": 51, - "startColumn": 5, - "endLine": 51, - "endColumn": 15, - "ruleDescription": "RDS instance should have StorageEncrypted", - "phase": "LINT" - }, - { - "ruleId": "I3013", - "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "PolicyList", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" - }, - "propertyPath": "Properties", - "category": "Best Practice", - "startLine": 51, - "startColumn": 5, - "endLine": 51, - "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", - "phase": "LINT" - }, - { - "ruleId": "I3100", - "severity": "INFO", - "message": "Previous generation instance type 'db.m1.small' - consider upgrading", - "source": "CFN_LINT", - "entity": { - "logicalId": "PolicyList", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" - }, - "propertyPath": "Properties.DBInstanceClass", - "suggestedFix": "Upgrade to a current generation instance type", - "category": "Best Practice", - "startLine": 53, - "startColumn": 7, - "endLine": 53, - "endColumn": 22, - "ruleDescription": "Checks for legacy instance type generations", - "phase": "LINT" - }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "PolicyList", + "logicalId": "Vpc", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::VPC" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 54, + "startLine": 10, "startColumn": 7, - "endLine": 54, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "endLine": 10, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only" } }, { @@ -4678,15 +4069,15 @@ "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SecurityGroups", + "logicalId": "SecurityGroup", "entityType": "Resource", "resourceType": "AWS::EC2::SecurityGroup" }, "propertyPath": "Properties.GroupDescription", "category": "Best Practice", - "startLine": 87, + "startLine": 14, "startColumn": 7, - "endLine": 87, + "endLine": 14, "endColumn": 23, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", @@ -4700,83 +4091,87 @@ "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SecurityGroups", + "logicalId": "SecurityGroup", "entityType": "Resource", "resourceType": "AWS::EC2::SecurityGroup" }, "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 88, + "startLine": 15, "startColumn": 7, - "endLine": 88, + "endLine": 15, "endColumn": 12, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'Vpc'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "message": "Property 'GroupId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MySubnet", + "logicalId": "StandaloneIngressIcmpv6", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::EC2::SecurityGroupIngress" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.GroupId", "category": "Best Practice", - "startLine": 93, - "startColumn": 9, - "endLine": 93, + "startLine": 53, + "startColumn": 7, + "endLine": 53, "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "parameter 'MyVpc' (type AWS::EC2::VPC::Id)" + "resolutionSource": "Ref to 'SecurityGroup'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Property 'IpProtocol' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MySubnet", + "logicalId": "StandaloneIngressIcmpv6", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::EC2::SecurityGroupIngress" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Properties.IpProtocol", "category": "Best Practice", - "startLine": 94, - "startColumn": 9, - "endLine": 94, - "endColumn": 18, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" + "startLine": 54, + "startColumn": 7, + "endLine": 54, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'AvailabilityZoneId' is create-only; updating it will cause resource replacement", + "message": "Property 'FromPort' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MySubnet", + "logicalId": "StandaloneIngressIcmpv6", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::EC2::SecurityGroupIngress" }, - "propertyPath": "Properties.AvailabilityZoneId", + "propertyPath": "Properties.FromPort", "category": "Best Practice", - "startLine": 95, - "startColumn": 9, - "endLine": 95, - "endColumn": 27, + "startLine": 55, + "startColumn": 7, + "endLine": 55, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -4784,323 +4179,253 @@ } }, { - "ruleId": "I9003", + "ruleId": "I9001", "severity": "INFO", - "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", + "message": "Property 'ToPort' is create-only; updating it will cause resource replacement", "source": "ENGINE", + "entity": { + "logicalId": "StandaloneIngressIcmpv6", + "entityType": "Resource", + "resourceType": "AWS::EC2::SecurityGroupIngress" + }, + "propertyPath": "Properties.ToPort", "category": "Best Practice", - "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", - "phase": "LINT" + "startLine": 56, + "startColumn": 7, + "endLine": 56, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'PolicyList' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "message": "Property 'CidrIpv6' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "PolicyList", + "logicalId": "StandaloneIngressIcmpv6", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::SecurityGroupIngress" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.CidrIpv6", "category": "Best Practice", - "startLine": 51, - "startColumn": 5, - "endLine": 51, + "startLine": 57, + "startColumn": 7, + "endLine": 57, "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'TestStateMachine' of type 'AWS::Serverless::StateMachine' supports Tags but none are configured", + "message": "Property 'GroupId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "TestStateMachine", + "logicalId": "StandaloneEgressIcmpv6", "entityType": "Resource", - "resourceType": "AWS::Serverless::StateMachine" + "resourceType": "AWS::EC2::SecurityGroupEgress" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.GroupId", "category": "Best Practice", - "startLine": 63, - "startColumn": 5, - "endLine": 63, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 61, + "startColumn": 7, + "endLine": 61, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'SecurityGroup'" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'TestLambdaFunction' of type 'AWS::Serverless::Function' supports Tags but none are configured", + "message": "Property 'IpProtocol' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "TestLambdaFunction", + "logicalId": "StandaloneEgressIcmpv6", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::EC2::SecurityGroupEgress" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.IpProtocol", "category": "Best Practice", - "startLine": 76, - "startColumn": 5, - "endLine": 76, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 62, + "startColumn": 7, + "endLine": 62, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'SecurityGroups' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", + "message": "Property 'FromPort' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SecurityGroups", + "logicalId": "StandaloneEgressIcmpv6", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::EC2::SecurityGroupEgress" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.FromPort", "category": "Best Practice", - "startLine": 86, - "startColumn": 5, - "endLine": 86, + "startLine": 63, + "startColumn": 7, + "endLine": 63, "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'MySubnet' of type 'AWS::EC2::Subnet' supports Tags but none are configured", + "message": "Property 'ToPort' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MySubnet", + "logicalId": "StandaloneEgressIcmpv6", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::EC2::SecurityGroupEgress" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.ToPort", "category": "Best Practice", - "startLine": 92, - "startColumn": 5, - "endLine": 92, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "good/transform/list_transform.yaml": { - "filePath": "good/transform/list_transform.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 1, - "debug": 0 + "startLine": 64, + "startColumn": 7, + "endLine": 64, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'SkillFunction' of type 'AWS::Serverless::Function' supports Tags but none are configured", + "message": "Property 'CidrIpv6' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SkillFunction", + "logicalId": "StandaloneEgressIcmpv6", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::EC2::SecurityGroupEgress" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.CidrIpv6", "category": "Best Practice", - "startLine": 17, - "startColumn": 5, - "endLine": 17, + "startLine": 65, + "startColumn": 7, + "endLine": 65, "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "good/transform/list_transform_many.yaml": { - "filePath": "good/transform/list_transform_many.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 1, - "debug": 0 + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'Function' of type 'AWS::Serverless::Function' supports Tags but none are configured", + "message": "Property 'GroupId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Function", + "logicalId": "StandaloneEgressIcmpv6WithoutTypeCode", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::EC2::SecurityGroupEgress" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.GroupId", "category": "Best Practice", - "startLine": 16, - "startColumn": 5, - "endLine": 16, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "good/transform/list_transform_not_sam.yaml": { - "filePath": "good/transform/list_transform_not_sam.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 1, - "informational": 1, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "W9013", - "severity": "WARN", - "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", - "source": "ENGINE", - "entity": { - "logicalId": "SkillFunction", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "category": "Security", - "startLine": 7, - "startColumn": 3, - "endLine": 7, - "endColumn": 16, - "ruleDescription": "Hardcoded account ID in ARN", - "phase": "LINT" + "startLine": 69, + "startColumn": 7, + "endLine": 69, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'SecurityGroup'" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'SkillFunction' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "message": "Property 'IpProtocol' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SkillFunction", + "logicalId": "StandaloneEgressIcmpv6WithoutTypeCode", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::EC2::SecurityGroupEgress" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.IpProtocol", "category": "Best Practice", - "startLine": 9, - "startColumn": 5, - "endLine": 9, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "good/transform/step_function_local_definition.yaml": { - "filePath": "good/transform/step_function_local_definition.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 1, - "debug": 0 + "startLine": 70, + "startColumn": 7, + "endLine": 70, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'StateMachine' of type 'AWS::Serverless::StateMachine' supports Tags but none are configured", + "message": "Property 'CidrIpv6' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "StateMachine", + "logicalId": "StandaloneEgressIcmpv6WithoutTypeCode", "entityType": "Resource", - "resourceType": "AWS::Serverless::StateMachine" + "resourceType": "AWS::EC2::SecurityGroupEgress" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.CidrIpv6", "category": "Best Practice", - "startLine": 5, - "startColumn": 5, - "endLine": 5, + "startLine": 71, + "startColumn": 7, + "endLine": 71, "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "good/transform_serverless_api.yaml": { - "filePath": "good/transform_serverless_api.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 2, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 2, - "debug": 0 + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'myFunction' of type 'AWS::Serverless::Function' supports Tags but none are configured", + "message": "Resource 'Vpc' of type 'AWS::EC2::VPC' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "myFunction", + "logicalId": "Vpc", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::EC2::VPC" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 7, + "startLine": 9, "startColumn": 5, - "endLine": 7, + "endLine": 9, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -5108,30 +4433,30 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'myApi' of type 'AWS::Serverless::Api' supports Tags but none are configured", + "message": "Resource 'SecurityGroup' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "myApi", + "logicalId": "SecurityGroup", "entityType": "Resource", - "resourceType": "AWS::Serverless::Api" + "resourceType": "AWS::EC2::SecurityGroup" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 23, + "startLine": 13, "startColumn": 5, - "endLine": 23, + "endLine": 13, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "good/transform_serverless_auto_publish_alias.yaml": { - "filePath": "good/transform_serverless_auto_publish_alias.yaml", + "good/simple_sub_prefix.yaml": { + "filePath": "good/simple_sub_prefix.yaml", "status": "OK", "metadata": { - "resourcesScanned": 2, + "resourcesScanned": 1, "counts": { "fatal": 0, "errors": 0, @@ -5145,57 +4470,60 @@ }, "diagnostics": [ { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'LiteralAliasFunction' of type 'AWS::Serverless::Function' supports Tags but none are configured", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "LiteralAliasFunction", + "logicalId": "Bucket", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.BucketName", "category": "Best Practice", - "startLine": 10, - "startColumn": 5, - "endLine": 10, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 9, + "startColumn": 7, + "endLine": 9, + "endColumn": 17, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "dynamic (Sub:prefix-${Env})" + } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'ParameterAliasFunction' of type 'AWS::Serverless::Function' supports Tags but none are configured", + "message": "Resource 'Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ParameterAliasFunction", + "logicalId": "Bucket", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::S3::Bucket" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 17, + "startLine": 8, "startColumn": 5, - "endLine": 17, + "endLine": 8, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "good/transform_serverless_function.yaml": { - "filePath": "good/transform_serverless_function.yaml", + "good/some_logs_stream_lambda.yaml": { + "filePath": "good/some_logs_stream_lambda.yaml", "status": "OK", "metadata": { - "resourcesScanned": 4, + "resourcesScanned": 8, "counts": { "fatal": 0, - "errors": 0, + "errors": 4, "warnings": 0, - "informational": 3, + "informational": 20, "debug": 0 }, "suppressed": 0, @@ -5204,439 +4532,220 @@ }, "diagnostics": [ { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'myApi' of type 'AWS::Serverless::Api' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "E2533", + "severity": "ERROR", + "message": "Runtime 'python3.6' was deprecated on '2022-07-18'. Creation was disabled on '2022-07-18', and updates were disabled on '2022-08-29'. Please consider updating to 'python3.14'", + "source": "CFN_LINT", "entity": { - "logicalId": "myApi", + "logicalId": "FunctionA", "entityType": "Resource", - "resourceType": "AWS::Serverless::Api" + "resourceType": "AWS::Serverless::Function" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 7, - "startColumn": 5, - "endLine": 7, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 21, + "startColumn": 7, + "endLine": 21, + "endColumn": 14, + "ruleDescription": "Check if Lambda Function Runtimes are updatable", + "phase": "SCHEMA", + "context": { + "actualValue": "python3.6", + "lifecycle": "end-of-life" + } }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'myFunction' of type 'AWS::Serverless::Function' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "E2533", + "severity": "ERROR", + "message": "Runtime 'python3.6' was deprecated on '2022-07-18'. Creation was disabled on '2022-07-18', and updates were disabled on '2022-08-29'. Please consider updating to 'python3.14'", + "source": "CFN_LINT", "entity": { - "logicalId": "myFunction", + "logicalId": "FunctionB", "entityType": "Resource", "resourceType": "AWS::Serverless::Function" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 11, - "startColumn": 5, - "endLine": 11, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'myBucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "myBucket", - "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 73, - "startColumn": 5, - "endLine": 73, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "good/transform_serverless_globals.yaml": { - "filePath": "good/transform_serverless_globals.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 0, - "informational": 1, - "debug": 0 + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 33, + "startColumn": 7, + "endLine": 33, + "endColumn": 14, + "ruleDescription": "Check if Lambda Function Runtimes are updatable", + "phase": "SCHEMA", + "context": { + "actualValue": "python3.6", + "lifecycle": "end-of-life" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { "ruleId": "E2533", "severity": "ERROR", - "message": "Runtime 'nodejs6.10' was deprecated on '2019-08-12'. Creation was disabled on '2019-07-12', and updates were disabled on '2019-08-12'. Please consider updating to 'nodejs24.x'", + "message": "Runtime 'python3.6' was deprecated on '2022-07-18'. Creation was disabled on '2022-07-18', and updates were disabled on '2022-08-29'. Please consider updating to 'python3.14'", "source": "CFN_LINT", "entity": { - "logicalId": "myFunction", + "logicalId": "FunctionC", "entityType": "Resource", "resourceType": "AWS::Serverless::Function" }, "propertyPath": "Properties.Runtime", "category": "Deprecation", - "startLine": 5, - "startColumn": 5, - "endLine": 5, - "endColumn": 12, + "startLine": 44, + "startColumn": 7, + "endLine": 44, + "endColumn": 14, "ruleDescription": "Check if Lambda Function Runtimes are updatable", "phase": "SCHEMA", "context": { - "actualValue": "nodejs6.10", + "actualValue": "python3.6", "lifecycle": "end-of-life" } }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'myFunction' of type 'AWS::Serverless::Function' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "myFunction", - "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 12, - "startColumn": 5, - "endLine": 12, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "good/transform_serverless_ignore_globals.yaml": { - "filePath": "good/transform_serverless_ignore_globals.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 3, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 0, - "informational": 3, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { "ruleId": "E2533", "severity": "ERROR", - "message": "Runtime 'nodejs6.10' was deprecated on '2019-08-12'. Creation was disabled on '2019-07-12', and updates were disabled on '2019-08-12'. Please consider updating to 'nodejs24.x'", + "message": "Runtime 'python3.6' was deprecated on '2022-07-18'. Creation was disabled on '2022-07-18', and updates were disabled on '2022-08-29'. Please consider updating to 'python3.14'", "source": "CFN_LINT", "entity": { - "logicalId": "InheritsGlobalsFunction", + "logicalId": "LogSubscriptionFunction", "entityType": "Resource", "resourceType": "AWS::Serverless::Function" }, "propertyPath": "Properties.Runtime", "category": "Deprecation", - "startLine": 6, - "startColumn": 5, - "endLine": 6, - "endColumn": 12, + "startLine": 56, + "startColumn": 7, + "endLine": 56, + "endColumn": 14, "ruleDescription": "Check if Lambda Function Runtimes are updatable", "phase": "SCHEMA", "context": { - "actualValue": "nodejs6.10", + "actualValue": "python3.6", "lifecycle": "end-of-life" } }, { - "ruleId": "I9040", + "ruleId": "I3011", "severity": "INFO", - "message": "Resource 'IgnoredFunction' of type 'AWS::Serverless::Function' supports Tags but none are configured", - "source": "ENGINE", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "IgnoredFunction", + "logicalId": "FunctionALogGroup", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::Logs::LogGroup" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 12, - "startColumn": 5, - "endLine": 12, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "startLine": 22, + "startColumn": 3, + "endLine": 22, + "endColumn": 20, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "I9040", + "ruleId": "I3011", "severity": "INFO", - "message": "Resource 'SelectiveIgnoreFunction' of type 'AWS::Serverless::Function' supports Tags but none are configured", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "SelectiveIgnoreFunction", + "logicalId": "FunctionALogGroup", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::Logs::LogGroup" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 20, - "startColumn": 5, - "endLine": 20, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "startLine": 22, + "startColumn": 3, + "endLine": 22, + "endColumn": 20, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "I9040", + "ruleId": "I3011", "severity": "INFO", - "message": "Resource 'InheritsGlobalsFunction' of type 'AWS::Serverless::Function' supports Tags but none are configured", - "source": "ENGINE", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "InheritsGlobalsFunction", + "logicalId": "FunctionBLogGroup", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::Logs::LogGroup" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 26, - "startColumn": 5, - "endLine": 26, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "startLine": 34, + "startColumn": 3, + "endLine": 34, + "endColumn": 20, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" - } - ] - }, - "good/transform_serverless_ignore_globals_supported_runtime.yaml": { - "filePath": "good/transform_serverless_ignore_globals_supported_runtime.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 3, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 3, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "I9040", + "ruleId": "I3011", "severity": "INFO", - "message": "Resource 'IgnoredFunction' of type 'AWS::Serverless::Function' supports Tags but none are configured", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "IgnoredFunction", + "logicalId": "FunctionBLogGroup", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::Logs::LogGroup" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 12, - "startColumn": 5, - "endLine": 12, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "startLine": 34, + "startColumn": 3, + "endLine": 34, + "endColumn": 20, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "I9040", + "ruleId": "I3011", "severity": "INFO", - "message": "Resource 'SelectiveIgnoreFunction' of type 'AWS::Serverless::Function' supports Tags but none are configured", - "source": "ENGINE", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "SelectiveIgnoreFunction", + "logicalId": "FunctionCLogGroup", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::Logs::LogGroup" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 20, - "startColumn": 5, - "endLine": 20, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'InheritsGlobalsFunction' of type 'AWS::Serverless::Function' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "InheritsGlobalsFunction", - "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 26, - "startColumn": 5, - "endLine": 26, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "good/unique_items_deploy_time_values.json": { - "filePath": "good/unique_items_deploy_time_values.json", - "status": "OK", - "metadata": { - "resourcesScanned": 3, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 3, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'StackOutputSubnets' of type 'AWS::RDS::DBSubnetGroup' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "StackOutputSubnets", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBSubnetGroup" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 12, - "startColumn": 7, - "endLine": 12, - "endColumn": 18, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'ImportedSubnets' of type 'AWS::RDS::DBSubnetGroup' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "ImportedSubnets", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBSubnetGroup" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 34, - "startColumn": 7, - "endLine": 34, - "endColumn": 18, - "ruleDescription": "Resource should have Tags", + "startLine": 45, + "startColumn": 3, + "endLine": 45, + "endColumn": 20, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "I9040", + "ruleId": "I3011", "severity": "INFO", - "message": "Resource 'SelectedSubnets' of type 'AWS::RDS::DBSubnetGroup' supports Tags but none are configured", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "SelectedSubnets", + "logicalId": "FunctionCLogGroup", "entityType": "Resource", - "resourceType": "AWS::RDS::DBSubnetGroup" + "resourceType": "AWS::Logs::LogGroup" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 44, - "startColumn": 7, - "endLine": 44, - "endColumn": 18, - "ruleDescription": "Resource should have Tags", + "startLine": 45, + "startColumn": 3, + "endLine": 45, + "endColumn": 20, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" - } - ] - }, - "good/unknown_resource_types_ignored.yaml": { - "filePath": "good/unknown_resource_types_ignored.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 5, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 0, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [] - }, - "good/unresolved_values_are_present.yaml": { - "filePath": "good/unresolved_values_are_present.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 15, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 32, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { "ruleId": "I3011", "severity": "INFO", "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "ValkeyGroup", + "logicalId": "LogSubscriptionFunctionLogGroup", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::Logs::LogGroup" }, "category": "Best Practice", - "startLine": 134, + "startLine": 73, "startColumn": 3, - "endLine": 134, - "endColumn": 14, + "endLine": 73, + "endColumn": 34, "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, @@ -5646,380 +4755,365 @@ "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "ValkeyGroup", + "logicalId": "LogSubscriptionFunctionLogGroup", "entityType": "Resource", - "resourceType": "AWS::ElastiCache::ReplicationGroup" + "resourceType": "AWS::Logs::LogGroup" }, "category": "Best Practice", - "startLine": 134, + "startLine": 73, "startColumn": 3, - "endLine": 134, - "endColumn": 14, + "endLine": 73, + "endColumn": 34, "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Property 'LogGroupName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Vpc", + "logicalId": "FunctionALogGroup", "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" + "resourceType": "AWS::Logs::LogGroup" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Properties.LogGroupName", "category": "Best Practice", - "startLine": 17, + "startLine": 25, "startColumn": 7, - "endLine": 17, - "endColumn": 16, + "endLine": 25, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-logs.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "dynamic (Sub:/aws/lambda/${FunctionA})" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "message": "Property 'LogGroupName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Subnet1", + "logicalId": "FunctionBLogGroup", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::Logs::LogGroup" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.LogGroupName", "category": "Best Practice", - "startLine": 24, + "startLine": 37, "startColumn": 7, - "endLine": 24, - "endColumn": 12, + "endLine": 37, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-logs.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "Ref to 'Vpc'" + "resolutionSource": "dynamic (Sub:/aws/lambda/${FunctionB})" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Property 'LogGroupName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Subnet1", + "logicalId": "FunctionCLogGroup", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::Logs::LogGroup" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Properties.LogGroupName", "category": "Best Practice", - "startLine": 25, + "startLine": 48, "startColumn": 7, - "endLine": 25, - "endColumn": 16, + "endLine": 48, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-logs.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "dynamic (Sub:/aws/lambda/${FunctionC})" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "message": "Property 'LogGroupName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Subnet2", + "logicalId": "LogSubscriptionFunctionLogGroup", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::Logs::LogGroup" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.LogGroupName", "category": "Best Practice", - "startLine": 32, + "startLine": 76, "startColumn": 7, - "endLine": 32, - "endColumn": 12, + "endLine": 76, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-logs.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "Ref to 'Vpc'" + "resolutionSource": "dynamic (Sub:/aws/lambda/${LogSubscriptionFunction})" } }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Resource 'FunctionA' of type 'AWS::Serverless::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Subnet2", + "logicalId": "FunctionA", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::Serverless::Function" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 33, - "startColumn": 7, - "endLine": 33, - "endColumn": 16, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 18, + "startColumn": 5, + "endLine": 18, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Resource 'FunctionALogGroup' of type 'AWS::Logs::LogGroup' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Cluster", + "logicalId": "FunctionALogGroup", "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" + "resourceType": "AWS::Logs::LogGroup" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 42, - "startColumn": 7, - "endLine": 42, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 24, + "startColumn": 5, + "endLine": 24, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'MasterUsername' is conditionally create-only; updating it may cause resource replacement", + "message": "Resource 'FunctionB' of type 'AWS::Serverless::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Cluster", + "logicalId": "FunctionB", "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" + "resourceType": "AWS::Serverless::Function" }, - "propertyPath": "Properties.MasterUsername", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 43, - "startColumn": 7, - "endLine": 43, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 30, + "startColumn": 5, + "endLine": 30, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", + "message": "Resource 'FunctionBLogGroup' of type 'AWS::Logs::LogGroup' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "SecurityGroup", + "logicalId": "FunctionBLogGroup", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::Logs::LogGroup" }, - "propertyPath": "Properties.GroupDescription", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 52, - "startColumn": 7, - "endLine": 52, - "endColumn": 23, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 36, + "startColumn": 5, + "endLine": 36, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "message": "Resource 'FunctionC' of type 'AWS::Serverless::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "SecurityGroup", + "logicalId": "FunctionC", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::Serverless::Function" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 53, - "startColumn": 7, - "endLine": 53, - "endColumn": 12, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'Vpc'" - } + "startLine": 41, + "startColumn": 5, + "endLine": 41, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'GroupId' is create-only; updating it will cause resource replacement", + "message": "Resource 'FunctionCLogGroup' of type 'AWS::Logs::LogGroup' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "IngressFromAttribute", + "logicalId": "FunctionCLogGroup", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" + "resourceType": "AWS::Logs::LogGroup" }, - "propertyPath": "Properties.GroupId", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 65, - "startColumn": 7, - "endLine": 65, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'SecurityGroup'" - } + "startLine": 47, + "startColumn": 5, + "endLine": 47, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'IpProtocol' is create-only; updating it will cause resource replacement", + "message": "Resource 'LogSubscriptionFunction' of type 'AWS::Serverless::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "IngressFromAttribute", + "logicalId": "LogSubscriptionFunction", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" + "resourceType": "AWS::Serverless::Function" }, - "propertyPath": "Properties.IpProtocol", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 66, - "startColumn": 7, - "endLine": 66, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 53, + "startColumn": 5, + "endLine": 53, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'CidrIp' is create-only; updating it will cause resource replacement", + "message": "Resource 'LogSubscriptionFunctionLogGroup' of type 'AWS::Logs::LogGroup' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "IngressFromAttribute", + "logicalId": "LogSubscriptionFunctionLogGroup", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" + "resourceType": "AWS::Logs::LogGroup" }, - "propertyPath": "Properties.CidrIp", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 67, - "startColumn": 7, - "endLine": 67, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 75, + "startColumn": 5, + "endLine": 75, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "good/sqs_fifo_valid.yaml": { + "filePath": "good/sqs_fifo_valid.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 6, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'FromPort' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "IngressFromAttribute", + "logicalId": "FifoQueue", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Properties.FromPort", "category": "Best Practice", - "startLine": 68, - "startColumn": 7, - "endLine": 68, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt Cluster.Endpoint.Port" - } + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 12, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'ToPort' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "IngressFromAttribute", + "logicalId": "FifoQueue", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Properties.ToPort", "category": "Best Practice", - "startLine": 69, - "startColumn": 7, - "endLine": 69, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt Cluster.Endpoint.Port" - } + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 12, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3013", "severity": "INFO", - "message": "Property 'GroupId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'MessageRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "IngressFromImport", + "logicalId": "FifoQueue", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Properties.GroupId", + "propertyPath": "Properties", "category": "Best Practice", - "startLine": 73, - "startColumn": 7, - "endLine": 73, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'SecurityGroup'" - } + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'IpProtocol' is create-only; updating it will cause resource replacement", + "message": "Property 'QueueName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "IngressFromImport", + "logicalId": "FifoQueue", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Properties.IpProtocol", + "propertyPath": "Properties.QueueName", "category": "Best Practice", - "startLine": 74, + "startLine": 6, "startColumn": 7, - "endLine": 74, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 6, + "endColumn": 16, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sqs.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -6029,20 +5123,20 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'CidrIp' is create-only; updating it will cause resource replacement", + "message": "Property 'FifoQueue' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "IngressFromImport", + "logicalId": "FifoQueue", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Properties.CidrIp", + "propertyPath": "Properties.FifoQueue", "category": "Best Practice", - "startLine": 75, + "startLine": 7, "startColumn": 7, - "endLine": 75, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 7, + "endColumn": 16, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sqs.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -6050,422 +5144,602 @@ } }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'FromPort' is create-only; updating it will cause resource replacement", + "message": "Resource 'FifoQueue' of type 'AWS::SQS::Queue' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "IngressFromImport", + "logicalId": "FifoQueue", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Properties.FromPort", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 76, - "startColumn": 7, - "endLine": 76, + "startLine": 5, + "startColumn": 5, + "endLine": 5, "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "dynamic (cross-stack import: SharedPort)" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "good/ssm_document_valid.yaml": { + "filePath": "good/ssm_document_valid.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 3, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ToPort' is create-only; updating it will cause resource replacement", + "message": "Property 'DocumentType' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "IngressFromImport", + "logicalId": "Doc", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupIngress" + "resourceType": "AWS::SSM::Document" }, - "propertyPath": "Properties.ToPort", + "propertyPath": "Properties.DocumentType", "category": "Best Practice", - "startLine": 77, + "startLine": 6, "startColumn": 7, - "endLine": 77, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 6, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ssm", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "dynamic (cross-stack import: SharedPort)" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'GroupId' is create-only; updating it will cause resource replacement", + "message": "Property 'Content' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "EgressFromParameter", + "logicalId": "Doc", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupEgress" + "resourceType": "AWS::SSM::Document" }, - "propertyPath": "Properties.GroupId", + "propertyPath": "Properties.Content", "category": "Best Practice", - "startLine": 81, + "startLine": 7, "startColumn": 7, - "endLine": 81, + "endLine": 7, "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ssm", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'SecurityGroup'" + "lifecycle": "conditional-create-only" } }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'IpProtocol' is create-only; updating it will cause resource replacement", + "message": "Resource 'Doc' of type 'AWS::SSM::Document' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "EgressFromParameter", + "logicalId": "Doc", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupEgress" + "resourceType": "AWS::SSM::Document" }, - "propertyPath": "Properties.IpProtocol", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 82, - "startColumn": 7, - "endLine": 82, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "good/ssm_parameter_name_type.yaml": { + "filePath": "good/ssm_parameter_name_type.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 2, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'CidrIp' is create-only; updating it will cause resource replacement", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "EgressFromParameter", + "logicalId": "Bucket", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupEgress" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.CidrIp", + "propertyPath": "Properties.BucketName", "category": "Best Practice", - "startLine": 83, + "startLine": 11, "startColumn": 7, - "endLine": 83, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 11, + "endColumn": 17, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "parameter 'SsmParamName' (type AWS::SSM::Parameter::Name)" } }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'FromPort' is create-only; updating it will cause resource replacement", + "message": "Resource 'Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "EgressFromParameter", + "logicalId": "Bucket", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupEgress" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.FromPort", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 84, - "startColumn": 7, - "endLine": 84, + "startLine": 10, + "startColumn": 5, + "endLine": 10, "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter 'DbPort' (type Number)" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "good/stackset_conditional_template_source.yaml": { + "filePath": "good/stackset_conditional_template_source.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 2, + "debug": 0 }, - { - "ruleId": "I9001", + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ToPort' is create-only; updating it will cause resource replacement", + "message": "Property 'StackSetName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "EgressFromParameter", + "logicalId": "ConditionalTemplateSource", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroupEgress" + "resourceType": "AWS::CloudFormation::StackSet" }, - "propertyPath": "Properties.ToPort", + "propertyPath": "Properties.StackSetName", "category": "Best Practice", - "startLine": 85, + "startLine": 8, "startColumn": 7, - "endLine": 85, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 8, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-cloudformation.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter 'DbPort' (type Number)" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'DomainName' is create-only; updating it will cause resource replacement", + "message": "Property 'PermissionModel' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Certificate", + "logicalId": "ConditionalTemplateSource", "entityType": "Resource", - "resourceType": "AWS::CertificateManager::Certificate" + "resourceType": "AWS::CloudFormation::StackSet" }, - "propertyPath": "Properties.DomainName", + "propertyPath": "Properties.PermissionModel", "category": "Best Practice", - "startLine": 89, + "startLine": 9, "startColumn": 7, - "endLine": 89, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-acmpca", + "endLine": 9, + "endColumn": 22, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-cloudformation.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only" } + } + ] + }, + "good/stepfunctions_valid.yaml": { + "filePath": "good/stepfunctions_valid.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 1, + "informational": 1, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "W9002", + "severity": "WARN", + "message": "Property 'RoleArn' has a hardcoded ARN - use Ref, GetAtt, or a parameter instead", + "source": "ENGINE", + "entity": { + "logicalId": "SM", + "entityType": "Resource", + "resourceType": "AWS::StepFunctions::StateMachine" + }, + "propertyPath": "Properties.RoleArn", + "category": "Best Practice", + "startLine": 20, + "startColumn": 7, + "endLine": 20, + "endColumn": 14, + "ruleDescription": "Hardcoded ARN property", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'SM' of type 'AWS::StepFunctions::StateMachine' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "SM", + "entityType": "Resource", + "resourceType": "AWS::StepFunctions::StateMachine" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "good/string_length_unknowable_values.json": { + "filePath": "good/string_length_unknowable_values.json", + "status": "OK", + "metadata": { + "resourcesScanned": 5, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 9, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "TargetGroup", + "logicalId": "JoinedFromAReference", "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancingV2::TargetGroup" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.BucketName", "category": "Best Practice", - "startLine": 103, - "startColumn": 7, - "endLine": 103, - "endColumn": 12, + "startLine": 16, + "startColumn": 9, + "endLine": 16, + "endColumn": 20, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "Ref to 'Vpc'" + "resolutionSource": "dynamic (Join:{ref:NameProviderWithADeliberatelyLongLogicalIdentifierForThisTest}-data)" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Port' is create-only; updating it will cause resource replacement", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "TargetGroup", + "logicalId": "JoinedFromAParameter", "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancingV2::TargetGroup" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.Port", + "propertyPath": "Properties.BucketName", "category": "Best Practice", - "startLine": 104, - "startColumn": 7, - "endLine": 104, - "endColumn": 11, + "startLine": 24, + "startColumn": 9, + "endLine": 24, + "endColumn": 20, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "dynamic (Join:{dynamic}-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Protocol' is create-only; updating it will cause resource replacement", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "TargetGroup", + "logicalId": "SubstitutedFromAParameter", "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancingV2::TargetGroup" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.Protocol", + "propertyPath": "Properties.BucketName", "category": "Best Practice", - "startLine": 105, - "startColumn": 7, - "endLine": 105, - "endColumn": 15, + "startLine": 38, + "startColumn": 9, + "endLine": 38, + "endColumn": 20, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "dynamic (Sub:${NamePrefix}-data)" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'LoadBalancerArn' is create-only; updating it will cause resource replacement", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "HttpsListener", + "logicalId": "OnlySomeChoicesTooLong", "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancingV2::Listener" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.LoadBalancerArn", + "propertyPath": "Properties.BucketName", "category": "Best Practice", - "startLine": 112, - "startColumn": 7, - "endLine": 112, - "endColumn": 22, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-elasticloadbalancingv2.git", + "startLine": 44, + "startColumn": 9, + "endLine": 44, + "endColumn": 20, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "Ref to 'LoadBalancer'" + "resolutionSource": "parameter with AllowedValues" } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'HttpsListener' of type 'AWS::ElasticLoadBalancingV2::Listener' supports Tags but none are configured", + "message": "Resource 'NameProviderWithADeliberatelyLongLogicalIdentifierForThisTest' of type 'AWS::SNS::Topic' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "HttpsListener", + "logicalId": "NameProviderWithADeliberatelyLongLogicalIdentifierForThisTest", "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancingV2::Listener" + "resourceType": "AWS::SNS::Topic" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 111, + "startLine": 10, "startColumn": 5, - "endLine": 111, - "endColumn": 15, + "endLine": 10, + "endColumn": 67, "ruleDescription": "Resource should have Tags", "phase": "LINT" - } - ] - }, - "good/vpc_subnets.yaml": { - "filePath": "good/vpc_subnets.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 4, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 2, - "informational": 12, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "W3010", - "severity": "WARN", - "message": "Avoid hardcoding availability zones 'us-east-1a'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'JoinedFromAReference' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "SubnetA", + "logicalId": "JoinedFromAReference", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.AvailabilityZone", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", "startLine": 15, "startColumn": 7, "endLine": 15, - "endColumn": 23, - "ruleDescription": "Availability zone properties should not be hardcoded", + "endColumn": 18, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "W3010", - "severity": "WARN", - "message": "Avoid hardcoding availability zones 'us-east-1b'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'JoinedFromAParameter' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "SubnetB", + "logicalId": "JoinedFromAParameter", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.AvailabilityZone", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 21, + "startLine": 23, "startColumn": 7, - "endLine": 21, - "endColumn": 23, - "ruleDescription": "Availability zone properties should not be hardcoded", + "endLine": 23, + "endColumn": 18, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Resource 'SubstitutedFromAParameter' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "MyVPC", + "logicalId": "SubstitutedFromAParameter", "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 6, + "startLine": 37, "startColumn": 7, - "endLine": 6, - "endColumn": 16, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "endLine": 37, + "endColumn": 18, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'OnlySomeChoicesTooLong' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "OnlySomeChoicesTooLong", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 43, + "startColumn": 7, + "endLine": 43, + "endColumn": 18, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "good/sub_not_needed.yaml": { + "filePath": "good/sub_not_needed.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 2, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SubnetA", + "logicalId": "Bucket", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.BucketName", "category": "Best Practice", - "startLine": 13, + "startLine": 9, "startColumn": 7, - "endLine": 13, - "endColumn": 12, + "endLine": 9, + "endColumn": 17, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "Ref to 'MyVPC'" + "resolutionSource": "dynamic (Sub:${MyParam}-bucket)" } }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "Bucket", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 8, + "startColumn": 5, + "endLine": 8, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "good/subnet_cidrs_across_vpcs_and_secondary_blocks.yaml": { + "filePath": "good/subnet_cidrs_across_vpcs_and_secondary_blocks.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 12, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 22, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { "ruleId": "I9001", "severity": "INFO", "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SubnetA", + "logicalId": "VpcA", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::EC2::VPC" }, "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 14, + "startLine": 17, "startColumn": 7, - "endLine": 14, + "endLine": 17, "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", @@ -6476,19 +5750,19 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SubnetA", + "logicalId": "VpcB", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::EC2::VPC" }, - "propertyPath": "Properties.AvailabilityZone", + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 15, + "startLine": 24, "startColumn": 7, - "endLine": 15, - "endColumn": 23, + "endLine": 24, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -6501,21 +5775,21 @@ "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SubnetB", + "logicalId": "VpcASecondaryBlock", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::EC2::VPCCidrBlock" }, "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 19, + "startLine": 31, "startColumn": 7, - "endLine": 19, + "endLine": 31, "endColumn": 12, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "Ref to 'MyVPC'" + "resolutionSource": "Ref to 'VpcA'" } }, { @@ -6524,15 +5798,15 @@ "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SubnetB", + "logicalId": "VpcASecondaryBlock", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::EC2::VPCCidrBlock" }, "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 20, + "startLine": 32, "startColumn": 7, - "endLine": 20, + "endLine": 32, "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", @@ -6543,41 +5817,42 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SubnetB", + "logicalId": "SubnetA1", "entityType": "Resource", "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.AvailabilityZone", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 21, + "startLine": 36, "startColumn": 7, - "endLine": 21, - "endColumn": 23, + "endLine": 36, + "endColumn": 12, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'VpcA'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SecurityGroup", + "logicalId": "SubnetA1", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.GroupDescription", + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 25, + "startLine": 37, "startColumn": 7, - "endLine": 25, - "endColumn": 23, + "endLine": 37, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -6590,162 +5865,129 @@ "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SecurityGroup", + "logicalId": "SubnetB1", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::EC2::Subnet" }, "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 26, + "startLine": 44, "startColumn": 7, - "endLine": 26, + "endLine": 44, "endColumn": 12, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "Ref to 'MyVPC'" + "resolutionSource": "Ref to 'VpcB'" } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'SubnetA' of type 'AWS::EC2::Subnet' supports Tags but none are configured", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SubnetA", + "logicalId": "SubnetB1", "entityType": "Resource", "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 12, - "startColumn": 5, - "endLine": 12, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 45, + "startColumn": 7, + "endLine": 45, + "endColumn": 16, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'SubnetB' of type 'AWS::EC2::Subnet' supports Tags but none are configured", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SubnetB", + "logicalId": "SubnetA2ViaAttribute", "entityType": "Resource", "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 18, - "startColumn": 5, - "endLine": 18, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'SecurityGroup' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "SecurityGroup", - "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 24, - "startColumn": 5, - "endLine": 24, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "integration/availability-zones.yaml": { - "filePath": "integration/availability-zones.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 2, - "errors": 0, - "warnings": 0, - "informational": 5, - "debug": 0 + "startLine": 52, + "startColumn": 7, + "endLine": 52, + "endColumn": 12, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "GetAtt VpcA.VpcId" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "F3020", - "severity": "FATAL", - "message": "'AvailabilityZoneId' should not be included with 'AvailabilityZone'", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Subnet", + "logicalId": "SubnetA2ViaAttribute", "entityType": "Resource", "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.AvailabilityZoneId", - "category": "Schema", - "startLine": 5, + "propertyPath": "Properties.CidrBlock", + "category": "Best Practice", + "startLine": 53, "startColumn": 7, - "endLine": 5, - "endColumn": 25, - "ruleDescription": "Mutually exclusive properties", + "endLine": 53, + "endColumn": 16, + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "property": "AvailabilityZoneId" + "lifecycle": "create-only" } }, { - "ruleId": "F3020", - "severity": "FATAL", - "message": "'AvailabilityZone' should not be included with 'AvailabilityZoneId'", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Subnet", + "logicalId": "SubnetInSecondaryBlock", "entityType": "Resource", "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.AvailabilityZone", - "category": "Schema", - "startLine": 6, + "propertyPath": "Properties.VpcId", + "category": "Best Practice", + "startLine": 60, "startColumn": 7, - "endLine": 6, - "endColumn": 23, - "ruleDescription": "Mutually exclusive properties", + "endLine": 60, + "endColumn": 12, + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "property": "AvailabilityZone" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'VpcA'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'AvailabilityZoneId' is create-only; updating it will cause resource replacement", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Subnet", + "logicalId": "SubnetInSecondaryBlock", "entityType": "Resource", "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.AvailabilityZoneId", + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 5, + "startLine": 61, "startColumn": 7, - "endLine": 5, - "endColumn": 25, + "endLine": 61, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -6755,23 +5997,24 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Subnet", + "logicalId": "SubnetProdOrDev", "entityType": "Resource", "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.AvailabilityZone", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 6, + "startLine": 68, "startColumn": 7, - "endLine": 6, - "endColumn": 23, + "endLine": 68, + "endColumn": 12, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'VpcA'" } }, { @@ -6780,20 +6023,21 @@ "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Subnet", + "logicalId": "SubnetProdOrDev", "entityType": "Resource", "resourceType": "AWS::EC2::Subnet" }, "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 10, + "startLine": 69, "startColumn": 7, - "endLine": 10, + "endLine": 69, "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "Fn::If on condition 'IsProd'" } }, { @@ -6802,296 +6046,255 @@ "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Subnet", + "logicalId": "SubnetDevOrProd", "entityType": "Resource", "resourceType": "AWS::EC2::Subnet" }, "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 11, + "startLine": 76, "startColumn": 7, - "endLine": 11, + "endLine": 76, "endColumn": 12, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'VpcA'" } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'Subnet' of type 'AWS::EC2::Subnet' supports Tags but none are configured", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Subnet", + "logicalId": "SubnetDevOrProd", "entityType": "Resource", "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 4, - "startColumn": 5, - "endLine": 4, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "integration/aws-dynamodb-table.yaml": { - "filePath": "integration/aws-dynamodb-table.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 4, - "counts": { - "fatal": 1, - "errors": 0, - "warnings": 1, - "informational": 10, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "F3021", - "severity": "FATAL", - "message": "'SSEType' is a dependency of 'KMSMasterKeyId'", - "source": "SCHEMA", - "entity": { - "logicalId": "Table1", - "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" - }, - "propertyPath": "Properties.SSESpecification", - "suggestedFix": "Add 'SSEType' when 'KMSMasterKeyId' is specified", - "category": "Schema", - "startLine": 22, + "startLine": 77, "startColumn": 7, - "endLine": 22, - "endColumn": 23, - "ruleDescription": "Dependent property required", - "phase": "SCHEMA" - }, - { - "ruleId": "W3030", - "severity": "WARN", - "message": "'AES256' is not one of ['KMS']", - "source": "CFN_LINT", - "entity": { - "logicalId": "Table2", - "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" - }, - "propertyPath": "Properties.SSESpecification.SSEType", - "category": "Schema", - "startLine": 44, - "startColumn": 9, - "endLine": 44, + "endLine": 77, "endColumn": 16, - "ruleDescription": "Value not in allowed enum", + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "actualValue": "AES256", - "extra": { - "allowed_values": [ - "KMS" - ] - } + "lifecycle": "create-only", + "resolutionSource": "Fn::If on condition 'IsProd'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'TableName' is create-only; updating it will cause resource replacement", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Table1", + "logicalId": "SubnetFromAttribute", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.TableName", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 12, + "startLine": 84, "startColumn": 7, - "endLine": 12, - "endColumn": 16, + "endLine": 84, + "endColumn": 12, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'VpcA'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Table1", + "logicalId": "SubnetFromAttribute", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.KeySchema", + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 16, + "startLine": 85, "startColumn": 7, - "endLine": 16, + "endLine": 85, "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only", + "resolutionSource": "GetAtt VpcA.CidrBlock" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'TableName' is create-only; updating it will cause resource replacement", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Table2", + "logicalId": "SubnetFromImport", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.TableName", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 31, + "startLine": 92, "startColumn": 7, - "endLine": 31, - "endColumn": 16, + "endLine": 92, + "endColumn": 12, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'VpcA'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Table2", + "logicalId": "SubnetFromImport", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.KeySchema", + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 35, + "startLine": 93, "startColumn": 7, - "endLine": 35, + "endLine": 93, "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only", + "resolutionSource": "dynamic (cross-stack import: SharedSubnetCidr)" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'TableName' is create-only; updating it will cause resource replacement", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Table3", + "logicalId": "SubnetFromCidrFunction", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.TableName", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 50, + "startLine": 100, "startColumn": 7, - "endLine": 50, - "endColumn": 16, + "endLine": 100, + "endColumn": 12, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'VpcA'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Table3", + "logicalId": "SubnetFromCidrFunction", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.KeySchema", + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 59, + "startLine": 101, "startColumn": 7, - "endLine": 59, + "endLine": 101, "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only", + "resolutionSource": "dynamic (Select with unresolvable arguments)" } + } + ] + }, + "good/transform.yaml": { + "filePath": "good/transform.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 3, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 4, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9040", + "ruleId": "I3011", "severity": "INFO", - "message": "Resource 'KMS' of type 'AWS::KMS::Key' supports Tags but none are configured", - "source": "ENGINE", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "KMS", + "logicalId": "AppName", "entityType": "Resource", - "resourceType": "AWS::KMS::Key" + "resourceType": "AWS::Serverless::Application" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 3, + "startLine": 18, "startColumn": 3, - "endLine": 3, - "endColumn": 6, - "ruleDescription": "Resource should have Tags", + "endLine": 18, + "endColumn": 10, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "I9040", + "ruleId": "I3011", "severity": "INFO", - "message": "Resource 'Table1' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "Table1", + "logicalId": "AppName", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::Serverless::Application" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 11, - "startColumn": 5, - "endLine": 11, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", + "startLine": 18, + "startColumn": 3, + "endLine": 18, + "endColumn": 10, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Table2' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", + "message": "Resource 'MyServerlessFunctionLogicalID' of type 'AWS::Serverless::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Table2", + "logicalId": "MyServerlessFunctionLogicalID", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::Serverless::Function" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 30, + "startLine": 7, "startColumn": 5, - "endLine": 30, + "endLine": 7, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -7099,32 +6302,32 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Table3' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", + "message": "Resource 'AppName' of type 'AWS::Serverless::Application' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Table3", + "logicalId": "AppName", "entityType": "Resource", - "resourceType": "AWS::DynamoDB::Table" + "resourceType": "AWS::Serverless::Application" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 49, + "startLine": 20, "startColumn": 5, - "endLine": 49, + "endLine": 20, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "integration/aws-ec2-instance.yaml": { - "filePath": "integration/aws-ec2-instance.yaml", + "good/transform/applications_location.yaml": { + "filePath": "good/transform/applications_location.yaml", "status": "OK", "metadata": { "resourcesScanned": 2, "counts": { - "fatal": 4, + "fatal": 0, "errors": 0, "warnings": 0, "informational": 6, @@ -7136,227 +6339,263 @@ }, "diagnostics": [ { - "ruleId": "F3020", - "severity": "FATAL", - "message": "'AssociateCarrierIpAddress' should not be included with 'NetworkInterfaceId'", - "source": "SCHEMA", + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "Instance", + "logicalId": "App1", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::Serverless::Application" }, - "propertyPath": "Properties.NetworkInterfaces.0.AssociateCarrierIpAddress", - "category": "Schema", - "startLine": 14, - "startColumn": 11, - "endLine": 14, - "endColumn": 36, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Mutually exclusive properties", - "phase": "SCHEMA", - "context": { - "property": "AssociateCarrierIpAddress" - } + "category": "Best Practice", + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 7, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "F3020", - "severity": "FATAL", - "message": "'AssociatePublicIpAddress' should not be included with 'NetworkInterfaceId'", - "source": "SCHEMA", + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "Instance", + "logicalId": "App1", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::Serverless::Application" }, - "propertyPath": "Properties.NetworkInterfaces.0.AssociatePublicIpAddress", - "category": "Schema", - "startLine": 15, - "startColumn": 11, - "endLine": 15, - "endColumn": 35, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Mutually exclusive properties", - "phase": "SCHEMA", - "context": { - "property": "AssociatePublicIpAddress" - } + "category": "Best Practice", + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 7, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "F3020", - "severity": "FATAL", - "message": "'NetworkInterfaceId' should not be included with 'AssociateCarrierIpAddress'", - "source": "SCHEMA", + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "Instance", + "logicalId": "App2", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::Serverless::Application" }, - "propertyPath": "Properties.NetworkInterfaces.0.NetworkInterfaceId", - "category": "Schema", - "startLine": 17, - "startColumn": 11, - "endLine": 17, - "endColumn": 29, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Mutually exclusive properties", - "phase": "SCHEMA", - "context": { - "property": "NetworkInterfaceId" - } + "category": "Best Practice", + "startLine": 7, + "startColumn": 3, + "endLine": 7, + "endColumn": 7, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "F3020", - "severity": "FATAL", - "message": "'NetworkInterfaceId' should not be included with 'AssociatePublicIpAddress'", - "source": "SCHEMA", + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "Instance", + "logicalId": "App2", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::Serverless::Application" }, - "propertyPath": "Properties.NetworkInterfaces.0.NetworkInterfaceId", - "category": "Schema", - "startLine": 17, - "startColumn": 11, - "endLine": 17, - "endColumn": 29, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Mutually exclusive properties", - "phase": "SCHEMA", - "context": { - "property": "NetworkInterfaceId" - } + "category": "Best Practice", + "startLine": 7, + "startColumn": 3, + "endLine": 7, + "endColumn": 7, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", + "message": "Resource 'App1' of type 'AWS::Serverless::Application' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "NetworkInterface", + "logicalId": "App1", "entityType": "Resource", - "resourceType": "AWS::EC2::NetworkInterface" + "resourceType": "AWS::Serverless::Application" }, - "propertyPath": "Properties.SubnetId", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 7, - "startColumn": 7, - "endLine": 7, + "startLine": 5, + "startColumn": 5, + "endLine": 5, "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2/networkinterface", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "message": "Resource 'App2' of type 'AWS::Serverless::Application' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Instance", + "logicalId": "App2", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::Serverless::Application" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 11, - "startColumn": 7, - "endLine": 11, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 9, + "startColumn": 5, + "endLine": 9, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "good/transform/auto_publish_alias.yaml": { + "filePath": "good/transform/auto_publish_alias.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 2, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 2, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", + "message": "Resource 'SkillFunction' of type 'AWS::Serverless::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Instance", + "logicalId": "SkillFunction", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::Serverless::Function" }, - "propertyPath": "Properties.InstanceType", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 12, - "startColumn": 7, - "endLine": 12, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 22, + "startColumn": 5, + "endLine": 22, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'NetworkInterfaces' is create-only; updating it will cause resource replacement", + "message": "Resource 'SkillFunction2' of type 'AWS::Serverless::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Instance", + "logicalId": "SkillFunction2", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::Serverless::Function" }, - "propertyPath": "Properties.NetworkInterfaces", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 13, - "startColumn": 7, - "endLine": 13, - "endColumn": 24, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 31, + "startColumn": 5, + "endLine": 31, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "good/transform/auto_publish_code_sha256.yaml": { + "filePath": "good/transform/auto_publish_code_sha256.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 1, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9003", + "ruleId": "I9040", "severity": "INFO", - "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", + "message": "Resource 'LambdaFunction' of type 'AWS::Serverless::Function' supports Tags but none are configured", "source": "ENGINE", + "entity": { + "logicalId": "LambdaFunction", + "entityType": "Resource", + "resourceType": "AWS::Serverless::Function" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", + "startLine": 12, + "startColumn": 5, + "endLine": 12, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "good/transform/function_use_s3_uri.yaml": { + "filePath": "good/transform/function_use_s3_uri.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 1, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'NetworkInterface' of type 'AWS::EC2::NetworkInterface' supports Tags but none are configured", + "message": "Resource 'Function' of type 'AWS::Serverless::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "NetworkInterface", + "logicalId": "Function", "entityType": "Resource", - "resourceType": "AWS::EC2::NetworkInterface" + "resourceType": "AWS::Serverless::Function" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 4, + "startLine": 18, "startColumn": 5, - "endLine": 4, + "endLine": 18, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "integration/aws-ec2-launchtemplate.yaml": { - "filePath": "integration/aws-ec2-launchtemplate.yaml", + "good/transform/function_using_image.yaml": { + "filePath": "good/transform/function_using_image.yaml", "status": "OK", "metadata": { "resourcesScanned": 1, "counts": { - "fatal": 5, + "fatal": 0, "errors": 0, "warnings": 0, "informational": 1, @@ -7368,673 +6607,655 @@ }, "diagnostics": [ { - "ruleId": "F1020", - "severity": "FATAL", - "message": "'NetworkInterface' is not one of ['AWS::AccountId', 'AWS::NoValue', 'AWS::NotificationARNs', 'AWS::Partition', 'AWS::Region', 'AWS::StackId', 'AWS::StackName', 'AWS::URLSuffix', 'LaunchTemplate']", - "source": "SCHEMA", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'HelloWorldFunction' of type 'AWS::Serverless::Function' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "LaunchTemplate", + "logicalId": "HelloWorldFunction", "entityType": "Resource", - "resourceType": "AWS::EC2::LaunchTemplate" + "resourceType": "AWS::Serverless::Function" }, - "propertyPath": "Properties.LaunchTemplateData.NetworkInterfaces.0.NetworkInterfaceId", - "suggestedFix": "Check that the Ref target exists as a resource, parameter, or pseudo-parameter", - "category": "Intrinsic Function", - "startLine": 13, - "startColumn": 13, - "endLine": 13, - "endColumn": 31, - "ruleDescription": "Ref/GetAtt target must exist", - "phase": "SCHEMA" + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 6, + "startColumn": 5, + "endLine": 6, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "good/transform/include_object_form.yaml": { + "filePath": "good/transform/include_object_form.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 0, + "debug": 0 }, - { - "ruleId": "F3020", - "severity": "FATAL", - "message": "'AssociateCarrierIpAddress' should not be included with 'NetworkInterfaceId'", - "source": "SCHEMA", - "entity": { - "logicalId": "LaunchTemplate", + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [] + }, + "good/transform/language_extension.yaml": { + "filePath": "good/transform/language_extension.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 7, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 2, + "informational": 14, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "W2531", + "severity": "WARN", + "message": "Runtime 'python3.9' was deprecated on '2025-12-15'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'python3.14'", + "source": "CFN_LINT", + "entity": { + "logicalId": "TestLambdaFunction", "entityType": "Resource", - "resourceType": "AWS::EC2::LaunchTemplate" + "resourceType": "AWS::Serverless::Function" }, - "propertyPath": "Properties.LaunchTemplateData.NetworkInterfaces.0.AssociateCarrierIpAddress", - "category": "Schema", - "startLine": 10, - "startColumn": 13, - "endLine": 10, - "endColumn": 38, - "ruleDescription": "Mutually exclusive properties", + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 78, + "startColumn": 7, + "endLine": 78, + "endColumn": 14, + "ruleDescription": "Check if EOL Lambda Function Runtimes are used", "phase": "SCHEMA", "context": { - "property": "AssociateCarrierIpAddress" + "actualValue": "python3.9", + "lifecycle": "deprecated" } }, { - "ruleId": "F3020", - "severity": "FATAL", - "message": "'AssociatePublicIpAddress' should not be included with 'NetworkInterfaceId'", - "source": "SCHEMA", + "ruleId": "W9008", + "severity": "WARN", + "message": "RDS instance should have StorageEncrypted set to true", + "source": "ENGINE", "entity": { - "logicalId": "LaunchTemplate", + "logicalId": "PolicyList", "entityType": "Resource", - "resourceType": "AWS::EC2::LaunchTemplate" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.LaunchTemplateData.NetworkInterfaces.0.AssociatePublicIpAddress", - "category": "Schema", - "startLine": 11, - "startColumn": 13, - "endLine": 11, - "endColumn": 37, - "ruleDescription": "Mutually exclusive properties", - "phase": "SCHEMA", - "context": { - "property": "AssociatePublicIpAddress" - } + "propertyPath": "Properties.StorageEncrypted", + "suggestedFix": "Set StorageEncrypted to true", + "category": "Security", + "startLine": 51, + "startColumn": 5, + "endLine": 51, + "endColumn": 15, + "ruleDescription": "RDS instance should have StorageEncrypted", + "phase": "LINT" }, { - "ruleId": "F3020", - "severity": "FATAL", - "message": "'NetworkInterfaceId' should not be included with 'AssociateCarrierIpAddress'", - "source": "SCHEMA", + "ruleId": "I3013", + "severity": "INFO", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "LaunchTemplate", + "logicalId": "PolicyList", "entityType": "Resource", - "resourceType": "AWS::EC2::LaunchTemplate" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.LaunchTemplateData.NetworkInterfaces.0.NetworkInterfaceId", - "category": "Schema", - "startLine": 13, - "startColumn": 13, - "endLine": 13, - "endColumn": 31, - "ruleDescription": "Mutually exclusive properties", - "phase": "SCHEMA", - "context": { - "property": "NetworkInterfaceId" - } + "propertyPath": "Properties", + "category": "Best Practice", + "startLine": 51, + "startColumn": 5, + "endLine": 51, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "phase": "LINT" }, { - "ruleId": "F3020", - "severity": "FATAL", - "message": "'NetworkInterfaceId' should not be included with 'AssociatePublicIpAddress'", - "source": "SCHEMA", + "ruleId": "I3100", + "severity": "INFO", + "message": "Previous generation instance type 'db.m1.small' - consider upgrading", + "source": "CFN_LINT", "entity": { - "logicalId": "LaunchTemplate", + "logicalId": "PolicyList", "entityType": "Resource", - "resourceType": "AWS::EC2::LaunchTemplate" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.LaunchTemplateData.NetworkInterfaces.0.NetworkInterfaceId", - "category": "Schema", - "startLine": 13, - "startColumn": 13, - "endLine": 13, - "endColumn": 31, - "ruleDescription": "Mutually exclusive properties", - "phase": "SCHEMA", - "context": { - "property": "NetworkInterfaceId" - } + "propertyPath": "Properties.DBInstanceClass", + "suggestedFix": "Upgrade to a current generation instance type", + "category": "Best Practice", + "startLine": 53, + "startColumn": 7, + "endLine": 53, + "endColumn": 22, + "ruleDescription": "Checks for legacy instance type generations", + "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'LaunchTemplateName' is create-only; updating it will cause resource replacement", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "LaunchTemplate", + "logicalId": "PolicyList", "entityType": "Resource", - "resourceType": "AWS::EC2::LaunchTemplate" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.LaunchTemplateName", + "propertyPath": "Properties.Engine", "category": "Best Practice", - "startLine": 14, + "startLine": 54, "startColumn": 7, - "endLine": 14, - "endColumn": 25, + "endLine": 54, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } - } - ] - }, - "integration/aws-ec2-networkinterface.yaml": { - "filePath": "integration/aws-ec2-networkinterface.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 2, - "errors": 0, - "warnings": 0, - "informational": 2, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "F3020", - "severity": "FATAL", - "message": "'Ipv6Addresses' should not be included with 'Ipv6AddressCount'", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "NetworkInterface", + "logicalId": "SecurityGroups", "entityType": "Resource", - "resourceType": "AWS::EC2::NetworkInterface" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.Ipv6Addresses", - "category": "Schema", - "startLine": 15, + "propertyPath": "Properties.GroupDescription", + "category": "Best Practice", + "startLine": 87, "startColumn": 7, - "endLine": 15, - "endColumn": 20, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2/networkinterface", - "ruleDescription": "Mutually exclusive properties", + "endLine": 87, + "endColumn": 23, + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "property": "Ipv6Addresses" + "lifecycle": "create-only" } }, { - "ruleId": "F3020", - "severity": "FATAL", - "message": "'Ipv6AddressCount' should not be included with 'Ipv6Addresses'", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "NetworkInterface", + "logicalId": "SecurityGroups", "entityType": "Resource", - "resourceType": "AWS::EC2::NetworkInterface" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.Ipv6AddressCount", - "category": "Schema", - "startLine": 17, + "propertyPath": "Properties.VpcId", + "category": "Best Practice", + "startLine": 88, "startColumn": 7, - "endLine": 17, - "endColumn": 23, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2/networkinterface", - "ruleDescription": "Mutually exclusive properties", + "endLine": 88, + "endColumn": 12, + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "property": "Ipv6AddressCount" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "NetworkInterface", + "logicalId": "MySubnet", "entityType": "Resource", - "resourceType": "AWS::EC2::NetworkInterface" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.SubnetId", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 14, - "startColumn": 7, - "endLine": 14, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2/networkinterface", + "startLine": 93, + "startColumn": 9, + "endLine": 93, + "endColumn": 14, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "parameter 'SubnetId' (type AWS::EC2::Subnet::Id)" + "resolutionSource": "parameter 'MyVpc' (type AWS::EC2::VPC::Id)" } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'NetworkInterface' of type 'AWS::EC2::NetworkInterface' supports Tags but none are configured", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "NetworkInterface", - "entityType": "Resource", - "resourceType": "AWS::EC2::NetworkInterface" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 9, - "startColumn": 5, - "endLine": 9, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "integration/aws-ec2-subnet.yaml": { - "filePath": "integration/aws-ec2-subnet.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 5, - "counts": { - "fatal": 5, - "errors": 0, - "warnings": 0, - "informational": 18, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "F3020", - "severity": "FATAL", - "message": "'CidrBlock' should not be included with 'Ipv4IpamPoolId'", - "source": "SCHEMA", - "entity": { - "logicalId": "Subnet5", + "logicalId": "MySubnet", "entityType": "Resource", "resourceType": "AWS::EC2::Subnet" }, "propertyPath": "Properties.CidrBlock", - "category": "Schema", - "startLine": 30, - "startColumn": 7, - "endLine": 30, - "endColumn": 16, - "ruleDescription": "Mutually exclusive properties", + "category": "Best Practice", + "startLine": 94, + "startColumn": 9, + "endLine": 94, + "endColumn": 18, + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "property": "CidrBlock" + "lifecycle": "create-only" } }, { - "ruleId": "F3020", - "severity": "FATAL", - "message": "'Ipv4IpamPoolId' should not be included with 'CidrBlock'", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'AvailabilityZoneId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Subnet5", + "logicalId": "MySubnet", "entityType": "Resource", "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.Ipv4IpamPoolId", - "category": "Schema", - "startLine": 31, - "startColumn": 7, - "endLine": 31, - "endColumn": 21, - "ruleDescription": "Mutually exclusive properties", + "propertyPath": "Properties.AvailabilityZoneId", + "category": "Best Practice", + "startLine": 95, + "startColumn": 9, + "endLine": 95, + "endColumn": 27, + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "property": "Ipv4IpamPoolId" + "lifecycle": "create-only" } }, { - "ruleId": "F3021", - "severity": "FATAL", - "message": "'Ipv4IpamPoolId' is a dependency of 'Ipv4NetmaskLength'", - "source": "SCHEMA", + "ruleId": "I9003", + "severity": "INFO", + "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", + "source": "ENGINE", + "category": "Best Practice", + "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'PolicyList' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Subnet1", + "logicalId": "PolicyList", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties", - "suggestedFix": "Add 'Ipv4IpamPoolId' when 'Ipv4NetmaskLength' is specified", - "category": "Schema", - "startLine": 7, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 51, "startColumn": 5, - "endLine": 7, + "endLine": 51, "endColumn": 15, - "ruleDescription": "Dependent property required", - "phase": "SCHEMA" + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "F3021", - "severity": "FATAL", - "message": "'Ipv4NetmaskLength' is a dependency of 'Ipv4IpamPoolId'", - "source": "SCHEMA", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'TestStateMachine' of type 'AWS::Serverless::StateMachine' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Subnet3", + "logicalId": "TestStateMachine", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::Serverless::StateMachine" }, - "propertyPath": "Properties", - "suggestedFix": "Add 'Ipv4NetmaskLength' when 'Ipv4IpamPoolId' is specified", - "category": "Schema", - "startLine": 17, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 63, "startColumn": 5, - "endLine": 17, + "endLine": 63, "endColumn": 15, - "ruleDescription": "Dependent property required", - "phase": "SCHEMA" + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "F3058", - "severity": "FATAL", - "message": "One of ['CidrBlock', 'Ipv4IpamPoolId', 'Ipv6IpamPoolId', 'Ipv6CidrBlock'] is a required property", - "source": "SCHEMA", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'TestLambdaFunction' of type 'AWS::Serverless::Function' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Subnet2", + "logicalId": "TestLambdaFunction", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::Serverless::Function" }, - "propertyPath": "Properties", - "category": "Schema", - "startLine": 13, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 76, "startColumn": 5, - "endLine": 13, + "endLine": 76, "endColumn": 15, - "ruleDescription": "One of properties required (requiredOr)", - "phase": "SCHEMA" + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "message": "Resource 'SecurityGroups' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Subnet1", + "logicalId": "SecurityGroups", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 8, - "startColumn": 7, - "endLine": 8, - "endColumn": 12, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter 'Vpc' (type AWS::EC2::VPC::Id)" - } + "startLine": 86, + "startColumn": 5, + "endLine": 86, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Resource 'MySubnet' of type 'AWS::EC2::Subnet' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Subnet1", + "logicalId": "MySubnet", "entityType": "Resource", "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 9, - "startColumn": 7, - "endLine": 9, - "endColumn": 16, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 92, + "startColumn": 5, + "endLine": 92, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "good/transform/list_transform.yaml": { + "filePath": "good/transform/list_transform.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 1, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Ipv4NetmaskLength' is create-only; updating it will cause resource replacement", + "message": "Resource 'SkillFunction' of type 'AWS::Serverless::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Subnet1", + "logicalId": "SkillFunction", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::Serverless::Function" }, - "propertyPath": "Properties.Ipv4NetmaskLength", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 10, - "startColumn": 7, - "endLine": 10, - "endColumn": 24, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Subnet2", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.VpcId", - "category": "Best Practice", - "startLine": 14, - "startColumn": 7, - "endLine": 14, - "endColumn": 12, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter 'Vpc' (type AWS::EC2::VPC::Id)" - } + "startLine": 17, + "startColumn": 5, + "endLine": 17, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "good/transform/list_transform_many.yaml": { + "filePath": "good/transform/list_transform_many.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 1, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "message": "Resource 'Function' of type 'AWS::Serverless::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Subnet3", + "logicalId": "Function", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::Serverless::Function" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 18, - "startColumn": 7, - "endLine": 18, - "endColumn": 12, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter 'Vpc' (type AWS::EC2::VPC::Id)" - } + "startLine": 16, + "startColumn": 5, + "endLine": 16, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "good/transform/list_transform_not_sam.yaml": { + "filePath": "good/transform/list_transform_not_sam.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 1, + "informational": 1, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Ipv4IpamPoolId' is create-only; updating it will cause resource replacement", + "ruleId": "W9013", + "severity": "WARN", + "message": "Hardcoded account ID in ARN - use AWS::AccountId pseudo-parameter", "source": "ENGINE", "entity": { - "logicalId": "Subnet3", + "logicalId": "SkillFunction", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.Ipv4IpamPoolId", - "category": "Best Practice", - "startLine": 19, - "startColumn": 7, - "endLine": 19, - "endColumn": 21, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "category": "Security", + "startLine": 7, + "startColumn": 3, + "endLine": 7, + "endColumn": 16, + "ruleDescription": "Hardcoded account ID in ARN", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "message": "Resource 'SkillFunction' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Subnet4", + "logicalId": "SkillFunction", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 23, - "startColumn": 7, - "endLine": 23, - "endColumn": 12, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter 'Vpc' (type AWS::EC2::VPC::Id)" - } + "startLine": 9, + "startColumn": 5, + "endLine": 9, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "good/transform/step_function_local_definition.yaml": { + "filePath": "good/transform/step_function_local_definition.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 1, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Resource 'StateMachine' of type 'AWS::Serverless::StateMachine' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Subnet4", + "logicalId": "StateMachine", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::Serverless::StateMachine" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 24, - "startColumn": 7, - "endLine": 24, - "endColumn": 16, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 5, + "startColumn": 5, + "endLine": 5, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "good/transform_serverless_api.yaml": { + "filePath": "good/transform_serverless_api.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 2, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 2, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Ipv6CidrBlock' is conditionally create-only; updating it may cause resource replacement", + "message": "Resource 'myFunction' of type 'AWS::Serverless::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Subnet4", + "logicalId": "myFunction", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::Serverless::Function" }, - "propertyPath": "Properties.Ipv6CidrBlock", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 25, - "startColumn": 7, - "endLine": 25, - "endColumn": 20, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 7, + "startColumn": 5, + "endLine": 7, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "message": "Resource 'myApi' of type 'AWS::Serverless::Api' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Subnet5", + "logicalId": "myApi", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::Serverless::Api" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 29, - "startColumn": 7, - "endLine": 29, - "endColumn": 12, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter 'Vpc' (type AWS::EC2::VPC::Id)" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Subnet5", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.CidrBlock", - "category": "Best Practice", - "startLine": 30, - "startColumn": 7, - "endLine": 30, - "endColumn": 16, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Ipv4IpamPoolId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Subnet5", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.Ipv4IpamPoolId", - "category": "Best Practice", - "startLine": 31, - "startColumn": 7, - "endLine": 31, - "endColumn": 21, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Ipv4NetmaskLength' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Subnet5", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.Ipv4NetmaskLength", - "category": "Best Practice", - "startLine": 32, - "startColumn": 7, - "endLine": 32, - "endColumn": 24, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 23, + "startColumn": 5, + "endLine": 23, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "good/transform_serverless_auto_publish_alias.yaml": { + "filePath": "good/transform_serverless_auto_publish_alias.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 2, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 2, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Subnet1' of type 'AWS::EC2::Subnet' supports Tags but none are configured", + "message": "Resource 'LiteralAliasFunction' of type 'AWS::Serverless::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Subnet1", + "logicalId": "LiteralAliasFunction", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::Serverless::Function" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 7, + "startLine": 10, "startColumn": 5, - "endLine": 7, + "endLine": 10, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -8042,39 +7263,58 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Subnet2' of type 'AWS::EC2::Subnet' supports Tags but none are configured", + "message": "Resource 'ParameterAliasFunction' of type 'AWS::Serverless::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Subnet2", + "logicalId": "ParameterAliasFunction", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::Serverless::Function" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 13, + "startLine": 17, "startColumn": 5, - "endLine": 13, + "endLine": 17, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "good/transform_serverless_function.yaml": { + "filePath": "good/transform_serverless_function.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 4, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 3, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Subnet3' of type 'AWS::EC2::Subnet' supports Tags but none are configured", + "message": "Resource 'myApi' of type 'AWS::Serverless::Api' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Subnet3", + "logicalId": "myApi", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::Serverless::Api" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 17, + "startLine": 7, "startColumn": 5, - "endLine": 17, + "endLine": 7, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -8082,19 +7322,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Subnet4' of type 'AWS::EC2::Subnet' supports Tags but none are configured", + "message": "Resource 'myFunction' of type 'AWS::Serverless::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Subnet4", + "logicalId": "myFunction", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::Serverless::Function" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 22, + "startLine": 11, "startColumn": 5, - "endLine": 22, + "endLine": 11, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -8102,35 +7342,35 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Subnet5' of type 'AWS::EC2::Subnet' supports Tags but none are configured", + "message": "Resource 'myBucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Subnet5", + "logicalId": "myBucket", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::S3::Bucket" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 28, + "startLine": 73, "startColumn": 5, - "endLine": 28, + "endLine": 73, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "integration/aws-lambda-function.yaml": { - "filePath": "integration/aws-lambda-function.yaml", + "good/transform_serverless_globals.yaml": { + "filePath": "good/transform_serverless_globals.yaml", "status": "OK", "metadata": { - "resourcesScanned": 2, + "resourcesScanned": 1, "counts": { "fatal": 0, - "errors": 0, + "errors": 1, "warnings": 0, - "informational": 2, + "informational": 1, "debug": 0 }, "suppressed": 0, @@ -8139,57 +7379,60 @@ }, "diagnostics": [ { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Function' of type 'AWS::Lambda::Function' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "E2533", + "severity": "ERROR", + "message": "Runtime 'nodejs6.10' was deprecated on '2019-08-12'. Creation was disabled on '2019-07-12', and updates were disabled on '2019-08-12'. Please consider updating to 'nodejs24.x'", + "source": "CFN_LINT", "entity": { - "logicalId": "Function", + "logicalId": "myFunction", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::Serverless::Function" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 4, + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 5, "startColumn": 5, - "endLine": 4, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "endLine": 5, + "endColumn": 12, + "ruleDescription": "Check if Lambda Function Runtimes are updatable", + "phase": "SCHEMA", + "context": { + "actualValue": "nodejs6.10", + "lifecycle": "end-of-life" + } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Role' of type 'AWS::IAM::Role' supports Tags but none are configured", + "message": "Resource 'myFunction' of type 'AWS::Serverless::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Role", + "logicalId": "myFunction", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::Serverless::Function" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 10, + "startLine": 12, "startColumn": 5, - "endLine": 10, + "endLine": 12, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "integration/cfn-gather.yaml": { - "filePath": "integration/cfn-gather.yaml", + "good/transform_serverless_ignore_globals.yaml": { + "filePath": "good/transform_serverless_ignore_globals.yaml", "status": "OK", "metadata": { - "resourcesScanned": 17, + "resourcesScanned": 3, "counts": { "fatal": 0, - "errors": 7, - "warnings": 1, - "informational": 55, + "errors": 1, + "warnings": 0, + "informational": 3, "debug": 0 }, "suppressed": 0, @@ -8198,5113 +7441,123 @@ }, "diagnostics": [ { - "ruleId": "E3052", - "severity": "ERROR", - "message": "NetworkConfiguration required when TaskDefinition NetworkMode is 'awsvpc'", - "source": "CFN_LINT", - "entity": { - "logicalId": "ServiceNoNetConfig", - "entityType": "Resource", - "resourceType": "AWS::ECS::Service" - }, - "category": "Resource", - "startLine": 32, - "startColumn": 3, - "endLine": 32, - "endColumn": 21, - "ruleDescription": "Validate ECS service requires NetworkConfiguration", - "phase": "LINT" - }, - { - "ruleId": "E3054", + "ruleId": "E2533", "severity": "ERROR", - "message": "['EC2'] does not contain items matching 'FARGATE'", + "message": "Runtime 'nodejs6.10' was deprecated on '2019-08-12'. Creation was disabled on '2019-07-12', and updates were disabled on '2019-08-12'. Please consider updating to 'nodejs24.x'", "source": "CFN_LINT", "entity": { - "logicalId": "TaskDef", + "logicalId": "InheritsGlobalsFunction", "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" + "resourceType": "AWS::Serverless::Function" }, - "propertyPath": "Properties.RequiresCompatibilities", - "suggestedFix": "Add 'FARGATE' to RequiresCompatibilities", - "category": "Resource", - "startLine": 8, - "startColumn": 7, - "endLine": 8, - "endColumn": 30, - "ruleDescription": "Validate ECS service using Fargate uses TaskDefinition that allows Fargate", - "phase": "LINT" - }, - { - "ruleId": "E3502", - "severity": "ERROR", - "message": "Source queue type 'FIFO' does not match destination queue type 'standard'", - "source": "CFN_LINT", - "entity": { - "logicalId": "FifoQueue", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "propertyPath": "Properties.RedrivePolicy", - "category": "Resource", - "startLine": 42, - "startColumn": 7, - "endLine": 42, - "endColumn": 20, - "ruleDescription": "Validate SQS DLQ queues are the same type", - "phase": "LINT" - }, - { - "ruleId": "E3698", - "severity": "ERROR", - "message": "{'Ref': 'RestApi2'} was expected", - "source": "CFN_LINT", - "entity": { - "logicalId": "Deployment", - "entityType": "Resource", - "resourceType": "AWS::ApiGateway::Deployment" - }, - "propertyPath": "Properties.RestApiId", - "category": "Resource", - "startLine": 78, - "startColumn": 7, - "endLine": 78, - "endColumn": 16, - "ruleDescription": "API Gateway Stage and Deployment must use the same RestApi", - "phase": "LINT" - }, - { - "ruleId": "E3705", - "severity": "ERROR", - "message": "BatchSize 15 exceeds maximum of 10 for SQS FIFO queue event source", - "source": "CFN_LINT", - "entity": { - "logicalId": "FifoMapping", - "entityType": "Resource", - "resourceType": "AWS::Lambda::EventSourceMapping" - }, - "propertyPath": "Properties.BatchSize", - "category": "Resource", - "startLine": 107, - "startColumn": 7, - "endLine": 107, - "endColumn": 16, - "ruleDescription": "Validate SQS FIFO queue EventSourceMapping BatchSize is at most 10", - "phase": "LINT" - }, - { - "ruleId": "E3707", - "severity": "ERROR", - "message": "DBInstance Engine 'aurora-postgresql' does not match DBCluster Engine 'aurora-mysql'", - "source": "CFN_LINT", - "entity": { - "logicalId": "BadEngineInstance", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" - }, - "propertyPath": "Properties.Engine", - "category": "Resource", - "startLine": 120, - "startColumn": 7, - "endLine": 120, - "endColumn": 13, - "relatedResources": [ - { - "resource": { - "id": "AuroraCluster", - "resourceType": "AWS::RDS::DBCluster" - }, - "location": { - "startLine": 112, - "startColumn": 7, - "endLine": 112, - "endColumn": 13 - }, - "message": "cluster engine" - } - ], - "ruleDescription": "Validate RDS DBInstance Engine matches DBCluster Engine", - "phase": "LINT" - }, - { - "ruleId": "E3708", - "severity": "ERROR", - "message": "'COGNITO_USER_POOLS' is not one of ['TOKEN', 'REQUEST']", - "source": "CFN_LINT", - "entity": { - "logicalId": "CognitoAuthorizer", - "entityType": "Resource", - "resourceType": "AWS::ApiGateway::Authorizer" - }, - "propertyPath": "Properties.Type", - "category": "Resource", - "startLine": 58, - "startColumn": 7, - "endLine": 58, - "endColumn": 11, - "ruleDescription": "API Gateway Method AuthorizationType must match Authorizer Type", - "phase": "LINT" - }, - { - "ruleId": "W2501", - "severity": "WARN", - "message": "Property 'MasterUserPassword' should not be a hardcoded string - use a parameter with NoEcho or a dynamic reference", - "source": "CFN_LINT", - "entity": { - "logicalId": "AuroraCluster", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" - }, - "propertyPath": "Properties.MasterUserPassword", - "category": "Security", - "startLine": 114, - "startColumn": 7, - "endLine": 114, - "endColumn": 25, - "ruleDescription": "Check if Password Properties are correctly configured", - "phase": "LINT" - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "FifoQueue", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "category": "Best Practice", - "startLine": 37, - "startColumn": 3, - "endLine": 37, - "endColumn": 12, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "FifoQueue", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "category": "Best Practice", - "startLine": 37, - "startColumn": 3, - "endLine": 37, - "endColumn": 12, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "StandardDLQ", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "category": "Best Practice", - "startLine": 45, - "startColumn": 3, - "endLine": 45, - "endColumn": 14, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "StandardDLQ", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "category": "Best Practice", - "startLine": 45, - "startColumn": 3, - "endLine": 45, - "endColumn": 14, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "SqsFifoQueue", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "category": "Best Practice", - "startLine": 86, - "startColumn": 3, - "endLine": 86, - "endColumn": 15, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "SqsFifoQueue", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "category": "Best Practice", - "startLine": 86, - "startColumn": 3, - "endLine": 86, - "endColumn": 15, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "AuroraCluster", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" - }, - "category": "Best Practice", - "startLine": 109, - "startColumn": 3, - "endLine": 109, - "endColumn": 16, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "AuroraCluster", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" - }, - "category": "Best Practice", - "startLine": 109, - "startColumn": 3, - "endLine": 109, - "endColumn": 16, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "BadEngineInstance", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" - }, - "category": "Best Practice", - "startLine": 115, - "startColumn": 3, - "endLine": 115, - "endColumn": 20, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "BadEngineInstance", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" - }, - "category": "Best Practice", - "startLine": 115, - "startColumn": 3, - "endLine": 115, - "endColumn": 20, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I3013", - "severity": "INFO", - "message": "'MessageRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "FifoQueue", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "propertyPath": "Properties", - "category": "Best Practice", - "startLine": 39, - "startColumn": 5, - "endLine": 39, - "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", - "phase": "LINT" - }, - { - "ruleId": "I3013", - "severity": "INFO", - "message": "'MessageRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "StandardDLQ", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "propertyPath": "Properties", - "category": "Best Practice", - "startLine": 47, - "startColumn": 5, - "endLine": 47, - "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", - "phase": "LINT" - }, - { - "ruleId": "I3013", - "severity": "INFO", - "message": "'MessageRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "SqsFifoQueue", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "propertyPath": "Properties", - "category": "Best Practice", - "startLine": 88, - "startColumn": 5, - "endLine": 88, - "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", - "phase": "LINT" - }, - { - "ruleId": "I3013", - "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "AuroraCluster", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" - }, - "propertyPath": "Properties", - "category": "Best Practice", - "startLine": 111, - "startColumn": 5, - "endLine": 111, - "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", - "phase": "LINT" - }, - { - "ruleId": "I3042", - "severity": "INFO", - "message": "ARN in Resource CognitoAuthorizer contains hardcoded Partition in ARN or incorrectly placed Pseudo Parameters", - "source": "CFN_LINT", - "entity": { - "logicalId": "CognitoAuthorizer", - "entityType": "Resource", - "resourceType": "AWS::ApiGateway::Authorizer" - }, - "propertyPath": "Properties.ProviderARNs.0.Fn::Sub", - "category": "Best Practice", - "startLine": 61, - "startColumn": 16, - "endLine": 61, - "endColumn": 23, - "ruleDescription": "ARNs should use correctly placed Pseudo Parameters", - "phase": "LINT" - }, - { - "ruleId": "I3042", - "severity": "INFO", - "message": "ARN in Resource FifoProcessor contains hardcoded Partition in ARN or incorrectly placed Pseudo Parameters", - "source": "CFN_LINT", - "entity": { - "logicalId": "FifoProcessor", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "Properties.Role.Fn::Sub", - "category": "Best Practice", - "startLine": 97, - "startColumn": 7, - "endLine": 97, - "endColumn": 14, - "ruleDescription": "ARNs should use correctly placed Pseudo Parameters", - "phase": "LINT" - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "TaskDef", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.NetworkMode", - "category": "Best Practice", - "startLine": 7, - "startColumn": 7, - "endLine": 7, - "endColumn": 18, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "TaskDef", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.RequiresCompatibilities", - "category": "Best Practice", - "startLine": 8, - "startColumn": 7, - "endLine": 8, - "endColumn": 30, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "TaskDef", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.ContainerDefinitions", - "category": "Best Practice", - "startLine": 10, - "startColumn": 7, - "endLine": 10, - "endColumn": 27, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'LaunchType' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "FargateService", - "entityType": "Resource", - "resourceType": "AWS::ECS::Service" - }, - "propertyPath": "Properties.LaunchType", - "category": "Best Practice", - "startLine": 17, - "startColumn": 7, - "endLine": 17, - "endColumn": 17, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "AwsvpcTaskDef", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.NetworkMode", - "category": "Best Practice", - "startLine": 27, - "startColumn": 7, - "endLine": 27, - "endColumn": 18, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "AwsvpcTaskDef", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.ContainerDefinitions", - "category": "Best Practice", - "startLine": 28, - "startColumn": 7, - "endLine": 28, - "endColumn": 27, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'FifoQueue' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "FifoQueue", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "propertyPath": "Properties.FifoQueue", - "category": "Best Practice", - "startLine": 40, - "startColumn": 7, - "endLine": 40, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sqs.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'QueueName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "FifoQueue", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "propertyPath": "Properties.QueueName", - "category": "Best Practice", - "startLine": 41, - "startColumn": 7, - "endLine": 41, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sqs.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'FifoQueue' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "StandardDLQ", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "propertyPath": "Properties.FifoQueue", - "category": "Best Practice", - "startLine": 48, - "startColumn": 7, - "endLine": 48, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sqs.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'RestApiId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "CognitoAuthorizer", - "entityType": "Resource", - "resourceType": "AWS::ApiGateway::Authorizer" - }, - "propertyPath": "Properties.RestApiId", - "category": "Best Practice", - "startLine": 57, - "startColumn": 7, - "endLine": 57, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'RestApi'" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'RestApiId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "MethodBadAuth", - "entityType": "Resource", - "resourceType": "AWS::ApiGateway::Method" - }, - "propertyPath": "Properties.RestApiId", - "category": "Best Practice", - "startLine": 65, - "startColumn": 7, - "endLine": 65, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'RestApi'" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ResourceId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "MethodBadAuth", - "entityType": "Resource", - "resourceType": "AWS::ApiGateway::Method" - }, - "propertyPath": "Properties.ResourceId", - "category": "Best Practice", - "startLine": 66, - "startColumn": 7, - "endLine": 66, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt RestApi.RootResourceId" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'HttpMethod' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "MethodBadAuth", - "entityType": "Resource", - "resourceType": "AWS::ApiGateway::Method" - }, - "propertyPath": "Properties.HttpMethod", - "category": "Best Practice", - "startLine": 67, - "startColumn": 7, - "endLine": 67, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'RestApiId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Deployment", - "entityType": "Resource", - "resourceType": "AWS::ApiGateway::Deployment" - }, - "propertyPath": "Properties.RestApiId", - "category": "Best Practice", - "startLine": 78, - "startColumn": 7, - "endLine": 78, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'RestApi'" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'RestApiId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "StageBadApi", - "entityType": "Resource", - "resourceType": "AWS::ApiGateway::Stage" - }, - "propertyPath": "Properties.RestApiId", - "category": "Best Practice", - "startLine": 82, - "startColumn": 7, - "endLine": 82, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'RestApi2'" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'StageName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "StageBadApi", - "entityType": "Resource", - "resourceType": "AWS::ApiGateway::Stage" - }, - "propertyPath": "Properties.StageName", - "category": "Best Practice", - "startLine": 84, - "startColumn": 7, - "endLine": 84, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'FifoQueue' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "SqsFifoQueue", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "propertyPath": "Properties.FifoQueue", - "category": "Best Practice", - "startLine": 89, - "startColumn": 7, - "endLine": 89, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sqs.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'QueueName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "SqsFifoQueue", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "propertyPath": "Properties.QueueName", - "category": "Best Practice", - "startLine": 90, - "startColumn": 7, - "endLine": 90, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sqs.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "FifoProcessor", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "Properties.FunctionName", - "category": "Best Practice", - "startLine": 94, - "startColumn": 7, - "endLine": 94, - "endColumn": 19, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'EventSourceArn' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "FifoMapping", - "entityType": "Resource", - "resourceType": "AWS::Lambda::EventSourceMapping" - }, - "propertyPath": "Properties.EventSourceArn", - "category": "Best Practice", - "startLine": 105, - "startColumn": 7, - "endLine": 105, - "endColumn": 21, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt SqsFifoQueue.Arn" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "AuroraCluster", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" - }, - "propertyPath": "Properties.Engine", - "category": "Best Practice", - "startLine": 112, - "startColumn": 7, - "endLine": 112, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'MasterUsername' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "AuroraCluster", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" - }, - "propertyPath": "Properties.MasterUsername", - "category": "Best Practice", - "startLine": 113, - "startColumn": 7, - "endLine": 113, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'DBClusterIdentifier' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "BadEngineInstance", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" - }, - "propertyPath": "Properties.DBClusterIdentifier", - "category": "Best Practice", - "startLine": 118, - "startColumn": 7, - "endLine": 118, - "endColumn": 26, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'AuroraCluster'" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "BadEngineInstance", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" - }, - "propertyPath": "Properties.Engine", - "category": "Best Practice", - "startLine": 120, - "startColumn": 7, - "endLine": 120, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } - }, - { - "ruleId": "I9003", - "severity": "INFO", - "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", - "source": "ENGINE", - "category": "Best Practice", - "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'TaskDef' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "TaskDef", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 6, - "startColumn": 5, - "endLine": 6, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'FargateService' of type 'AWS::ECS::Service' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "FargateService", - "entityType": "Resource", - "resourceType": "AWS::ECS::Service" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 16, - "startColumn": 5, - "endLine": 16, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'AwsvpcTaskDef' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "AwsvpcTaskDef", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 26, - "startColumn": 5, - "endLine": 26, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'ServiceNoNetConfig' of type 'AWS::ECS::Service' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "ServiceNoNetConfig", - "entityType": "Resource", - "resourceType": "AWS::ECS::Service" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 34, - "startColumn": 5, - "endLine": 34, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'FifoQueue' of type 'AWS::SQS::Queue' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "FifoQueue", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 39, - "startColumn": 5, - "endLine": 39, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'StandardDLQ' of type 'AWS::SQS::Queue' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "StandardDLQ", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 47, - "startColumn": 5, - "endLine": 47, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'RestApi' of type 'AWS::ApiGateway::RestApi' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "RestApi", - "entityType": "Resource", - "resourceType": "AWS::ApiGateway::RestApi" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 52, - "startColumn": 5, - "endLine": 52, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'RestApi2' of type 'AWS::ApiGateway::RestApi' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "RestApi2", - "entityType": "Resource", - "resourceType": "AWS::ApiGateway::RestApi" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 73, - "startColumn": 5, - "endLine": 73, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'StageBadApi' of type 'AWS::ApiGateway::Stage' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "StageBadApi", - "entityType": "Resource", - "resourceType": "AWS::ApiGateway::Stage" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 81, - "startColumn": 5, - "endLine": 81, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'SqsFifoQueue' of type 'AWS::SQS::Queue' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "SqsFifoQueue", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 88, - "startColumn": 5, - "endLine": 88, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'FifoProcessor' of type 'AWS::Lambda::Function' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "FifoProcessor", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 93, - "startColumn": 5, - "endLine": 93, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'FifoMapping' of type 'AWS::Lambda::EventSourceMapping' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "FifoMapping", - "entityType": "Resource", - "resourceType": "AWS::Lambda::EventSourceMapping" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 104, - "startColumn": 5, - "endLine": 104, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'AuroraCluster' of type 'AWS::RDS::DBCluster' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "AuroraCluster", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 111, - "startColumn": 5, - "endLine": 111, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'BadEngineInstance' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "BadEngineInstance", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 117, - "startColumn": 5, - "endLine": 117, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "integration/custom-resources.yaml": { - "filePath": "integration/custom-resources.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 2, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 0, - "informational": 2, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "E9004", - "severity": "ERROR", - "message": "'ArnA' is not one of ['Arn', 'KeyId']", - "source": "SCHEMA", - "entity": { - "logicalId": "CustomResource", - "entityType": "Resource", - "resourceType": "AWS::CloudFormation::CustomResource" - }, - "propertyPath": "Properties.KmsKeyId", - "suggestedFix": "Check the resource type documentation for valid GetAtt attributes", - "category": "Intrinsic Function", - "startLine": 12, - "startColumn": 7, - "endLine": 12, - "endColumn": 15, - "ruleDescription": "GetAtt attribute must exist on target resource type", - "phase": "LINT" - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ServiceToken' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "CustomResource", - "entityType": "Resource", - "resourceType": "AWS::CloudFormation::CustomResource" - }, - "propertyPath": "Properties.ServiceToken", - "category": "Best Practice", - "startLine": 11, - "startColumn": 7, - "endLine": 11, - "endColumn": 19, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'KmsKey' of type 'AWS::KMS::Key' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "KmsKey", - "entityType": "Resource", - "resourceType": "AWS::KMS::Key" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 6, - "startColumn": 5, - "endLine": 6, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "integration/deployment-file-template.yaml": { - "filePath": "integration/deployment-file-template.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 3, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 13, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Vpc", - "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" - }, - "propertyPath": "Properties.CidrBlock", - "category": "Best Practice", - "startLine": 24, - "startColumn": 7, - "endLine": 24, - "endColumn": 16, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Subnet1", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.AvailabilityZone", - "category": "Best Practice", - "startLine": 28, - "startColumn": 7, - "endLine": 28, - "endColumn": 23, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Subnet1", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.CidrBlock", - "category": "Best Practice", - "startLine": 29, - "startColumn": 7, - "endLine": 29, - "endColumn": 16, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Subnet1", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.VpcId", - "category": "Best Practice", - "startLine": 30, - "startColumn": 7, - "endLine": 30, - "endColumn": 12, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'Vpc'" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Affinity' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "MyInstance", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.Affinity", - "category": "Best Practice", - "startLine": 34, - "startColumn": 7, - "endLine": 34, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "MyInstance", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.ImageId", - "category": "Best Practice", - "startLine": 35, - "startColumn": 7, - "endLine": 35, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter 'ImageId' (type AWS::EC2::Image::Id)" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "MyInstance", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.InstanceType", - "category": "Best Practice", - "startLine": 36, - "startColumn": 7, - "endLine": 36, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "MyInstance", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.SubnetId", - "category": "Best Practice", - "startLine": 37, - "startColumn": 7, - "endLine": 37, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt Subnet1.SubnetId" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Tenancy' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "MyInstance", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.Tenancy", - "category": "Best Practice", - "startLine": 38, - "startColumn": 7, - "endLine": 38, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only", - "resolutionSource": "parameter with AllowedValues" - } - }, - { - "ruleId": "I9003", - "severity": "INFO", - "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", - "source": "ENGINE", - "category": "Best Practice", - "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Vpc' of type 'AWS::EC2::VPC' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "Vpc", - "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 23, - "startColumn": 5, - "endLine": 23, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Subnet1' of type 'AWS::EC2::Subnet' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "Subnet1", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 27, - "startColumn": 5, - "endLine": 27, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'MyInstance' of type 'AWS::EC2::Instance' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "MyInstance", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 33, - "startColumn": 5, - "endLine": 33, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "integration/dynamic-references.yaml": { - "filePath": "integration/dynamic-references.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 4, - "counts": { - "fatal": 1, - "errors": 0, - "warnings": 1, - "informational": 11, - "debug": 0 - }, - "suppressed": 1, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "F3031", - "severity": "FATAL", - "message": "'{{:ssm:/SQS_Queue/SQS_ARN}}' does not match pattern 'arn:(aws[a-zA-Z0-9-]*):([a-zA-Z0-9\\-])+:((eusc-)?[a-z]{2}((-gov)|(-iso([a-z]?)))?-[a-z]+-\\d{1})?:(\\d{12})?:(.*)'", - "source": "SCHEMA", - "entity": { - "logicalId": "SESEventSourceMappingBadDynamicReference", - "entityType": "Resource", - "resourceType": "AWS::Lambda::EventSourceMapping" - }, - "propertyPath": "Properties.EventSourceArn", - "category": "Schema", - "startLine": 16, - "startColumn": 7, - "endLine": 16, - "endColumn": 21, - "ruleDescription": "Value does not match pattern", - "phase": "SCHEMA", - "context": { - "actualValue": "{{:ssm:/SQS_Queue/SQS_ARN}}", - "expectedConstraint": "arn:(aws[a-zA-Z0-9-]*):([a-zA-Z0-9\\-])+:((eusc-)?[a-z]{2}((-gov)|(-iso([a-z]?)))?-[a-z]+-\\d{1})?:(\\d{12})?:(.*)" - } - }, - { - "ruleId": "W1053", - "severity": "WARN", - "message": "'{{ resolve:ssm:/SQS_Queue/SQS_ARN }}' has spaces and will not be resolved as a dynamic reference. Remove spaces from '{{resolve:...}}'", - "source": "CFN_LINT", - "entity": { - "logicalId": "SESEventSourceMappingSpaces", - "entityType": "Resource", - "resourceType": "AWS::Lambda::EventSourceMapping" - }, - "propertyPath": "Properties.EventSourceArn", - "suggestedFix": "Remove spaces from the dynamic reference", - "category": "Best Practice", - "startLine": 37, - "startColumn": 7, - "endLine": 37, - "endColumn": 21, - "ruleDescription": "Dynamic references should not contain spaces", - "phase": "LINT" - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'EventSourceArn' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "SESEventSourceMapping", - "entityType": "Resource", - "resourceType": "AWS::Lambda::EventSourceMapping" - }, - "propertyPath": "Properties.EventSourceArn", - "category": "Best Practice", - "startLine": 9, - "startColumn": 7, - "endLine": 9, - "endColumn": 21, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "dynamic (dynamic reference: {{resolve:ssm:/SQS_Queue/SQS_ARN}})" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'EventSourceArn' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "SESEventSourceMappingBadDynamicReference", - "entityType": "Resource", - "resourceType": "AWS::Lambda::EventSourceMapping" - }, - "propertyPath": "Properties.EventSourceArn", - "category": "Best Practice", - "startLine": 16, - "startColumn": 7, - "endLine": 16, - "endColumn": 21, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'DeploymentMode' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Broker", - "entityType": "Resource", - "resourceType": "AWS::AmazonMQ::Broker" - }, - "propertyPath": "Properties.DeploymentMode", - "category": "Best Practice", - "startLine": 24, - "startColumn": 9, - "endLine": 24, - "endColumn": 23, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'EngineType' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Broker", - "entityType": "Resource", - "resourceType": "AWS::AmazonMQ::Broker" - }, - "propertyPath": "Properties.EngineType", - "category": "Best Practice", - "startLine": 25, - "startColumn": 9, - "endLine": 25, - "endColumn": 19, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'BrokerName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Broker", - "entityType": "Resource", - "resourceType": "AWS::AmazonMQ::Broker" - }, - "propertyPath": "Properties.BrokerName", - "category": "Best Practice", - "startLine": 30, - "startColumn": 9, - "endLine": 30, - "endColumn": 19, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'PubliclyAccessible' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Broker", - "entityType": "Resource", - "resourceType": "AWS::AmazonMQ::Broker" - }, - "propertyPath": "Properties.PubliclyAccessible", - "category": "Best Practice", - "startLine": 31, - "startColumn": 9, - "endLine": 31, - "endColumn": 27, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'EventSourceArn' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "SESEventSourceMappingSpaces", - "entityType": "Resource", - "resourceType": "AWS::Lambda::EventSourceMapping" - }, - "propertyPath": "Properties.EventSourceArn", - "category": "Best Practice", - "startLine": 37, - "startColumn": 7, - "endLine": 37, - "endColumn": 21, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'SESEventSourceMapping' of type 'AWS::Lambda::EventSourceMapping' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "SESEventSourceMapping", - "entityType": "Resource", - "resourceType": "AWS::Lambda::EventSourceMapping" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 6, - "startColumn": 5, - "endLine": 6, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'SESEventSourceMappingBadDynamicReference' of type 'AWS::Lambda::EventSourceMapping' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "SESEventSourceMappingBadDynamicReference", - "entityType": "Resource", - "resourceType": "AWS::Lambda::EventSourceMapping" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 13, - "startColumn": 5, - "endLine": 13, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Broker' of type 'AWS::AmazonMQ::Broker' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "Broker", - "entityType": "Resource", - "resourceType": "AWS::AmazonMQ::Broker" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 20, - "startColumn": 5, - "endLine": 20, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'SESEventSourceMappingSpaces' of type 'AWS::Lambda::EventSourceMapping' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "SESEventSourceMappingSpaces", - "entityType": "Resource", - "resourceType": "AWS::Lambda::EventSourceMapping" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 34, - "startColumn": 5, - "endLine": 34, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "integration/formats.yaml": { - "filePath": "integration/formats.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 4, - "counts": { - "fatal": 0, - "errors": 2, - "warnings": 4, - "informational": 13, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "E1040", - "severity": "ERROR", - "message": "{'Fn::GetAtt': ['SecurityGroup', 'GroupName']} does not match destination format of 'AWS::EC2::SecurityGroup.Id'", - "source": "CFN_LINT", - "entity": { - "logicalId": "Instance1", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.NetworkInterfaces.2.GroupSet.0", - "suggestedFix": "Use the correct GetAtt attribute", - "category": "Intrinsic Function", - "startLine": 44, - "startColumn": 21, - "endLine": 44, - "endColumn": 22, - "ruleDescription": "Check if GetAtt matches destination format", - "phase": "LINT" - }, - { - "ruleId": "E1150", - "severity": "ERROR", - "message": "'sg-dne' does not match format 'AWS::EC2::SecurityGroup.Id'", - "source": "CFN_LINT", - "entity": { - "logicalId": "Instance1", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.NetworkInterfaces.1.GroupSet.3", - "category": "Intrinsic Function", - "startLine": 40, - "startColumn": 13, - "endLine": 40, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Validate security group format", - "phase": "SCHEMA", - "context": { - "actualValue": "sg-dne" - } - }, - { - "ruleId": "W9003", - "severity": "WARN", - "message": "0 is not of type 'string' - automatically coerced (number to string)", - "source": "CFN_LINT", - "entity": { - "logicalId": "Instance1", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.NetworkInterfaces.0.DeviceIndex", - "category": "Best Practice", - "startLine": 31, - "startColumn": 11, - "endLine": 31, - "endColumn": 22, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Property type coercion warning", - "phase": "SCHEMA" - }, - { - "ruleId": "W9003", - "severity": "WARN", - "message": "1 is not of type 'string' - automatically coerced (number to string)", - "source": "CFN_LINT", - "entity": { - "logicalId": "Instance1", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.NetworkInterfaces.1.DeviceIndex", - "category": "Best Practice", - "startLine": 34, - "startColumn": 11, - "endLine": 34, - "endColumn": 22, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Property type coercion warning", - "phase": "SCHEMA" - }, - { - "ruleId": "W9003", - "severity": "WARN", - "message": "2 is not of type 'string' - automatically coerced (number to string)", - "source": "CFN_LINT", - "entity": { - "logicalId": "Instance1", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.NetworkInterfaces.2.DeviceIndex", - "category": "Best Practice", - "startLine": 41, - "startColumn": 11, - "endLine": 41, - "endColumn": 22, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Property type coercion warning", - "phase": "SCHEMA" - }, - { - "ruleId": "W9010", - "severity": "WARN", - "message": "Hardcoded AMI ID - use a parameter or mapping for portability", - "source": "ENGINE", - "entity": { - "logicalId": "Instance1", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.ImageId", - "category": "Security", - "startLine": 28, - "startColumn": 7, - "endLine": 28, - "endColumn": 14, - "ruleDescription": "Hardcoded AMI ID", - "phase": "LINT" - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Vpc", - "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" - }, - "propertyPath": "Properties.CidrBlock", - "category": "Best Practice", - "startLine": 11, - "startColumn": 7, - "endLine": 11, - "endColumn": 16, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Subnet", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.VpcId", - "category": "Best Practice", - "startLine": 16, - "startColumn": 7, - "endLine": 16, - "endColumn": 12, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'Vpc'" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Subnet", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.CidrBlock", - "category": "Best Practice", - "startLine": 17, - "startColumn": 7, - "endLine": 17, - "endColumn": 16, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "SecurityGroup", - "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" - }, - "propertyPath": "Properties.VpcId", - "category": "Best Practice", - "startLine": 22, - "startColumn": 7, - "endLine": 22, - "endColumn": 12, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'Vpc'" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "SecurityGroup", - "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" - }, - "propertyPath": "Properties.GroupDescription", - "category": "Best Practice", - "startLine": 23, - "startColumn": 7, - "endLine": 23, - "endColumn": 23, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Instance1", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.ImageId", - "category": "Best Practice", - "startLine": 28, - "startColumn": 7, - "endLine": 28, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Instance1", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.InstanceType", - "category": "Best Practice", - "startLine": 29, - "startColumn": 7, - "endLine": 29, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'NetworkInterfaces' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Instance1", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.NetworkInterfaces", - "category": "Best Practice", - "startLine": 30, - "startColumn": 7, - "endLine": 30, - "endColumn": 24, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9003", - "severity": "INFO", - "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", - "source": "ENGINE", - "category": "Best Practice", - "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Vpc' of type 'AWS::EC2::VPC' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "Vpc", - "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 10, - "startColumn": 5, - "endLine": 10, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Subnet' of type 'AWS::EC2::Subnet' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "Subnet", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 15, - "startColumn": 5, - "endLine": 15, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'SecurityGroup' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "SecurityGroup", - "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 21, - "startColumn": 5, - "endLine": 21, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Instance1' of type 'AWS::EC2::Instance' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "Instance1", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 27, - "startColumn": 5, - "endLine": 27, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "integration/get-stack-output.yaml": { - "filePath": "integration/get-stack-output.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 5, - "counts": { - "fatal": 0, - "errors": 2, - "warnings": 0, - "informational": 5, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "E1033", - "severity": "ERROR", - "message": "'OutputName' is a required property", - "source": "SCHEMA", - "entity": { - "logicalId": "InvalidMissing", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" - }, - "propertyPath": "Properties.DisplayName.Fn::GetStackOutput", - "category": "Intrinsic Function", - "startLine": 47, - "startColumn": 9, - "endLine": 47, - "endColumn": 27, - "ruleDescription": "GetStackOutput validation of parameters", - "phase": "PARSE" - }, - { - "ruleId": "E1033", - "severity": "ERROR", - "message": "'not-an-object' is not of type 'object'", - "source": "SCHEMA", - "entity": { - "logicalId": "InvalidType", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" - }, - "propertyPath": "Properties.DisplayName.Fn::GetStackOutput", - "category": "Intrinsic Function", - "startLine": 54, - "startColumn": 9, - "endLine": 54, - "endColumn": 27, - "ruleDescription": "GetStackOutput validation of parameters", - "phase": "PARSE" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'ValidTopic' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "ValidTopic", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 15, - "startColumn": 5, - "endLine": 15, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'ValidJoin' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "ValidJoin", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 23, - "startColumn": 5, - "endLine": 23, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'ValidIf' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "ValidIf", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 34, - "startColumn": 5, - "endLine": 34, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'InvalidMissing' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "InvalidMissing", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 45, - "startColumn": 5, - "endLine": 45, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'InvalidType' of type 'AWS::SNS::Topic' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "InvalidType", - "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 52, - "startColumn": 5, - "endLine": 52, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "integration/getatt-types.yaml": { - "filePath": "integration/getatt-types.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 8, - "counts": { - "fatal": 5, - "errors": 1, - "warnings": 0, - "informational": 19, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "F6101", - "severity": "FATAL", - "message": "Output 'SubWithGetAtt': GetAtt 'CapacityReservation.InstanceCount' returns type 'integer', not 'string'", - "source": "SCHEMA", - "entity": { - "logicalId": "SubWithGetAtt", - "entityType": "Output" - }, - "propertyPath": "Outputs/SubWithGetAtt/Value.Fn::GetAtt", - "category": "Structure", - "startLine": 84, - "startColumn": 3, - "endLine": 84, - "endColumn": 16, - "ruleDescription": "Output value must be a string", - "phase": "SCHEMA" - }, - { - "ruleId": "F6101", - "severity": "FATAL", - "message": "Output 'Ipv4NetmaskLength': GetAtt 'CapacityReservation.InstanceCount' returns type 'integer', not 'string'", - "source": "SCHEMA", - "entity": { - "logicalId": "Ipv4NetmaskLength", - "entityType": "Output" - }, - "propertyPath": "Outputs/Ipv4NetmaskLength/Value.Fn::GetAtt", - "category": "Structure", - "startLine": 86, - "startColumn": 3, - "endLine": 86, - "endColumn": 20, - "ruleDescription": "Output value must be a string", - "phase": "SCHEMA" - }, - { - "ruleId": "F6101", - "severity": "FATAL", - "message": "Output 'String': GetAtt 'CapacityReservation.InstanceCount' returns type 'integer', not 'string'", - "source": "SCHEMA", - "entity": { - "logicalId": "String", - "entityType": "Output" - }, - "propertyPath": "Outputs/String/Value.Fn::Sub", - "category": "Structure", - "startLine": 88, - "startColumn": 3, - "endLine": 88, - "endColumn": 9, - "ruleDescription": "Output value must be a string", - "phase": "SCHEMA" - }, - { - "ruleId": "F6101", - "severity": "FATAL", - "message": "Output 'JoinWithGetAtt': GetAtt 'CapacityReservation.InstanceCount' returns type 'integer', not 'string'", - "source": "SCHEMA", - "entity": { - "logicalId": "JoinWithGetAtt", - "entityType": "Output" - }, - "propertyPath": "Outputs/JoinWithGetAtt/Value.Fn::Join.1.0.Fn::GetAtt", - "category": "Structure", - "startLine": 92, - "startColumn": 3, - "endLine": 92, - "endColumn": 17, - "ruleDescription": "Output value must be a string", - "phase": "SCHEMA" - }, - { - "ruleId": "F6101", - "severity": "FATAL", - "message": "Output 'BooleanGetAtt': GetAtt 'CapacityReservation.EphemeralStorage' returns type 'boolean', not 'string'", - "source": "SCHEMA", - "entity": { - "logicalId": "BooleanGetAtt", - "entityType": "Output" - }, - "propertyPath": "Outputs/BooleanGetAtt/Value.Fn::GetAtt", - "category": "Structure", - "startLine": 96, - "startColumn": 3, - "endLine": 96, - "endColumn": 16, - "ruleDescription": "Output value must be a string", - "phase": "SCHEMA" - }, - { - "ruleId": "E1040", - "severity": "ERROR", - "message": "{'Fn::GetAtt': ['TestLogGroup', 'Arn']} does not match destination format of 'AWS::Logs::LogGroup.Name'", - "source": "CFN_LINT", - "entity": { - "logicalId": "TestTaskDefinitionWithGetAtt", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.ContainerDefinitions.0.LogConfiguration.Options.awslogs-group", - "suggestedFix": "Use the correct GetAtt attribute", - "category": "Intrinsic Function", - "startLine": 62, - "startColumn": 15, - "endLine": 62, - "endColumn": 28, - "ruleDescription": "Check if GetAtt matches destination format", - "phase": "LINT" - }, - { - "ruleId": "I1022", - "severity": "INFO", - "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", - "source": "CFN_LINT", - "entity": { - "logicalId": "Join", - "entityType": "Output" - }, - "propertyPath": "Outputs/Join/Value.Fn::Join", - "category": "Intrinsic Function", - "startLine": 90, - "startColumn": 3, - "endLine": 90, - "endColumn": 7, - "ruleDescription": "Use Sub instead of Join", - "phase": "LINT" - }, - { - "ruleId": "I1022", - "severity": "INFO", - "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", - "source": "CFN_LINT", - "entity": { - "logicalId": "JoinWithGetAtt", - "entityType": "Output" - }, - "propertyPath": "Outputs/JoinWithGetAtt/Value.Fn::Join", - "category": "Intrinsic Function", - "startLine": 92, - "startColumn": 3, - "endLine": 92, - "endColumn": 17, - "ruleDescription": "Use Sub instead of Join", - "phase": "LINT" - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "CapacityReservation", - "entityType": "Resource", - "resourceType": "AWS::EC2::CapacityReservation" - }, - "propertyPath": "Properties.AvailabilityZone", - "category": "Best Practice", - "startLine": 10, - "startColumn": 7, - "endLine": 10, - "endColumn": 23, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'InstanceType' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "CapacityReservation", - "entityType": "Resource", - "resourceType": "AWS::EC2::CapacityReservation" - }, - "propertyPath": "Properties.InstanceType", - "category": "Best Practice", - "startLine": 12, - "startColumn": 7, - "endLine": 12, - "endColumn": 19, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'InstancePlatform' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "CapacityReservation", - "entityType": "Resource", - "resourceType": "AWS::EC2::CapacityReservation" - }, - "propertyPath": "Properties.InstancePlatform", - "category": "Best Practice", - "startLine": 13, - "startColumn": 7, - "endLine": 13, - "endColumn": 23, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "TestTaskDefinitionWithGetAtt", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.ContainerDefinitions", - "category": "Best Practice", - "startLine": 57, - "startColumn": 7, - "endLine": 57, - "endColumn": 27, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "TestTaskDefinitionWithGetAtt", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.Cpu", - "category": "Best Practice", - "startLine": 68, - "startColumn": 7, - "endLine": 68, - "endColumn": 10, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ExecutionRoleArn' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "TestTaskDefinitionWithGetAtt", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.ExecutionRoleArn", - "category": "Best Practice", - "startLine": 69, - "startColumn": 7, - "endLine": 69, - "endColumn": 23, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt TestFargateExecutionRole.Arn" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Memory' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "TestTaskDefinitionWithGetAtt", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.Memory", - "category": "Best Practice", - "startLine": 70, - "startColumn": 7, - "endLine": 70, - "endColumn": 13, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "TestTaskDefinitionWithGetAtt", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.NetworkMode", - "category": "Best Practice", - "startLine": 71, - "startColumn": 7, - "endLine": 71, - "endColumn": 18, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "TestTaskDefinitionWithGetAtt", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.RequiresCompatibilities", - "category": "Best Practice", - "startLine": 72, - "startColumn": 7, - "endLine": 72, - "endColumn": 30, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'TaskRoleArn' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "TestTaskDefinitionWithGetAtt", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.TaskRoleArn", - "category": "Best Practice", - "startLine": 74, - "startColumn": 7, - "endLine": 74, - "endColumn": 18, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt TestFargateTaskRole.Arn" - } - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'SsmParameter' of type 'AWS::SSM::Parameter' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "SsmParameter", - "entityType": "Resource", - "resourceType": "AWS::SSM::Parameter" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 16, - "startColumn": 5, - "endLine": 16, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'DocDBCluster' of type 'AWS::DocDB::DBCluster' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "DocDBCluster", - "entityType": "Resource", - "resourceType": "AWS::DocDB::DBCluster" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 23, - "startColumn": 5, - "endLine": 23, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'TestCluster' of type 'AWS::ECS::Cluster' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "TestCluster", - "entityType": "Resource", - "resourceType": "AWS::ECS::Cluster" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 25, - "startColumn": 3, - "endLine": 25, - "endColumn": 14, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'TestFargateExecutionRole' of type 'AWS::IAM::Role' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "TestFargateExecutionRole", - "entityType": "Resource", - "resourceType": "AWS::IAM::Role" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 29, - "startColumn": 5, - "endLine": 29, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'TestFargateTaskRole' of type 'AWS::IAM::Role' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "TestFargateTaskRole", - "entityType": "Resource", - "resourceType": "AWS::IAM::Role" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 42, - "startColumn": 5, - "endLine": 42, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'TestLogGroup' of type 'AWS::Logs::LogGroup' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "TestLogGroup", - "entityType": "Resource", - "resourceType": "AWS::Logs::LogGroup" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 50, - "startColumn": 3, - "endLine": 50, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'TestTaskDefinitionWithGetAtt' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "TestTaskDefinitionWithGetAtt", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 56, - "startColumn": 5, - "endLine": 56, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "integration/metdata.yaml": { - "filePath": "integration/metdata.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 0, - "counts": { - "fatal": 1, - "errors": 0, - "warnings": 1, - "informational": 0, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "F0001", - "severity": "FATAL", - "message": "Resources section must exist and be non-empty", - "source": "SCHEMA", - "category": "Structure", - "startLine": 21, - "startColumn": 1, - "endLine": 21, - "endColumn": 10, - "ruleDescription": "Resources section must exist and be non-empty", - "phase": "SCHEMA" - }, - { - "ruleId": "W2001", - "severity": "WARN", - "message": "Parameter 'VpcId' is not referenced anywhere in the template", - "source": "CFN_LINT", - "entity": { - "logicalId": "VpcId", - "entityType": "Parameter" - }, - "propertyPath": "Parameters/VpcId", - "category": "Best Practice", - "startLine": 17, - "startColumn": 3, - "endLine": 17, - "endColumn": 8, - "ruleDescription": "Check if Parameters are Used", - "phase": "LINT" - } - ] - }, - "integration/module-sub-resources.yaml": { - "filePath": "integration/module-sub-resources.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 0, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [] - }, - "integration/ref-no-value.yaml": { - "filePath": "integration/ref-no-value.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 5, - "counts": { - "fatal": 0, - "errors": 7, - "warnings": 0, - "informational": 2, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "E3003", - "severity": "ERROR", - "message": "'Key' is a required property", - "source": "CFN_LINT", - "entity": { - "logicalId": "IamRole1", - "entityType": "Resource", - "resourceType": "AWS::IAM::Role" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Tag Key cannot be null or AWS::NoValue", - "category": "Resource", - "startLine": 11, - "startColumn": 7, - "endLine": 11, - "endColumn": 11, - "ruleDescription": "Required Resource properties are missing", - "phase": "LINT" - }, - { - "ruleId": "E3003", - "severity": "ERROR", - "message": "'DefaultCacheBehavior' is a required property", - "source": "CFN_LINT", - "entity": { - "logicalId": "CloudFront2", - "entityType": "Resource", - "resourceType": "AWS::CloudFront::Distribution" - }, - "propertyPath": "Properties.DistributionConfig", - "suggestedFix": "Add DefaultCacheBehavior to the Fn::If branch", - "category": "Resource", - "startLine": 43, - "startColumn": 7, - "endLine": 43, - "endColumn": 25, - "ruleDescription": "Required Resource properties are missing", - "phase": "LINT" - }, - { - "ruleId": "E3003", - "severity": "ERROR", - "message": "'TargetOriginId' is a required property", - "source": "CFN_LINT", - "entity": { - "logicalId": "CloudFront2", - "entityType": "Resource", - "resourceType": "AWS::CloudFront::Distribution" - }, - "propertyPath": "Properties.DistributionConfig.DefaultCacheBehavior.Fn::If.2", - "suggestedFix": "Add TargetOriginId to the DefaultCacheBehavior", - "category": "Resource", - "startLine": 49, - "startColumn": 13, - "endLine": 49, - "endColumn": 14, - "ruleDescription": "Required Resource properties are missing", - "phase": "LINT" - }, - { - "ruleId": "E3003", - "severity": "ERROR", - "message": "'ViewerProtocolPolicy' is a required property", - "source": "CFN_LINT", - "entity": { - "logicalId": "CloudFront2", - "entityType": "Resource", - "resourceType": "AWS::CloudFront::Distribution" - }, - "propertyPath": "Properties.DistributionConfig.DefaultCacheBehavior.Fn::If.2", - "suggestedFix": "Add ViewerProtocolPolicy to the DefaultCacheBehavior", - "category": "Resource", - "startLine": 49, - "startColumn": 13, - "endLine": 49, - "endColumn": 14, - "ruleDescription": "Required Resource properties are missing", - "phase": "LINT" - }, - { - "ruleId": "E3024", - "severity": "ERROR", - "message": "'Key' is a required property", - "source": "CFN_LINT", - "entity": { - "logicalId": "IamRole1", - "entityType": "Resource", - "resourceType": "AWS::IAM::Role" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Tag Key cannot be null or AWS::NoValue", - "category": "Resource", - "startLine": 11, - "startColumn": 7, - "endLine": 11, - "endColumn": 11, - "ruleDescription": "Validate tag configuration", - "phase": "LINT" - }, - { - "ruleId": "E3530", - "severity": "ERROR", - "message": "'Statement' is a required property", - "source": "CFN_LINT", - "entity": { - "logicalId": "IamRole1", - "entityType": "Resource", - "resourceType": "AWS::IAM::Role" - }, - "propertyPath": "Properties.AssumeRolePolicyDocument", - "suggestedFix": "Add a Statement array to the AssumeRolePolicyDocument", - "category": "Resource", - "startLine": 10, - "startColumn": 7, - "endLine": 10, - "endColumn": 31, - "ruleDescription": "Validate IAM trust policies", - "phase": "LINT" - }, - { - "ruleId": "E3530", - "severity": "ERROR", - "message": "'Statement' is a required property", - "source": "CFN_LINT", - "entity": { - "logicalId": "IamRole3", - "entityType": "Resource", - "resourceType": "AWS::IAM::Role" - }, - "propertyPath": "Properties.AssumeRolePolicyDocument", - "suggestedFix": "Add a Statement array to the AssumeRolePolicyDocument", - "category": "Resource", - "startLine": 30, - "startColumn": 7, - "endLine": 30, - "endColumn": 31, - "ruleDescription": "Validate IAM trust policies", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'IamRole3' of type 'AWS::IAM::Role' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "IamRole3", - "entityType": "Resource", - "resourceType": "AWS::IAM::Role" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 31, - "startColumn": 7, - "endLine": 31, - "endColumn": 11, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'CloudFront2' of type 'AWS::CloudFront::Distribution' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "CloudFront2", - "entityType": "Resource", - "resourceType": "AWS::CloudFront::Distribution" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 42, - "startColumn": 5, - "endLine": 42, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "integration/ref-types.yaml": { - "filePath": "integration/ref-types.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 13, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 1, - "informational": 40, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "E1041", - "severity": "ERROR", - "message": "{'Ref': 'FargateTaskRole'} does not match destination format of 'AWS::EC2::VPC.Id'", - "source": "CFN_LINT", - "entity": { - "logicalId": "Subnet2", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.VpcId", - "suggestedFix": "Use a Ref to a resource whose type matches the expected format", - "category": "Intrinsic Function", - "startLine": 45, - "startColumn": 7, - "endLine": 45, - "endColumn": 12, - "ruleDescription": "Check if Ref matches destination format", - "phase": "LINT" - }, - { - "ruleId": "W3697", - "severity": "WARN", - "message": "Resource type 'AWS::AutoScaling::LaunchConfiguration' is from a service in maintenance mode since 2024-10-01. Consider migrating to an alternative", - "source": "CFN_LINT", - "entity": { - "logicalId": "LaunchConfiguration", - "entityType": "Resource", - "resourceType": "AWS::AutoScaling::LaunchConfiguration" - }, - "category": "Deprecation", - "startLine": 111, - "startColumn": 3, - "endLine": 111, - "endColumn": 22, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", - "ruleDescription": "Resource type is from a service in maintenance mode", - "phase": "SCHEMA" - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Vpc", - "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" - }, - "propertyPath": "Properties.CidrBlock", - "category": "Best Practice", - "startLine": 35, - "startColumn": 7, - "endLine": 35, - "endColumn": 16, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Subnet1", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.CidrBlock", - "category": "Best Practice", - "startLine": 39, - "startColumn": 7, - "endLine": 39, - "endColumn": 16, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Subnet1", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.VpcId", - "category": "Best Practice", - "startLine": 40, - "startColumn": 7, - "endLine": 40, - "endColumn": 12, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'Vpc'" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Subnet2", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.CidrBlock", - "category": "Best Practice", - "startLine": 44, - "startColumn": 7, - "endLine": 44, - "endColumn": 16, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Subnet2", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.VpcId", - "category": "Best Practice", - "startLine": 45, - "startColumn": 7, - "endLine": 45, - "endColumn": 12, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'FargateTaskRole'" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "SecurityGroup1", - "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" - }, - "propertyPath": "Properties.GroupDescription", - "category": "Best Practice", - "startLine": 49, - "startColumn": 7, - "endLine": 49, - "endColumn": 23, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "SecurityGroup1", - "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" - }, - "propertyPath": "Properties.VpcId", - "category": "Best Practice", - "startLine": 50, - "startColumn": 7, - "endLine": 50, - "endColumn": 12, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'Vpc'" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "SecurityGroup2", - "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" - }, - "propertyPath": "Properties.GroupDescription", - "category": "Best Practice", - "startLine": 54, - "startColumn": 7, - "endLine": 54, - "endColumn": 23, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Type' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "LoadBalancer", - "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancingV2::LoadBalancer" - }, - "propertyPath": "Properties.Type", - "category": "Best Practice", - "startLine": 58, - "startColumn": 7, - "endLine": 58, - "endColumn": 11, - "documentationUrl": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-loadbalancer.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Scheme' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "LoadBalancer", - "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancingV2::LoadBalancer" - }, - "propertyPath": "Properties.Scheme", - "category": "Best Practice", - "startLine": 59, - "startColumn": 7, - "endLine": 59, - "endColumn": 13, - "documentationUrl": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-loadbalancer.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "TaskDefinitionWithRefToResource", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.ContainerDefinitions", - "category": "Best Practice", - "startLine": 72, - "startColumn": 7, - "endLine": 72, - "endColumn": 27, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "TaskDefinitionWithRefToResource", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.Cpu", - "category": "Best Practice", - "startLine": 83, - "startColumn": 7, - "endLine": 83, - "endColumn": 10, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ExecutionRoleArn' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "TaskDefinitionWithRefToResource", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.ExecutionRoleArn", - "category": "Best Practice", - "startLine": 84, - "startColumn": 7, - "endLine": 84, - "endColumn": 23, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt FargateExecutionRole.Arn" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Memory' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "TaskDefinitionWithRefToResource", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.Memory", - "category": "Best Practice", - "startLine": 85, - "startColumn": 7, - "endLine": 85, - "endColumn": 13, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "TaskDefinitionWithRefToResource", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.NetworkMode", - "category": "Best Practice", - "startLine": 86, - "startColumn": 7, - "endLine": 86, - "endColumn": 18, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "TaskDefinitionWithRefToResource", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.RequiresCompatibilities", - "category": "Best Practice", - "startLine": 87, - "startColumn": 7, - "endLine": 87, - "endColumn": 30, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'TaskRoleArn' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "TaskDefinitionWithRefToResource", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.TaskRoleArn", - "category": "Best Practice", - "startLine": 89, - "startColumn": 7, - "endLine": 89, - "endColumn": 18, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt FargateTaskRole.Arn" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "TaskDefinitionWithRefToParameter", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.ContainerDefinitions", - "category": "Best Practice", - "startLine": 93, - "startColumn": 7, - "endLine": 93, - "endColumn": 27, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "TaskDefinitionWithRefToParameter", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.Cpu", - "category": "Best Practice", - "startLine": 104, - "startColumn": 7, - "endLine": 104, - "endColumn": 10, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ExecutionRoleArn' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "TaskDefinitionWithRefToParameter", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.ExecutionRoleArn", - "category": "Best Practice", - "startLine": 105, - "startColumn": 7, - "endLine": 105, - "endColumn": 23, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt FargateExecutionRole.Arn" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Memory' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "TaskDefinitionWithRefToParameter", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.Memory", - "category": "Best Practice", - "startLine": 106, - "startColumn": 7, - "endLine": 106, - "endColumn": 13, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "TaskDefinitionWithRefToParameter", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.NetworkMode", - "category": "Best Practice", - "startLine": 107, - "startColumn": 7, - "endLine": 107, - "endColumn": 18, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "TaskDefinitionWithRefToParameter", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.RequiresCompatibilities", - "category": "Best Practice", - "startLine": 108, - "startColumn": 7, - "endLine": 108, - "endColumn": 30, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'TaskRoleArn' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "TaskDefinitionWithRefToParameter", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.TaskRoleArn", - "category": "Best Practice", - "startLine": 110, - "startColumn": 7, - "endLine": 110, - "endColumn": 18, - "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt FargateTaskRole.Arn" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "LaunchConfiguration", - "entityType": "Resource", - "resourceType": "AWS::AutoScaling::LaunchConfiguration" - }, - "propertyPath": "Properties.ImageId", - "category": "Best Practice", - "startLine": 114, - "startColumn": 7, - "endLine": 114, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'InstanceType' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "LaunchConfiguration", - "entityType": "Resource", - "resourceType": "AWS::AutoScaling::LaunchConfiguration" - }, - "propertyPath": "Properties.InstanceType", - "category": "Best Practice", - "startLine": 115, - "startColumn": 7, - "endLine": 115, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'AssociatePublicIpAddress' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "LaunchConfiguration", - "entityType": "Resource", - "resourceType": "AWS::AutoScaling::LaunchConfiguration" - }, - "propertyPath": "Properties.AssociatePublicIpAddress", - "category": "Best Practice", - "startLine": 116, - "startColumn": 7, - "endLine": 116, - "endColumn": 31, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'SecurityGroups' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "LaunchConfiguration", - "entityType": "Resource", - "resourceType": "AWS::AutoScaling::LaunchConfiguration" - }, - "propertyPath": "Properties.SecurityGroups", - "category": "Best Practice", - "startLine": 117, - "startColumn": 7, - "endLine": 117, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Cluster' of type 'AWS::ECS::Cluster' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "Cluster", - "entityType": "Resource", - "resourceType": "AWS::ECS::Cluster" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 7, - "startColumn": 3, - "endLine": 7, - "endColumn": 10, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'FargateExecutionRole' of type 'AWS::IAM::Role' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "FargateExecutionRole", - "entityType": "Resource", - "resourceType": "AWS::IAM::Role" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 11, - "startColumn": 5, - "endLine": 11, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'FargateTaskRole' of type 'AWS::IAM::Role' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "FargateTaskRole", - "entityType": "Resource", - "resourceType": "AWS::IAM::Role" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 24, - "startColumn": 5, - "endLine": 24, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Vpc' of type 'AWS::EC2::VPC' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "Vpc", - "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 34, - "startColumn": 5, - "endLine": 34, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Subnet1' of type 'AWS::EC2::Subnet' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "Subnet1", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 38, - "startColumn": 5, - "endLine": 38, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Subnet2' of type 'AWS::EC2::Subnet' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "Subnet2", - "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 43, - "startColumn": 5, - "endLine": 43, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'SecurityGroup1' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "SecurityGroup1", - "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 48, - "startColumn": 5, - "endLine": 48, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'SecurityGroup2' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "SecurityGroup2", - "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 53, - "startColumn": 5, - "endLine": 53, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'LoadBalancer' of type 'AWS::ElasticLoadBalancingV2::LoadBalancer' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "LoadBalancer", - "entityType": "Resource", - "resourceType": "AWS::ElasticLoadBalancingV2::LoadBalancer" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 57, - "startColumn": 5, - "endLine": 57, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'LogGroup' of type 'AWS::Logs::LogGroup' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "LogGroup", - "entityType": "Resource", - "resourceType": "AWS::Logs::LogGroup" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 65, - "startColumn": 3, - "endLine": 65, - "endColumn": 11, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'TaskDefinitionWithRefToResource' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "TaskDefinitionWithRefToResource", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 71, - "startColumn": 5, - "endLine": 71, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'TaskDefinitionWithRefToParameter' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "TaskDefinitionWithRefToParameter", - "entityType": "Resource", - "resourceType": "AWS::ECS::TaskDefinition" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 92, - "startColumn": 5, - "endLine": 92, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "integration/resources-cloudformation-init.yaml": { - "filePath": "integration/resources-cloudformation-init.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 2, - "informational": 2, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "W2509", - "severity": "WARN", - "message": "Parameter 'DBPassword' appears to be a password but does not have NoEcho set to true", - "source": "ENGINE", - "entity": { - "logicalId": "DBPassword", - "entityType": "Parameter" - }, - "propertyPath": "Parameters/DBPassword", - "category": "Security", - "startLine": 6, - "startColumn": 3, - "endLine": 6, - "endColumn": 13, - "ruleDescription": "Password parameter should have NoEcho", - "phase": "LINT" - }, - { - "ruleId": "W9010", - "severity": "WARN", - "message": "Hardcoded AMI ID - use a parameter or mapping for portability", - "source": "ENGINE", - "entity": { - "logicalId": "MyInstance", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.ImageId", - "category": "Security", - "startLine": 94, - "startColumn": 7, - "endLine": 94, - "endColumn": 14, - "ruleDescription": "Hardcoded AMI ID", - "phase": "LINT" - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "MyInstance", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.ImageId", - "category": "Best Practice", - "startLine": 94, - "startColumn": 7, - "endLine": 94, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'MyInstance' of type 'AWS::EC2::Instance' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "MyInstance", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 93, - "startColumn": 5, - "endLine": 93, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "issues/sam_w_conditions.yaml": { - "filePath": "issues/sam_w_conditions.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 17, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 37, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "VmdEventsQueue", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "category": "Best Practice", - "startLine": 203, - "startColumn": 3, - "endLine": 203, - "endColumn": 17, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "VmdEventsQueue", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "category": "Best Practice", - "startLine": 203, - "startColumn": 3, - "endLine": 203, - "endColumn": 17, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "VmdEventsDeadLetterQueue", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "category": "Best Practice", - "startLine": 214, - "startColumn": 3, - "endLine": 214, - "endColumn": 27, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "VmdEventsDeadLetterQueue", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "category": "Best Practice", - "startLine": 214, - "startColumn": 3, - "endLine": 214, - "endColumn": 27, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "DmdEventsQueue", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "category": "Best Practice", - "startLine": 328, - "startColumn": 3, - "endLine": 328, - "endColumn": 17, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "DmdEventsQueue", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "category": "Best Practice", - "startLine": 328, - "startColumn": 3, - "endLine": 328, - "endColumn": 17, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "DmdEventsDeadLetterQueue", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "category": "Best Practice", - "startLine": 339, - "startColumn": 3, - "endLine": 339, - "endColumn": 27, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "DmdEventsDeadLetterQueue", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "category": "Best Practice", - "startLine": 339, - "startColumn": 3, - "endLine": 339, - "endColumn": 27, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ManagedPolicyName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "DeniedPolicies", - "entityType": "Resource", - "resourceType": "AWS::IAM::ManagedPolicy" - }, - "propertyPath": "Properties.ManagedPolicyName", - "category": "Best Practice", - "startLine": 118, - "startColumn": 7, - "endLine": 118, - "endColumn": 24, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "dynamic (Sub:${GlobalPrefix}-${ComponentShortName}-DeniedPolicies-${TenantAwsResource})" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Description' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "DeniedPolicies", - "entityType": "Resource", - "resourceType": "AWS::IAM::ManagedPolicy" - }, - "propertyPath": "Properties.Description", - "category": "Best Practice", - "startLine": 119, - "startColumn": 7, - "endLine": 119, - "endColumn": 18, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Path' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "DeniedPolicies", - "entityType": "Resource", - "resourceType": "AWS::IAM::ManagedPolicy" - }, - "propertyPath": "Properties.Path", - "category": "Best Practice", - "startLine": 120, - "startColumn": 7, - "endLine": 120, - "endColumn": 11, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ManagedPolicyName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "LogMonitoringPolicy", - "entityType": "Resource", - "resourceType": "AWS::IAM::ManagedPolicy" - }, - "propertyPath": "Properties.ManagedPolicyName", - "category": "Best Practice", - "startLine": 138, - "startColumn": 7, - "endLine": 138, - "endColumn": 24, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "dynamic (Sub:${GlobalPrefix}-${ComponentShortName}-LogMonitoringPolicy-${TenantAwsResource})" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Description' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "LogMonitoringPolicy", - "entityType": "Resource", - "resourceType": "AWS::IAM::ManagedPolicy" - }, - "propertyPath": "Properties.Description", - "category": "Best Practice", - "startLine": 139, - "startColumn": 7, - "endLine": 139, - "endColumn": 18, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Path' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "LogMonitoringPolicy", - "entityType": "Resource", - "resourceType": "AWS::IAM::ManagedPolicy" - }, - "propertyPath": "Properties.Path", - "category": "Best Practice", - "startLine": 140, - "startColumn": 7, - "endLine": 140, - "endColumn": 11, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Description' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "TenantInfoReadPolicy", - "entityType": "Resource", - "resourceType": "AWS::IAM::ManagedPolicy" - }, - "propertyPath": "Properties.Description", - "category": "Best Practice", - "startLine": 154, - "startColumn": 7, - "endLine": 154, - "endColumn": 18, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'QueueName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "VmdEventsQueue", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "propertyPath": "Properties.QueueName", - "category": "Best Practice", - "startLine": 207, - "startColumn": 7, - "endLine": 207, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sqs.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "dynamic (Sub:${Solution}-${Environment}-${ComponentShortName}-VmdEventsQueue-${TenantAwsResource}.fifo)" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'FifoQueue' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "VmdEventsQueue", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "propertyPath": "Properties.FifoQueue", - "category": "Best Practice", - "startLine": 209, - "startColumn": 7, - "endLine": 209, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sqs.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'QueueName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "VmdEventsDeadLetterQueue", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "propertyPath": "Properties.QueueName", - "category": "Best Practice", - "startLine": 218, - "startColumn": 7, - "endLine": 218, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sqs.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "dynamic (Sub:${Solution}-${Environment}-${ComponentShortName}-VmdEventsDeadLetterQueue-${TenantAwsResource}.fifo)" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'FifoQueue' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "VmdEventsDeadLetterQueue", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "propertyPath": "Properties.FifoQueue", - "category": "Best Practice", - "startLine": 220, - "startColumn": 7, - "endLine": 220, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sqs.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Protocol' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "VmdEventsSubscription", - "entityType": "Resource", - "resourceType": "AWS::SNS::Subscription" - }, - "propertyPath": "Properties.Protocol", - "category": "Best Practice", - "startLine": 265, - "startColumn": 7, - "endLine": 265, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sns", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Endpoint' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "VmdEventsSubscription", - "entityType": "Resource", - "resourceType": "AWS::SNS::Subscription" - }, - "propertyPath": "Properties.Endpoint", - "category": "Best Practice", - "startLine": 266, - "startColumn": 7, - "endLine": 266, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sns", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt VmdEventsQueue.Arn" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Region' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "VmdEventsSubscription", - "entityType": "Resource", - "resourceType": "AWS::SNS::Subscription" - }, - "propertyPath": "Properties.Region", - "category": "Best Practice", - "startLine": 267, - "startColumn": 7, - "endLine": 267, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sns", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only", - "resolutionSource": "parameter 'VmdEventsSourceRegion' (type String)" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'TopicArn' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "VmdEventsSubscription", - "entityType": "Resource", - "resourceType": "AWS::SNS::Subscription" - }, - "propertyPath": "Properties.TopicArn", - "category": "Best Practice", - "startLine": 268, - "startColumn": 7, - "endLine": 268, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sns", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter 'VmdEventsSourceArn' (type String)" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'QueueName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "DmdEventsQueue", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "propertyPath": "Properties.QueueName", - "category": "Best Practice", - "startLine": 332, - "startColumn": 7, - "endLine": 332, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sqs.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "dynamic (Sub:${Solution}-${Environment}-${ComponentShortName}-DmdEventsQueue-${TenantAwsResource}.fifo)" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'FifoQueue' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "DmdEventsQueue", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "propertyPath": "Properties.FifoQueue", - "category": "Best Practice", - "startLine": 334, - "startColumn": 7, - "endLine": 334, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sqs.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'QueueName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "DmdEventsDeadLetterQueue", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "propertyPath": "Properties.QueueName", - "category": "Best Practice", - "startLine": 343, - "startColumn": 7, - "endLine": 343, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sqs.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "dynamic (Sub:${Solution}-${Environment}-${ComponentShortName}-DmdEventsDeadLetterQueue-${TenantAwsResource}.fifo)" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'FifoQueue' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "DmdEventsDeadLetterQueue", - "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" - }, - "propertyPath": "Properties.FifoQueue", - "category": "Best Practice", - "startLine": 345, - "startColumn": 7, - "endLine": 345, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sqs.git", - "ruleDescription": "Create-only property updated triggers resource replacement", + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 6, + "startColumn": 5, + "endLine": 6, + "endColumn": 12, + "ruleDescription": "Check if Lambda Function Runtimes are updatable", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "actualValue": "nodejs6.10", + "lifecycle": "end-of-life" } }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Protocol' is create-only; updating it will cause resource replacement", + "message": "Resource 'IgnoredFunction' of type 'AWS::Serverless::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "DmdEventsSubscription", + "logicalId": "IgnoredFunction", "entityType": "Resource", - "resourceType": "AWS::SNS::Subscription" + "resourceType": "AWS::Serverless::Function" }, - "propertyPath": "Properties.Protocol", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 390, - "startColumn": 7, - "endLine": 390, + "startLine": 12, + "startColumn": 5, + "endLine": 12, "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sns", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Endpoint' is create-only; updating it will cause resource replacement", + "message": "Resource 'SelectiveIgnoreFunction' of type 'AWS::Serverless::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "DmdEventsSubscription", + "logicalId": "SelectiveIgnoreFunction", "entityType": "Resource", - "resourceType": "AWS::SNS::Subscription" + "resourceType": "AWS::Serverless::Function" }, - "propertyPath": "Properties.Endpoint", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 391, - "startColumn": 7, - "endLine": 391, + "startLine": 20, + "startColumn": 5, + "endLine": 20, "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sns", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt DmdEventsQueue.Arn" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Region' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "DmdEventsSubscription", - "entityType": "Resource", - "resourceType": "AWS::SNS::Subscription" - }, - "propertyPath": "Properties.Region", - "category": "Best Practice", - "startLine": 392, - "startColumn": 7, - "endLine": 392, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sns", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only", - "resolutionSource": "parameter 'DmdEventsSourceRegion' (type String)" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'TopicArn' is create-only; updating it will cause resource replacement", + "message": "Resource 'InheritsGlobalsFunction' of type 'AWS::Serverless::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "DmdEventsSubscription", + "logicalId": "InheritsGlobalsFunction", "entityType": "Resource", - "resourceType": "AWS::SNS::Subscription" + "resourceType": "AWS::Serverless::Function" }, - "propertyPath": "Properties.TopicArn", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 393, - "startColumn": 7, - "endLine": 393, + "startLine": 26, + "startColumn": 5, + "endLine": 26, "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sns", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter 'DmdEventsSourceArn' (type String)" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "good/transform_serverless_ignore_globals_supported_runtime.yaml": { + "filePath": "good/transform_serverless_ignore_globals_supported_runtime.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 3, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 3, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'VmdEventsLambda' of type 'AWS::Serverless::Function' supports Tags but none are configured", + "message": "Resource 'IgnoredFunction' of type 'AWS::Serverless::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "VmdEventsLambda", + "logicalId": "IgnoredFunction", "entityType": "Resource", "resourceType": "AWS::Serverless::Function" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 171, + "startLine": 12, "startColumn": 5, - "endLine": 171, + "endLine": 12, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -13312,19 +7565,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'VmdEventsQueue' of type 'AWS::SQS::Queue' supports Tags but none are configured", + "message": "Resource 'SelectiveIgnoreFunction' of type 'AWS::Serverless::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "VmdEventsQueue", + "logicalId": "SelectiveIgnoreFunction", "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" + "resourceType": "AWS::Serverless::Function" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 206, + "startLine": 20, "startColumn": 5, - "endLine": 206, + "endLine": 20, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -13332,95 +7585,132 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'VmdEventsLambdaErrorsGreaterThanZeroAlarm' of type 'AWS::CloudWatch::Alarm' supports Tags but none are configured", + "message": "Resource 'InheritsGlobalsFunction' of type 'AWS::Serverless::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "VmdEventsLambdaErrorsGreaterThanZeroAlarm", + "logicalId": "InheritsGlobalsFunction", "entityType": "Resource", - "resourceType": "AWS::CloudWatch::Alarm" + "resourceType": "AWS::Serverless::Function" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 274, + "startLine": 26, "startColumn": 5, - "endLine": 274, + "endLine": 26, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "good/unique_items_deploy_time_values.json": { + "filePath": "good/unique_items_deploy_time_values.json", + "status": "OK", + "metadata": { + "resourcesScanned": 3, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 3, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'DmdEventsLambda' of type 'AWS::Serverless::Function' supports Tags but none are configured", + "message": "Resource 'StackOutputSubnets' of type 'AWS::RDS::DBSubnetGroup' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "DmdEventsLambda", + "logicalId": "StackOutputSubnets", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::RDS::DBSubnetGroup" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 296, - "startColumn": 5, - "endLine": 296, - "endColumn": 15, + "startLine": 12, + "startColumn": 7, + "endLine": 12, + "endColumn": 18, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'DmdEventsQueue' of type 'AWS::SQS::Queue' supports Tags but none are configured", + "message": "Resource 'ImportedSubnets' of type 'AWS::RDS::DBSubnetGroup' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "DmdEventsQueue", + "logicalId": "ImportedSubnets", "entityType": "Resource", - "resourceType": "AWS::SQS::Queue" + "resourceType": "AWS::RDS::DBSubnetGroup" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 331, - "startColumn": 5, - "endLine": 331, - "endColumn": 15, + "startLine": 34, + "startColumn": 7, + "endLine": 34, + "endColumn": 18, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'DmdEventsLambdaErrorsGreaterThanZeroAlarm' of type 'AWS::CloudWatch::Alarm' supports Tags but none are configured", + "message": "Resource 'SelectedSubnets' of type 'AWS::RDS::DBSubnetGroup' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "DmdEventsLambdaErrorsGreaterThanZeroAlarm", + "logicalId": "SelectedSubnets", "entityType": "Resource", - "resourceType": "AWS::CloudWatch::Alarm" + "resourceType": "AWS::RDS::DBSubnetGroup" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 399, - "startColumn": 5, - "endLine": 399, - "endColumn": 15, + "startLine": 44, + "startColumn": 7, + "endLine": 44, + "endColumn": 18, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "lsp/comprehensive.json": { - "filePath": "lsp/comprehensive.json", + "good/unknown_resource_types_ignored.yaml": { + "filePath": "good/unknown_resource_types_ignored.yaml", "status": "OK", "metadata": { - "resourcesScanned": 12, + "resourcesScanned": 5, "counts": { - "fatal": 4, - "errors": 1, - "warnings": 8, - "informational": 29, + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 0, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [] + }, + "good/unresolved_values_are_present.yaml": { + "filePath": "good/unresolved_values_are_present.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 15, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 32, "debug": 0 }, "suppressed": 0, @@ -13429,324 +7719,426 @@ }, "diagnostics": [ { - "ruleId": "F3003", - "severity": "FATAL", - "message": "'MaxSize' is a required property", - "source": "SCHEMA", + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "AutoScalingGroup", + "logicalId": "ValkeyGroup", "entityType": "Resource", - "resourceType": "AWS::AutoScaling::AutoScalingGroup" + "resourceType": "AWS::ElastiCache::ReplicationGroup" }, - "propertyPath": "Properties", - "suggestedFix": "Add the required property 'MaxSize'", - "category": "Schema", - "startLine": 564, + "category": "Best Practice", + "startLine": 134, + "startColumn": 3, + "endLine": 134, + "endColumn": 14, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "ValkeyGroup", + "entityType": "Resource", + "resourceType": "AWS::ElastiCache::ReplicationGroup" + }, + "category": "Best Practice", + "startLine": 134, + "startColumn": 3, + "endLine": 134, + "endColumn": 14, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "Vpc", + "entityType": "Resource", + "resourceType": "AWS::EC2::VPC" + }, + "propertyPath": "Properties.CidrBlock", + "category": "Best Practice", + "startLine": 17, "startColumn": 7, - "endLine": 564, - "endColumn": 18, - "ruleDescription": "Required property missing", - "phase": "SCHEMA" + "endLine": 17, + "endColumn": 16, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "F3003", - "severity": "FATAL", - "message": "'MinSize' is a required property", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "AutoScalingGroup", + "logicalId": "Subnet1", "entityType": "Resource", - "resourceType": "AWS::AutoScaling::AutoScalingGroup" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties", - "suggestedFix": "Add the required property 'MinSize'", - "category": "Schema", - "startLine": 564, + "propertyPath": "Properties.VpcId", + "category": "Best Practice", + "startLine": 24, "startColumn": 7, - "endLine": 564, - "endColumn": 18, - "ruleDescription": "Required property missing", - "phase": "SCHEMA" + "endLine": 24, + "endColumn": 12, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'Vpc'" + } }, { - "ruleId": "F6101", - "severity": "FATAL", - "message": "Fn::Sub variable '${MaxScaling}' does not reference a valid resource, parameter, or pseudo-parameter", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ComplexOutput", - "entityType": "Output" + "logicalId": "Subnet1", + "entityType": "Resource", + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Outputs/ComplexOutput/Value.Fn::Sub", - "category": "Structure", - "startLine": 943, - "startColumn": 5, - "endLine": 943, - "endColumn": 19, - "ruleDescription": "Output value must be a string", - "phase": "SCHEMA" + "propertyPath": "Properties.CidrBlock", + "category": "Best Practice", + "startLine": 25, + "startColumn": 7, + "endLine": 25, + "endColumn": 16, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "F8611", - "severity": "FATAL", - "message": "'Fn::FindInMap' is not supported in the Rules section - allowed: ['Ref', 'Fn::ValueOf', 'Fn::ValueOfAll', 'Fn::RefAll', 'Fn::Contains', 'Fn::EachMemberEquals', 'Fn::EachMemberIn', 'Fn::Equals', 'Fn::And', 'Fn::Or', 'Fn::Not', 'Fn::If', 'Fn::Select']", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "Subnet2", + "entityType": "Resource", + "resourceType": "AWS::EC2::Subnet" + }, + "propertyPath": "Properties.VpcId", + "category": "Best Practice", + "startLine": 32, + "startColumn": 7, + "endLine": 32, + "endColumn": 12, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'Vpc'" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ValidateRegionAndEnvironment", - "entityType": "Rule" + "logicalId": "Subnet2", + "entityType": "Resource", + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Rules/ValidateRegionAndEnvironment", - "category": "Structure", - "startLine": 197, - "startColumn": 5, - "endLine": 197, - "endColumn": 34, - "ruleDescription": "Disallowed function in Rules section", - "phase": "PARSE" + "propertyPath": "Properties.CidrBlock", + "category": "Best Practice", + "startLine": 33, + "startColumn": 7, + "endLine": 33, + "endColumn": 16, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "E9006", - "severity": "ERROR", - "message": "'8.0' is not one of ['5.5.62', '5.6.51', '5.7.33', '5.7.34', '5.7.36', '5.7.37', '5.7.38', '5.7.39', '5.7.40', '5.7.41', '5.7.42', '5.7.43', '5.7.44', '5.7.44-rds.20240408', '5.7.44-rds.20240529', '5.7.44-rds.20240808', '5.7.44-rds.20250103', '5.7.44-rds.20250213', '5.7.44-rds.20250508', '5.7.44-rds.20250818', '5.7.44-rds.20251212', '5.7.44-rds.20260212', '5.7.44-rds.20260521', '5.7.44-rds.20260624', '5.7.44-rds.20260902', '8.0.11', '8.0.13', '8.0.15', '8.0.16', '8.0.17', '8.0.19', '8.0.20', '8.0.21', '8.0.23', '8.0.25', '8.0.26', '8.0.27', '8.0.28', '8.0.29', '8.0.30', '8.0.31', '8.0.32', '8.0.33', '8.0.34', '8.0.35', '8.0.36', '8.0.37', '8.0.39', '8.0.40', '8.0.41', '8.0.42', '8.0.43', '8.0.44', '8.0.45', '8.0.46', '8.0.46-rds.20260624', '8.0.46-rds.20260908', '8.4.10', '8.4.11', '8.4.3', '8.4.4', '8.4.5', '8.4.6', '8.4.7', '8.4.8', '8.4.9']", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Database", + "logicalId": "Cluster", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::RDS::DBCluster" }, - "propertyPath": "Properties.EngineVersion", - "category": "Schema", - "startLine": 647, - "startColumn": 9, - "endLine": 647, - "endColumn": 23, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Property value not valid for conditional extension enum", - "phase": "SCHEMA" + "propertyPath": "Properties.Engine", + "category": "Best Practice", + "startLine": 42, + "startColumn": 7, + "endLine": 42, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "W1011", - "severity": "WARN", - "message": "Use dynamic references (e.g., SSM SecureString) instead of parameter 'DatabasePassword' for secrets", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'MasterUsername' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Database", + "logicalId": "Cluster", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::RDS::DBCluster" }, - "propertyPath": "Properties.MasterUserPassword", - "category": "Security", - "startLine": 664, - "startColumn": 9, - "endLine": 664, - "endColumn": 28, - "ruleDescription": "Instead of REFing a parameter for a secret use a dynamic reference", - "phase": "LINT" + "propertyPath": "Properties.MasterUsername", + "category": "Best Practice", + "startLine": 43, + "startColumn": 7, + "endLine": 43, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "W1028", - "severity": "WARN", - "message": "['Fn::If', 2] is not reachable. When setting condition 'IsProduction' to False from current status True", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ConditionalOutput", - "entityType": "Output" + "logicalId": "SecurityGroup", + "entityType": "Resource", + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Outputs/ConditionalOutput/Value.Fn::If.2", + "propertyPath": "Properties.GroupDescription", "category": "Best Practice", - "startLine": 996, - "startColumn": 5, - "endLine": 996, + "startLine": 52, + "startColumn": 7, + "endLine": 52, "endColumn": 23, - "ruleDescription": "Check Fn::If has a path that cannot be reached", - "phase": "LINT" + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W2508", - "severity": "WARN", - "message": "Security group allows 0.0.0.0/0 access to sensitive port 22 (range 22-22)", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "BastionSecurityGroup", + "logicalId": "SecurityGroup", "entityType": "Resource", "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.SecurityGroupIngress", - "suggestedFix": "Restrict the CIDR range to specific IP addresses", - "category": "Security", - "startLine": 495, - "startColumn": 9, - "endLine": 495, - "endColumn": 30, - "ruleDescription": "Security group allows open access to sensitive port", - "phase": "LINT" + "propertyPath": "Properties.VpcId", + "category": "Best Practice", + "startLine": 53, + "startColumn": 7, + "endLine": 53, + "endColumn": 12, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'Vpc'" + } }, { - "ruleId": "W2531", - "severity": "WARN", - "message": "Runtime 'python3.9' was deprecated on '2025-12-15'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'python3.14'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'GroupId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "LambdaFunction", + "logicalId": "IngressFromAttribute", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::EC2::SecurityGroupIngress" }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 738, - "startColumn": 9, - "endLine": 738, - "endColumn": 17, - "ruleDescription": "Check if EOL Lambda Function Runtimes are used", + "propertyPath": "Properties.GroupId", + "category": "Best Practice", + "startLine": 65, + "startColumn": 7, + "endLine": 65, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "actualValue": "python3.9", - "lifecycle": "deprecated" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'SecurityGroup'" } }, { - "ruleId": "W8001", - "severity": "WARN", - "message": "Condition 'IsNotProduction' is not used by any resource or Fn::If", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'IpProtocol' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "IsNotProduction", - "entityType": "Condition" + "logicalId": "IngressFromAttribute", + "entityType": "Resource", + "resourceType": "AWS::EC2::SecurityGroupIngress" }, - "propertyPath": "Conditions/IsNotProduction", + "propertyPath": "Properties.IpProtocol", "category": "Best Practice", - "startLine": 125, - "startColumn": 5, - "endLine": 125, - "endColumn": 21, - "ruleDescription": "Check if Conditions are Used", - "phase": "LINT" + "startLine": 66, + "startColumn": 7, + "endLine": 66, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W8001", - "severity": "WARN", - "message": "Condition 'ComplexCondition' is not used by any resource or Fn::If", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'CidrIp' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ComplexCondition", - "entityType": "Condition" + "logicalId": "IngressFromAttribute", + "entityType": "Resource", + "resourceType": "AWS::EC2::SecurityGroupIngress" }, - "propertyPath": "Conditions/ComplexCondition", + "propertyPath": "Properties.CidrIp", "category": "Best Practice", - "startLine": 155, - "startColumn": 5, - "endLine": 155, - "endColumn": 22, - "ruleDescription": "Check if Conditions are Used", - "phase": "LINT" + "startLine": 67, + "startColumn": 7, + "endLine": 67, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W9003", - "severity": "WARN", - "message": "100 (from Fn::If on condition 'IsProduction') is not of type 'string' - automatically coerced (number to string)", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'FromPort' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Database", + "logicalId": "IngressFromAttribute", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::SecurityGroupIngress" }, - "propertyPath": "Properties.AllocatedStorage", + "propertyPath": "Properties.FromPort", "category": "Best Practice", - "startLine": 648, - "startColumn": 9, - "endLine": 648, - "endColumn": 26, - "conditionScenario": { - "IsProduction": true - }, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Property type coercion warning", + "startLine": 68, + "startColumn": 7, + "endLine": 68, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "resolutionSource": "Fn::If on condition 'IsProduction'" + "lifecycle": "create-only", + "resolutionSource": "GetAtt Cluster.Endpoint.Port" } }, { - "ruleId": "W9008", - "severity": "WARN", - "message": "RDS instance should have StorageEncrypted set to true", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ToPort' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Database", + "logicalId": "IngressFromAttribute", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::SecurityGroupIngress" }, - "propertyPath": "Properties.StorageEncrypted", - "suggestedFix": "Set StorageEncrypted to true", - "category": "Security", - "startLine": 656, - "startColumn": 9, - "endLine": 656, - "endColumn": 26, - "ruleDescription": "RDS instance should have StorageEncrypted", - "phase": "LINT" + "propertyPath": "Properties.ToPort", + "category": "Best Practice", + "startLine": 69, + "startColumn": 7, + "endLine": 69, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "GetAtt Cluster.Endpoint.Port" + } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Property 'GroupId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "VPC", + "logicalId": "IngressFromImport", "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" + "resourceType": "AWS::EC2::SecurityGroupIngress" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Properties.GroupId", "category": "Best Practice", - "startLine": 362, - "startColumn": 9, - "endLine": 362, - "endColumn": 19, + "startLine": 73, + "startColumn": 7, + "endLine": 73, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'SecurityGroup'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "message": "Property 'IpProtocol' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "PublicSubnet", + "logicalId": "IngressFromImport", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::EC2::SecurityGroupIngress" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.IpProtocol", "category": "Best Practice", - "startLine": 390, - "startColumn": 9, - "endLine": 390, - "endColumn": 15, + "startLine": 74, + "startColumn": 7, + "endLine": 74, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'VPC'" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Property 'CidrIp' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "PublicSubnet", + "logicalId": "IngressFromImport", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::EC2::SecurityGroupIngress" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Properties.CidrIp", "category": "Best Practice", - "startLine": 393, - "startColumn": 9, - "endLine": 393, - "endColumn": 19, + "startLine": 75, + "startColumn": 7, + "endLine": 75, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -13756,87 +8148,92 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", + "message": "Property 'FromPort' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "PublicSubnet", + "logicalId": "IngressFromImport", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::EC2::SecurityGroupIngress" }, - "propertyPath": "Properties.AvailabilityZone", + "propertyPath": "Properties.FromPort", "category": "Best Practice", - "startLine": 401, - "startColumn": 9, - "endLine": 401, - "endColumn": 26, + "startLine": 76, + "startColumn": 7, + "endLine": 76, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "dynamic (Select with unresolvable arguments)" + "resolutionSource": "dynamic (cross-stack import: SharedPort)" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", + "message": "Property 'ToPort' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "WebSecurityGroup", + "logicalId": "IngressFromImport", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::EC2::SecurityGroupIngress" }, - "propertyPath": "Properties.GroupDescription", + "propertyPath": "Properties.ToPort", "category": "Best Practice", - "startLine": 443, - "startColumn": 9, - "endLine": 443, - "endColumn": 26, + "startLine": 77, + "startColumn": 7, + "endLine": 77, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "dynamic (cross-stack import: SharedPort)" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "message": "Property 'GroupId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "WebSecurityGroup", + "logicalId": "EgressFromParameter", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::EC2::SecurityGroupEgress" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.GroupId", "category": "Best Practice", - "startLine": 444, - "startColumn": 9, - "endLine": 444, - "endColumn": 15, + "startLine": 81, + "startColumn": 7, + "endLine": 81, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "Ref to 'VPC'" + "resolutionSource": "Ref to 'SecurityGroup'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", + "message": "Property 'IpProtocol' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "BastionSecurityGroup", + "logicalId": "EgressFromParameter", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::EC2::SecurityGroupEgress" }, - "propertyPath": "Properties.GroupDescription", + "propertyPath": "Properties.IpProtocol", "category": "Best Practice", - "startLine": 491, - "startColumn": 9, - "endLine": 491, - "endColumn": 26, + "startLine": 82, + "startColumn": 7, + "endLine": 82, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -13846,274 +8243,326 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "message": "Property 'CidrIp' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "BastionSecurityGroup", + "logicalId": "EgressFromParameter", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::EC2::SecurityGroupEgress" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.CidrIp", "category": "Best Practice", - "startLine": 492, - "startColumn": 9, - "endLine": 492, - "endColumn": 15, + "startLine": 83, + "startColumn": 7, + "endLine": 83, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'VPC'" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'LaunchTemplateName' is create-only; updating it will cause resource replacement", + "message": "Property 'FromPort' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "LaunchTemplate", + "logicalId": "EgressFromParameter", "entityType": "Resource", - "resourceType": "AWS::EC2::LaunchTemplate" + "resourceType": "AWS::EC2::SecurityGroupEgress" }, - "propertyPath": "Properties.LaunchTemplateName", + "propertyPath": "Properties.FromPort", "category": "Best Practice", - "startLine": 508, - "startColumn": 9, - "endLine": 508, - "endColumn": 28, + "startLine": 84, + "startColumn": 7, + "endLine": 84, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "parameter with AllowedValues" + "resolutionSource": "parameter 'DbPort' (type Number)" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'AutoScalingGroupName' is create-only; updating it will cause resource replacement", + "message": "Property 'ToPort' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "AutoScalingGroup", + "logicalId": "EgressFromParameter", "entityType": "Resource", - "resourceType": "AWS::AutoScaling::AutoScalingGroup" + "resourceType": "AWS::EC2::SecurityGroupEgress" }, - "propertyPath": "Properties.AutoScalingGroupName", + "propertyPath": "Properties.ToPort", "category": "Best Practice", - "startLine": 565, - "startColumn": 9, - "endLine": 565, - "endColumn": 30, + "startLine": 85, + "startColumn": 7, + "endLine": 85, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "parameter with AllowedValues" + "resolutionSource": "parameter 'DbPort' (type Number)" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'LaunchTemplate' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'DomainName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "AutoScalingGroup", + "logicalId": "Certificate", "entityType": "Resource", - "resourceType": "AWS::AutoScaling::AutoScalingGroup" + "resourceType": "AWS::CertificateManager::Certificate" }, - "propertyPath": "Properties.LaunchTemplate", + "propertyPath": "Properties.DomainName", "category": "Best Practice", - "startLine": 568, - "startColumn": 9, - "endLine": 568, - "endColumn": 24, + "startLine": 89, + "startColumn": 7, + "endLine": 89, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-acmpca", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'VPCZoneIdentifier' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "AutoScalingGroup", + "logicalId": "TargetGroup", "entityType": "Resource", - "resourceType": "AWS::AutoScaling::AutoScalingGroup" + "resourceType": "AWS::ElasticLoadBalancingV2::TargetGroup" }, - "propertyPath": "Properties.VPCZoneIdentifier", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 582, - "startColumn": 9, - "endLine": 582, - "endColumn": 27, + "startLine": 103, + "startColumn": 7, + "endLine": 103, + "endColumn": 12, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'Vpc'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'DBInstanceIdentifier' is create-only; updating it will cause resource replacement", + "message": "Property 'Port' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Database", + "logicalId": "TargetGroup", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::ElasticLoadBalancingV2::TargetGroup" }, - "propertyPath": "Properties.DBInstanceIdentifier", + "propertyPath": "Properties.Port", "category": "Best Practice", - "startLine": 634, - "startColumn": 9, - "endLine": 634, - "endColumn": 30, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "startLine": 104, + "startColumn": 7, + "endLine": 104, + "endColumn": 11, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter with AllowedValues" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'Protocol' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Database", + "logicalId": "TargetGroup", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::ElasticLoadBalancingV2::TargetGroup" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.Protocol", "category": "Best Practice", - "startLine": 646, - "startColumn": 9, - "endLine": 646, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "startLine": 105, + "startColumn": 7, + "endLine": 105, + "endColumn": 15, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'StorageEncrypted' is create-only; updating it will cause resource replacement", + "message": "Property 'LoadBalancerArn' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Database", + "logicalId": "HttpsListener", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::ElasticLoadBalancingV2::Listener" }, - "propertyPath": "Properties.StorageEncrypted", + "propertyPath": "Properties.LoadBalancerArn", "category": "Best Practice", - "startLine": 656, - "startColumn": 9, - "endLine": 656, - "endColumn": 26, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "startLine": 112, + "startColumn": 7, + "endLine": 112, + "endColumn": 22, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-elasticloadbalancingv2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "Fn::If on condition 'IsProduction'" + "resolutionSource": "Ref to 'LoadBalancer'" } }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'MasterUsername' is create-only; updating it will cause resource replacement", + "message": "Resource 'HttpsListener' of type 'AWS::ElasticLoadBalancingV2::Listener' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Database", + "logicalId": "HttpsListener", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::ElasticLoadBalancingV2::Listener" }, - "propertyPath": "Properties.MasterUsername", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 663, - "startColumn": 9, - "endLine": 663, - "endColumn": 24, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 111, + "startColumn": 5, + "endLine": 111, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "good/vpc_subnets.yaml": { + "filePath": "good/vpc_subnets.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 4, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 2, + "informational": 12, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "W3010", + "severity": "WARN", + "message": "Avoid hardcoding availability zones 'us-east-1a'", + "source": "CFN_LINT", + "entity": { + "logicalId": "SubnetA", + "entityType": "Resource", + "resourceType": "AWS::EC2::Subnet" + }, + "propertyPath": "Properties.AvailabilityZone", + "category": "Best Practice", + "startLine": 15, + "startColumn": 7, + "endLine": 15, + "endColumn": 23, + "ruleDescription": "Availability zone properties should not be hardcoded", + "phase": "LINT" + }, + { + "ruleId": "W3010", + "severity": "WARN", + "message": "Avoid hardcoding availability zones 'us-east-1b'", + "source": "CFN_LINT", + "entity": { + "logicalId": "SubnetB", + "entityType": "Resource", + "resourceType": "AWS::EC2::Subnet" + }, + "propertyPath": "Properties.AvailabilityZone", + "category": "Best Practice", + "startLine": 21, + "startColumn": 7, + "endLine": 21, + "endColumn": 23, + "ruleDescription": "Availability zone properties should not be hardcoded", + "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'BackupRetentionPeriod' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Database", + "logicalId": "MyVPC", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::VPC" }, - "propertyPath": "Properties.BackupRetentionPeriod", + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 672, - "startColumn": 9, - "endLine": 672, - "endColumn": 31, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "startLine": 6, + "startColumn": 7, + "endLine": 6, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only", - "resolutionSource": "Fn::If on condition 'IsProduction'" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'MultiAZ' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Database", + "logicalId": "SubnetA", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.MultiAZ", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 679, - "startColumn": 9, - "endLine": 679, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "startLine": 13, + "startColumn": 7, + "endLine": 13, + "endColumn": 12, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only", - "resolutionSource": "dynamic (condition reference: IsProduction)" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'MyVPC'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DatabaseSecurityGroup", + "logicalId": "SubnetA", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.GroupDescription", + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 716, - "startColumn": 9, - "endLine": 716, - "endColumn": 26, + "startLine": 14, + "startColumn": 7, + "endLine": 14, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -14123,222 +8572,209 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DatabaseSecurityGroup", + "logicalId": "SubnetA", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.AvailabilityZone", "category": "Best Practice", - "startLine": 717, - "startColumn": 9, - "endLine": 717, - "endColumn": 15, + "startLine": 15, + "startColumn": 7, + "endLine": 15, + "endColumn": 23, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'VPC'" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "LambdaFunction", + "logicalId": "SubnetB", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.FunctionName", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 735, - "startColumn": 9, - "endLine": 735, - "endColumn": 22, + "startLine": 19, + "startColumn": 7, + "endLine": 19, + "endColumn": 12, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "parameter with AllowedValues" + "resolutionSource": "Ref to 'MyVPC'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'RoleName' is create-only; updating it will cause resource replacement", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "LambdaRole", + "logicalId": "SubnetB", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.RoleName", + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 802, - "startColumn": 9, - "endLine": 802, - "endColumn": 18, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "startLine": 20, + "startColumn": 7, + "endLine": 20, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter with AllowedValues" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'AlarmName' is create-only; updating it will cause resource replacement", + "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DatabaseAlarm", + "logicalId": "SubnetB", "entityType": "Resource", - "resourceType": "AWS::CloudWatch::Alarm" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.AlarmName", + "propertyPath": "Properties.AvailabilityZone", "category": "Best Practice", - "startLine": 846, - "startColumn": 9, - "endLine": 846, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-cloudwatch.git", + "startLine": 21, + "startColumn": 7, + "endLine": 21, + "endColumn": 23, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter with AllowedValues" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'TopicName' is create-only; updating it will cause resource replacement", + "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SNSTopic", + "logicalId": "SecurityGroup", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.TopicName", + "propertyPath": "Properties.GroupDescription", "category": "Best Practice", - "startLine": 877, - "startColumn": 9, - "endLine": 877, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sns", + "startLine": 25, + "startColumn": 7, + "endLine": 25, + "endColumn": 23, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter with AllowedValues" + "lifecycle": "create-only" } }, { - "ruleId": "I9003", - "severity": "INFO", - "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", - "source": "ENGINE", - "category": "Best Practice", - "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", - "phase": "LINT" - }, - { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'BastionSecurityGroup' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "BastionSecurityGroup", + "logicalId": "SecurityGroup", "entityType": "Resource", "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 490, + "startLine": 26, "startColumn": 7, - "endLine": 490, - "endColumn": 18, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "endLine": 26, + "endColumn": 12, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'MyVPC'" + } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'DatabaseSecurityGroup' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", + "message": "Resource 'SubnetA' of type 'AWS::EC2::Subnet' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "DatabaseSecurityGroup", + "logicalId": "SubnetA", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::EC2::Subnet" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 715, - "startColumn": 7, - "endLine": 715, - "endColumn": 18, + "startLine": 12, + "startColumn": 5, + "endLine": 12, + "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'LambdaRole' of type 'AWS::IAM::Role' supports Tags but none are configured", + "message": "Resource 'SubnetB' of type 'AWS::EC2::Subnet' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "LambdaRole", + "logicalId": "SubnetB", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::EC2::Subnet" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 801, - "startColumn": 7, - "endLine": 801, - "endColumn": 18, + "startLine": 18, + "startColumn": 5, + "endLine": 18, + "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'DatabaseAlarm' of type 'AWS::CloudWatch::Alarm' supports Tags but none are configured", + "message": "Resource 'SecurityGroup' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "DatabaseAlarm", + "logicalId": "SecurityGroup", "entityType": "Resource", - "resourceType": "AWS::CloudWatch::Alarm" + "resourceType": "AWS::EC2::SecurityGroup" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 845, - "startColumn": 7, - "endLine": 845, - "endColumn": 18, + "startLine": 24, + "startColumn": 5, + "endLine": 24, + "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "lsp/comprehensive.yaml": { - "filePath": "lsp/comprehensive.yaml", + "integration/availability-zones.yaml": { + "filePath": "integration/availability-zones.yaml", "status": "OK", "metadata": { - "resourcesScanned": 12, + "resourcesScanned": 1, "counts": { - "fatal": 4, - "errors": 1, - "warnings": 10, - "informational": 29, + "fatal": 2, + "errors": 0, + "warnings": 0, + "informational": 5, "debug": 0 }, "suppressed": 0, @@ -14347,306 +8783,238 @@ }, "diagnostics": [ { - "ruleId": "F3003", - "severity": "FATAL", - "message": "'MaxSize' is a required property", - "source": "SCHEMA", - "entity": { - "logicalId": "AutoScalingGroup", - "entityType": "Resource", - "resourceType": "AWS::AutoScaling::AutoScalingGroup" - }, - "propertyPath": "Properties", - "suggestedFix": "Add the required property 'MaxSize'", - "category": "Schema", - "startLine": 236, - "startColumn": 5, - "endLine": 236, - "endColumn": 15, - "ruleDescription": "Required property missing", - "phase": "SCHEMA" - }, - { - "ruleId": "F3003", - "severity": "FATAL", - "message": "'MinSize' is a required property", - "source": "SCHEMA", - "entity": { - "logicalId": "AutoScalingGroup", - "entityType": "Resource", - "resourceType": "AWS::AutoScaling::AutoScalingGroup" - }, - "propertyPath": "Properties", - "suggestedFix": "Add the required property 'MinSize'", - "category": "Schema", - "startLine": 236, - "startColumn": 5, - "endLine": 236, - "endColumn": 15, - "ruleDescription": "Required property missing", - "phase": "SCHEMA" - }, - { - "ruleId": "F6101", - "severity": "FATAL", - "message": "Fn::Sub variable '${MaxScaling}' does not reference a valid resource, parameter, or pseudo-parameter", - "source": "SCHEMA", - "entity": { - "logicalId": "ComplexOutput", - "entityType": "Output" - }, - "propertyPath": "Outputs/ComplexOutput/Value.Fn::Sub", - "category": "Structure", - "startLine": 421, - "startColumn": 3, - "endLine": 421, - "endColumn": 16, - "ruleDescription": "Output value must be a string", - "phase": "SCHEMA" - }, - { - "ruleId": "F8611", + "ruleId": "F3020", "severity": "FATAL", - "message": "'Fn::FindInMap' is not supported in the Rules section - allowed: ['Ref', 'Fn::ValueOf', 'Fn::ValueOfAll', 'Fn::RefAll', 'Fn::Contains', 'Fn::EachMemberEquals', 'Fn::EachMemberIn', 'Fn::Equals', 'Fn::And', 'Fn::Or', 'Fn::Not', 'Fn::If', 'Fn::Select']", + "message": "'AvailabilityZoneId' should not be included with 'AvailabilityZone'", "source": "SCHEMA", "entity": { - "logicalId": "ValidateRegionAndEnvironment", - "entityType": "Rule" - }, - "propertyPath": "Rules/ValidateRegionAndEnvironment", - "category": "Structure", - "startLine": 110, - "startColumn": 3, - "endLine": 110, - "endColumn": 31, - "ruleDescription": "Disallowed function in Rules section", - "phase": "PARSE" - }, - { - "ruleId": "E9006", - "severity": "ERROR", - "message": "'8.0' is not one of ['5.5.62', '5.6.51', '5.7.33', '5.7.34', '5.7.36', '5.7.37', '5.7.38', '5.7.39', '5.7.40', '5.7.41', '5.7.42', '5.7.43', '5.7.44', '5.7.44-rds.20240408', '5.7.44-rds.20240529', '5.7.44-rds.20240808', '5.7.44-rds.20250103', '5.7.44-rds.20250213', '5.7.44-rds.20250508', '5.7.44-rds.20250818', '5.7.44-rds.20251212', '5.7.44-rds.20260212', '5.7.44-rds.20260521', '5.7.44-rds.20260624', '5.7.44-rds.20260902', '8.0.11', '8.0.13', '8.0.15', '8.0.16', '8.0.17', '8.0.19', '8.0.20', '8.0.21', '8.0.23', '8.0.25', '8.0.26', '8.0.27', '8.0.28', '8.0.29', '8.0.30', '8.0.31', '8.0.32', '8.0.33', '8.0.34', '8.0.35', '8.0.36', '8.0.37', '8.0.39', '8.0.40', '8.0.41', '8.0.42', '8.0.43', '8.0.44', '8.0.45', '8.0.46', '8.0.46-rds.20260624', '8.0.46-rds.20260908', '8.4.10', '8.4.11', '8.4.3', '8.4.4', '8.4.5', '8.4.6', '8.4.7', '8.4.8', '8.4.9']", - "source": "CFN_LINT", - "entity": { - "logicalId": "Database", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" - }, - "propertyPath": "Properties.EngineVersion", - "category": "Schema", - "startLine": 271, - "startColumn": 7, - "endLine": 271, - "endColumn": 20, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Property value not valid for conditional extension enum", - "phase": "SCHEMA" - }, - { - "ruleId": "W1011", - "severity": "WARN", - "message": "Use dynamic references (e.g., SSM SecureString) instead of parameter 'DatabasePassword' for secrets", - "source": "CFN_LINT", - "entity": { - "logicalId": "Database", + "logicalId": "Subnet", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.MasterUserPassword", - "category": "Security", - "startLine": 276, + "propertyPath": "Properties.AvailabilityZoneId", + "category": "Schema", + "startLine": 5, "startColumn": 7, - "endLine": 276, + "endLine": 5, "endColumn": 25, - "ruleDescription": "Instead of REFing a parameter for a secret use a dynamic reference", - "phase": "LINT" + "ruleDescription": "Mutually exclusive properties", + "phase": "SCHEMA", + "context": { + "property": "AvailabilityZoneId" + } }, { - "ruleId": "W1028", - "severity": "WARN", - "message": "['Fn::If', 2] is not reachable. When setting condition 'IsProduction' to False from current status True", - "source": "CFN_LINT", + "ruleId": "F3020", + "severity": "FATAL", + "message": "'AvailabilityZone' should not be included with 'AvailabilityZoneId'", + "source": "SCHEMA", "entity": { - "logicalId": "ConditionalOutput", - "entityType": "Output" + "logicalId": "Subnet", + "entityType": "Resource", + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Outputs/ConditionalOutput/Value.Fn::If.2", - "category": "Best Practice", - "startLine": 442, - "startColumn": 3, - "endLine": 442, - "endColumn": 20, - "ruleDescription": "Check Fn::If has a path that cannot be reached", - "phase": "LINT" - }, - { - "ruleId": "W1103", - "severity": "WARN", - "message": "'!Implies' is not a supported function", - "source": "ENGINE", - "category": "Intrinsic Function", - "ruleDescription": "Unknown intrinsic function name", - "phase": "PARSE" + "propertyPath": "Properties.AvailabilityZone", + "category": "Schema", + "startLine": 6, + "startColumn": 7, + "endLine": 6, + "endColumn": 23, + "ruleDescription": "Mutually exclusive properties", + "phase": "SCHEMA", + "context": { + "property": "AvailabilityZone" + } }, { - "ruleId": "W2508", - "severity": "WARN", - "message": "Security group allows 0.0.0.0/0 access to sensitive port 22 (range 22-22)", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'AvailabilityZoneId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "BastionSecurityGroup", + "logicalId": "Subnet", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.SecurityGroupIngress", - "suggestedFix": "Restrict the CIDR range to specific IP addresses", - "category": "Security", - "startLine": 206, + "propertyPath": "Properties.AvailabilityZoneId", + "category": "Best Practice", + "startLine": 5, "startColumn": 7, - "endLine": 206, - "endColumn": 27, - "ruleDescription": "Security group allows open access to sensitive port", - "phase": "LINT" + "endLine": 5, + "endColumn": 25, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W2531", - "severity": "WARN", - "message": "Runtime 'python3.9' was deprecated on '2025-12-15'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'python3.14'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "LambdaFunction", + "logicalId": "Subnet", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 306, + "propertyPath": "Properties.AvailabilityZone", + "category": "Best Practice", + "startLine": 6, "startColumn": 7, - "endLine": 306, - "endColumn": 14, - "ruleDescription": "Check if EOL Lambda Function Runtimes are used", + "endLine": 6, + "endColumn": 23, + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "actualValue": "python3.9", - "lifecycle": "deprecated" + "lifecycle": "create-only" } }, { - "ruleId": "W8001", - "severity": "WARN", - "message": "Condition 'IsNotProduction' is not used by any resource or Fn::If", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "IsNotProduction", - "entityType": "Condition" + "logicalId": "Subnet", + "entityType": "Resource", + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Conditions/IsNotProduction", + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 93, - "startColumn": 3, - "endLine": 93, - "endColumn": 18, - "ruleDescription": "Check if Conditions are Used", - "phase": "LINT" + "startLine": 10, + "startColumn": 7, + "endLine": 10, + "endColumn": 16, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W8001", - "severity": "WARN", - "message": "Condition 'ComplexCondition' is not used by any resource or Fn::If", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ComplexCondition", - "entityType": "Condition" + "logicalId": "Subnet", + "entityType": "Resource", + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Conditions/ComplexCondition", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 101, - "startColumn": 3, - "endLine": 101, - "endColumn": 19, - "ruleDescription": "Check if Conditions are Used", - "phase": "LINT" + "startLine": 11, + "startColumn": 7, + "endLine": 11, + "endColumn": 12, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W9003", - "severity": "WARN", - "message": "-1 is not of type 'string' - automatically coerced (number to string)", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Subnet' of type 'AWS::EC2::Subnet' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "WebSecurityGroup", + "logicalId": "Subnet", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.SecurityGroupEgress.0.IpProtocol", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 195, - "startColumn": 11, - "endLine": 195, - "endColumn": 21, - "ruleDescription": "Property type coercion warning", - "phase": "SCHEMA" + "startLine": 4, + "startColumn": 5, + "endLine": 4, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "integration/aws-dynamodb-table.yaml": { + "filePath": "integration/aws-dynamodb-table.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 4, + "counts": { + "fatal": 1, + "errors": 0, + "warnings": 1, + "informational": 10, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "W9003", - "severity": "WARN", - "message": "100 (from Fn::If on condition 'IsProduction') is not of type 'string' - automatically coerced (number to string)", - "source": "CFN_LINT", + "ruleId": "F3021", + "severity": "FATAL", + "message": "'SSEType' is a dependency of 'KMSMasterKeyId'", + "source": "SCHEMA", "entity": { - "logicalId": "Database", + "logicalId": "Table1", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.AllocatedStorage", - "category": "Best Practice", - "startLine": 272, + "propertyPath": "Properties.SSESpecification", + "suggestedFix": "Add 'SSEType' when 'KMSMasterKeyId' is specified", + "category": "Schema", + "startLine": 22, "startColumn": 7, - "endLine": 272, + "endLine": 22, "endColumn": 23, - "conditionScenario": { - "IsProduction": true - }, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Property type coercion warning", - "phase": "SCHEMA", - "context": { - "resolutionSource": "Fn::If on condition 'IsProduction'" - } + "ruleDescription": "Dependent property required", + "phase": "SCHEMA" }, { - "ruleId": "W9008", - "severity": "WARN", - "message": "RDS instance should have StorageEncrypted set to true", - "source": "ENGINE", + "ruleId": "W3030", + "severity": "WARN", + "message": "'AES256' is not one of ['KMS']", + "source": "CFN_LINT", "entity": { - "logicalId": "Database", + "logicalId": "Table2", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.StorageEncrypted", - "suggestedFix": "Set StorageEncrypted to true", - "category": "Security", - "startLine": 274, - "startColumn": 7, - "endLine": 274, - "endColumn": 23, - "ruleDescription": "RDS instance should have StorageEncrypted", - "phase": "LINT" + "propertyPath": "Properties.SSESpecification.SSEType", + "category": "Schema", + "startLine": 44, + "startColumn": 9, + "endLine": 44, + "endColumn": 16, + "ruleDescription": "Value not in allowed enum", + "phase": "SCHEMA", + "context": { + "actualValue": "AES256", + "extra": { + "allowed_values": [ + "KMS" + ] + } + } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Property 'TableName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "VPC", + "logicalId": "Table1", "entityType": "Resource", - "resourceType": "AWS::EC2::VPC" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Properties.TableName", "category": "Best Practice", - "startLine": 142, + "startLine": 12, "startColumn": 7, - "endLine": 142, + "endLine": 12, "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", @@ -14657,41 +9025,40 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "PublicSubnet", + "logicalId": "Table1", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.KeySchema", "category": "Best Practice", - "startLine": 158, + "startLine": 16, "startColumn": 7, - "endLine": 158, - "endColumn": 12, + "endLine": 16, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'VPC'" + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "message": "Property 'TableName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "PublicSubnet", + "logicalId": "Table2", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.CidrBlock", + "propertyPath": "Properties.TableName", "category": "Best Practice", - "startLine": 159, + "startLine": 31, "startColumn": 7, - "endLine": 159, + "endLine": 31, "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", @@ -14702,42 +9069,41 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", + "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "PublicSubnet", + "logicalId": "Table2", "entityType": "Resource", - "resourceType": "AWS::EC2::Subnet" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.AvailabilityZone", + "propertyPath": "Properties.KeySchema", "category": "Best Practice", - "startLine": 160, + "startLine": 35, "startColumn": 7, - "endLine": 160, - "endColumn": 23, + "endLine": 35, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "dynamic (Select with unresolvable arguments)" + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", + "message": "Property 'TableName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "WebSecurityGroup", + "logicalId": "Table3", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.GroupDescription", + "propertyPath": "Properties.TableName", "category": "Best Practice", - "startLine": 176, + "startLine": 50, "startColumn": 7, - "endLine": 176, - "endColumn": 23, + "endLine": 50, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -14747,249 +9113,302 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "message": "Property 'KeySchema' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "WebSecurityGroup", + "logicalId": "Table3", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.KeySchema", "category": "Best Practice", - "startLine": 177, + "startLine": 59, "startColumn": 7, - "endLine": 177, - "endColumn": 12, + "endLine": 59, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'VPC'" + "lifecycle": "conditional-create-only" } }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", + "message": "Resource 'KMS' of type 'AWS::KMS::Key' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "BastionSecurityGroup", + "logicalId": "KMS", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::KMS::Key" }, - "propertyPath": "Properties.GroupDescription", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 204, - "startColumn": 7, - "endLine": 204, - "endColumn": 23, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 6, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "message": "Resource 'Table1' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "BastionSecurityGroup", + "logicalId": "Table1", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.VpcId", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 205, - "startColumn": 7, - "endLine": 205, - "endColumn": 12, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'VPC'" - } + "startLine": 11, + "startColumn": 5, + "endLine": 11, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'LaunchTemplateName' is create-only; updating it will cause resource replacement", + "message": "Resource 'Table2' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "LaunchTemplate", + "logicalId": "Table2", "entityType": "Resource", - "resourceType": "AWS::EC2::LaunchTemplate" + "resourceType": "AWS::DynamoDB::Table" }, - "propertyPath": "Properties.LaunchTemplateName", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 216, - "startColumn": 7, - "endLine": 216, - "endColumn": 25, - "ruleDescription": "Create-only property updated triggers resource replacement", + "startLine": 30, + "startColumn": 5, + "endLine": 30, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Table3' of type 'AWS::DynamoDB::Table' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "Table3", + "entityType": "Resource", + "resourceType": "AWS::DynamoDB::Table" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 49, + "startColumn": 5, + "endLine": 49, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "integration/aws-ec2-instance.yaml": { + "filePath": "integration/aws-ec2-instance.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 2, + "counts": { + "fatal": 4, + "errors": 0, + "warnings": 0, + "informational": 6, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "F3020", + "severity": "FATAL", + "message": "'AssociateCarrierIpAddress' should not be included with 'NetworkInterfaceId'", + "source": "SCHEMA", + "entity": { + "logicalId": "Instance", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Properties.NetworkInterfaces.0.AssociateCarrierIpAddress", + "category": "Schema", + "startLine": 14, + "startColumn": 11, + "endLine": 14, + "endColumn": 36, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Mutually exclusive properties", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter with AllowedValues" + "property": "AssociateCarrierIpAddress" } }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'AutoScalingGroupName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "F3020", + "severity": "FATAL", + "message": "'AssociatePublicIpAddress' should not be included with 'NetworkInterfaceId'", + "source": "SCHEMA", "entity": { - "logicalId": "AutoScalingGroup", + "logicalId": "Instance", "entityType": "Resource", - "resourceType": "AWS::AutoScaling::AutoScalingGroup" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.AutoScalingGroupName", - "category": "Best Practice", - "startLine": 237, - "startColumn": 7, - "endLine": 237, - "endColumn": 27, - "ruleDescription": "Create-only property updated triggers resource replacement", + "propertyPath": "Properties.NetworkInterfaces.0.AssociatePublicIpAddress", + "category": "Schema", + "startLine": 15, + "startColumn": 11, + "endLine": 15, + "endColumn": 35, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Mutually exclusive properties", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter with AllowedValues" + "property": "AssociatePublicIpAddress" } }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'LaunchTemplate' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "F3020", + "severity": "FATAL", + "message": "'NetworkInterfaceId' should not be included with 'AssociateCarrierIpAddress'", + "source": "SCHEMA", "entity": { - "logicalId": "AutoScalingGroup", + "logicalId": "Instance", "entityType": "Resource", - "resourceType": "AWS::AutoScaling::AutoScalingGroup" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.LaunchTemplate", - "category": "Best Practice", - "startLine": 238, - "startColumn": 7, - "endLine": 238, - "endColumn": 21, - "ruleDescription": "Create-only property updated triggers resource replacement", + "propertyPath": "Properties.NetworkInterfaces.0.NetworkInterfaceId", + "category": "Schema", + "startLine": 17, + "startColumn": 11, + "endLine": 17, + "endColumn": 29, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Mutually exclusive properties", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "property": "NetworkInterfaceId" } }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'VPCZoneIdentifier' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "F3020", + "severity": "FATAL", + "message": "'NetworkInterfaceId' should not be included with 'AssociatePublicIpAddress'", + "source": "SCHEMA", "entity": { - "logicalId": "AutoScalingGroup", + "logicalId": "Instance", "entityType": "Resource", - "resourceType": "AWS::AutoScaling::AutoScalingGroup" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.VPCZoneIdentifier", - "category": "Best Practice", - "startLine": 242, - "startColumn": 7, - "endLine": 242, - "endColumn": 24, - "ruleDescription": "Create-only property updated triggers resource replacement", + "propertyPath": "Properties.NetworkInterfaces.0.NetworkInterfaceId", + "category": "Schema", + "startLine": 17, + "startColumn": 11, + "endLine": 17, + "endColumn": 29, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Mutually exclusive properties", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "property": "NetworkInterfaceId" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'DBInstanceIdentifier' is create-only; updating it will cause resource replacement", + "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Database", + "logicalId": "NetworkInterface", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::NetworkInterface" }, - "propertyPath": "Properties.DBInstanceIdentifier", + "propertyPath": "Properties.SubnetId", "category": "Best Practice", - "startLine": 268, + "startLine": 7, "startColumn": 7, - "endLine": 268, - "endColumn": 27, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "endLine": 7, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2/networkinterface", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter with AllowedValues" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Database", + "logicalId": "Instance", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 270, + "startLine": 11, "startColumn": 7, - "endLine": 270, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "endLine": 11, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'StorageEncrypted' is create-only; updating it will cause resource replacement", + "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Database", + "logicalId": "Instance", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.StorageEncrypted", + "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 274, + "startLine": 12, "startColumn": 7, - "endLine": 274, - "endColumn": 23, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "endLine": 12, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Fn::If on condition 'IsProduction'" + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'MasterUsername' is create-only; updating it will cause resource replacement", + "message": "Property 'NetworkInterfaces' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Database", + "logicalId": "Instance", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.MasterUsername", + "propertyPath": "Properties.NetworkInterfaces", "category": "Best Practice", - "startLine": 275, + "startLine": 13, "startColumn": 7, - "endLine": 275, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "endLine": 13, + "endColumn": 24, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -14997,294 +9416,304 @@ } }, { - "ruleId": "I9001", + "ruleId": "I9003", "severity": "INFO", - "message": "Property 'BackupRetentionPeriod' is conditionally create-only; updating it may cause resource replacement", + "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", "source": "ENGINE", - "entity": { - "logicalId": "Database", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" - }, - "propertyPath": "Properties.BackupRetentionPeriod", "category": "Best Practice", - "startLine": 279, - "startColumn": 7, - "endLine": 279, - "endColumn": 28, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only", - "resolutionSource": "Fn::If on condition 'IsProduction'" - } + "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'MultiAZ' is conditionally create-only; updating it may cause resource replacement", + "message": "Resource 'NetworkInterface' of type 'AWS::EC2::NetworkInterface' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Database", + "logicalId": "NetworkInterface", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::NetworkInterface" }, - "propertyPath": "Properties.MultiAZ", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 280, - "startColumn": 7, - "endLine": 280, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", - "ruleDescription": "Create-only property updated triggers resource replacement", + "startLine": 4, + "startColumn": 5, + "endLine": 4, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "integration/aws-ec2-launchtemplate.yaml": { + "filePath": "integration/aws-ec2-launchtemplate.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 5, + "errors": 0, + "warnings": 0, + "informational": 1, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "F1020", + "severity": "FATAL", + "message": "'NetworkInterface' is not one of ['AWS::AccountId', 'AWS::NoValue', 'AWS::NotificationARNs', 'AWS::Partition', 'AWS::Region', 'AWS::StackId', 'AWS::StackName', 'AWS::URLSuffix', 'LaunchTemplate']", + "source": "SCHEMA", + "entity": { + "logicalId": "LaunchTemplate", + "entityType": "Resource", + "resourceType": "AWS::EC2::LaunchTemplate" + }, + "propertyPath": "Properties.LaunchTemplateData.NetworkInterfaces.0.NetworkInterfaceId", + "suggestedFix": "Check that the Ref target exists as a resource, parameter, or pseudo-parameter", + "category": "Intrinsic Function", + "startLine": 13, + "startColumn": 13, + "endLine": 13, + "endColumn": 31, + "ruleDescription": "Ref/GetAtt target must exist", + "phase": "SCHEMA" + }, + { + "ruleId": "F3020", + "severity": "FATAL", + "message": "'AssociateCarrierIpAddress' should not be included with 'NetworkInterfaceId'", + "source": "SCHEMA", + "entity": { + "logicalId": "LaunchTemplate", + "entityType": "Resource", + "resourceType": "AWS::EC2::LaunchTemplate" + }, + "propertyPath": "Properties.LaunchTemplateData.NetworkInterfaces.0.AssociateCarrierIpAddress", + "category": "Schema", + "startLine": 10, + "startColumn": 13, + "endLine": 10, + "endColumn": 38, + "ruleDescription": "Mutually exclusive properties", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only", - "resolutionSource": "dynamic (condition reference: IsProduction)" + "property": "AssociateCarrierIpAddress" } }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "F3020", + "severity": "FATAL", + "message": "'AssociatePublicIpAddress' should not be included with 'NetworkInterfaceId'", + "source": "SCHEMA", "entity": { - "logicalId": "DatabaseSecurityGroup", + "logicalId": "LaunchTemplate", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::EC2::LaunchTemplate" }, - "propertyPath": "Properties.GroupDescription", - "category": "Best Practice", - "startLine": 293, - "startColumn": 7, - "endLine": 293, - "endColumn": 23, - "ruleDescription": "Create-only property updated triggers resource replacement", + "propertyPath": "Properties.LaunchTemplateData.NetworkInterfaces.0.AssociatePublicIpAddress", + "category": "Schema", + "startLine": 11, + "startColumn": 13, + "endLine": 11, + "endColumn": 37, + "ruleDescription": "Mutually exclusive properties", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "property": "AssociatePublicIpAddress" } }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "F3020", + "severity": "FATAL", + "message": "'NetworkInterfaceId' should not be included with 'AssociateCarrierIpAddress'", + "source": "SCHEMA", "entity": { - "logicalId": "DatabaseSecurityGroup", + "logicalId": "LaunchTemplate", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::EC2::LaunchTemplate" }, - "propertyPath": "Properties.VpcId", - "category": "Best Practice", - "startLine": 294, - "startColumn": 7, - "endLine": 294, - "endColumn": 12, - "ruleDescription": "Create-only property updated triggers resource replacement", + "propertyPath": "Properties.LaunchTemplateData.NetworkInterfaces.0.NetworkInterfaceId", + "category": "Schema", + "startLine": 13, + "startColumn": 13, + "endLine": 13, + "endColumn": 31, + "ruleDescription": "Mutually exclusive properties", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'VPC'" + "property": "NetworkInterfaceId" } }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "F3020", + "severity": "FATAL", + "message": "'NetworkInterfaceId' should not be included with 'AssociatePublicIpAddress'", + "source": "SCHEMA", "entity": { - "logicalId": "LambdaFunction", + "logicalId": "LaunchTemplate", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::EC2::LaunchTemplate" }, - "propertyPath": "Properties.FunctionName", - "category": "Best Practice", - "startLine": 305, - "startColumn": 7, - "endLine": 305, - "endColumn": 19, - "ruleDescription": "Create-only property updated triggers resource replacement", + "propertyPath": "Properties.LaunchTemplateData.NetworkInterfaces.0.NetworkInterfaceId", + "category": "Schema", + "startLine": 13, + "startColumn": 13, + "endLine": 13, + "endColumn": 31, + "ruleDescription": "Mutually exclusive properties", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter with AllowedValues" + "property": "NetworkInterfaceId" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'RoleName' is create-only; updating it will cause resource replacement", + "message": "Property 'LaunchTemplateName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "LambdaRole", + "logicalId": "LaunchTemplate", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::EC2::LaunchTemplate" }, - "propertyPath": "Properties.RoleName", + "propertyPath": "Properties.LaunchTemplateName", "category": "Best Practice", - "startLine": 343, + "startLine": 14, "startColumn": 7, - "endLine": 343, - "endColumn": 15, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "endLine": 14, + "endColumn": 25, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter with AllowedValues" + "lifecycle": "create-only" } + } + ] + }, + "integration/aws-ec2-networkinterface.yaml": { + "filePath": "integration/aws-ec2-networkinterface.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 2, + "errors": 0, + "warnings": 0, + "informational": 2, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'AlarmName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "F3020", + "severity": "FATAL", + "message": "'Ipv6Addresses' should not be included with 'Ipv6AddressCount'", + "source": "SCHEMA", "entity": { - "logicalId": "DatabaseAlarm", + "logicalId": "NetworkInterface", "entityType": "Resource", - "resourceType": "AWS::CloudWatch::Alarm" + "resourceType": "AWS::EC2::NetworkInterface" }, - "propertyPath": "Properties.AlarmName", - "category": "Best Practice", - "startLine": 369, + "propertyPath": "Properties.Ipv6Addresses", + "category": "Schema", + "startLine": 15, "startColumn": 7, - "endLine": 369, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-cloudwatch.git", - "ruleDescription": "Create-only property updated triggers resource replacement", + "endLine": 15, + "endColumn": 20, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2/networkinterface", + "ruleDescription": "Mutually exclusive properties", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter with AllowedValues" + "property": "Ipv6Addresses" } }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'TopicName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "F3020", + "severity": "FATAL", + "message": "'Ipv6AddressCount' should not be included with 'Ipv6Addresses'", + "source": "SCHEMA", "entity": { - "logicalId": "SNSTopic", + "logicalId": "NetworkInterface", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::EC2::NetworkInterface" }, - "propertyPath": "Properties.TopicName", - "category": "Best Practice", - "startLine": 390, + "propertyPath": "Properties.Ipv6AddressCount", + "category": "Schema", + "startLine": 17, "startColumn": 7, - "endLine": 390, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sns", - "ruleDescription": "Create-only property updated triggers resource replacement", + "endLine": 17, + "endColumn": 23, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2/networkinterface", + "ruleDescription": "Mutually exclusive properties", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter with AllowedValues" + "property": "Ipv6AddressCount" } }, { - "ruleId": "I9003", - "severity": "INFO", - "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", - "source": "ENGINE", - "category": "Best Practice", - "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'BastionSecurityGroup' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "BastionSecurityGroup", - "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 203, - "startColumn": 5, - "endLine": 203, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'DatabaseSecurityGroup' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "DatabaseSecurityGroup", - "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 292, - "startColumn": 5, - "endLine": 292, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'LambdaRole' of type 'AWS::IAM::Role' supports Tags but none are configured", + "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "LambdaRole", + "logicalId": "NetworkInterface", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::EC2::NetworkInterface" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 342, - "startColumn": 5, - "endLine": 342, + "propertyPath": "Properties.SubnetId", + "category": "Best Practice", + "startLine": 14, + "startColumn": 7, + "endLine": 14, "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2/networkinterface", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "parameter 'SubnetId' (type AWS::EC2::Subnet::Id)" + } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'DatabaseAlarm' of type 'AWS::CloudWatch::Alarm' supports Tags but none are configured", + "message": "Resource 'NetworkInterface' of type 'AWS::EC2::NetworkInterface' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "DatabaseAlarm", + "logicalId": "NetworkInterface", "entityType": "Resource", - "resourceType": "AWS::CloudWatch::Alarm" + "resourceType": "AWS::EC2::NetworkInterface" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 368, + "startLine": 9, "startColumn": 5, - "endLine": 368, + "endLine": 9, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "lsp/condition-usage.json": { - "filePath": "lsp/condition-usage.json", + "integration/aws-ec2-subnet.yaml": { + "filePath": "integration/aws-ec2-subnet.yaml", "status": "OK", "metadata": { - "resourcesScanned": 4, + "resourcesScanned": 5, "counts": { - "fatal": 0, - "errors": 1, - "warnings": 6, - "informational": 13, + "fatal": 5, + "errors": 0, + "warnings": 0, + "informational": 18, "debug": 0 }, "suppressed": 0, @@ -15293,233 +9722,349 @@ }, "diagnostics": [ { - "ruleId": "E3016", - "severity": "ERROR", - "message": "UpdatePolicy is not supported on resource type 'AWS::S3::Bucket'", - "source": "CFN_LINT", + "ruleId": "F3020", + "severity": "FATAL", + "message": "'CidrBlock' should not be included with 'Ipv4IpamPoolId'", + "source": "SCHEMA", "entity": { - "logicalId": "ProductionBucket", + "logicalId": "Subnet5", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "UpdatePolicy", - "suggestedFix": "Remove UpdatePolicy or change resource type to one of: AWS::AppStream::Fleet, AWS::AutoScaling::AutoScalingGroup, AWS::ElastiCache::ReplicationGroup, AWS::Elasticsearch::Domain, AWS::Lambda::Alias, AWS::OpenSearchService::Domain", - "category": "Resource", - "startLine": 75, + "propertyPath": "Properties.CidrBlock", + "category": "Schema", + "startLine": 30, "startColumn": 7, - "endLine": 75, - "endColumn": 20, - "ruleDescription": "Check UpdatePolicy values for Resources", - "phase": "LINT" + "endLine": 30, + "endColumn": 16, + "ruleDescription": "Mutually exclusive properties", + "phase": "SCHEMA", + "context": { + "property": "CidrBlock" + } }, { - "ruleId": "W1028", - "severity": "WARN", - "message": "['Fn::If', 2] is not reachable. When setting condition 'IsProduction' to False from current status True", - "source": "CFN_LINT", + "ruleId": "F3020", + "severity": "FATAL", + "message": "'Ipv4IpamPoolId' should not be included with 'CidrBlock'", + "source": "SCHEMA", "entity": { - "logicalId": "ProductionBucket", + "logicalId": "Subnet5", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.BucketName.Fn::If.2", - "category": "Best Practice", - "startLine": 62, - "startColumn": 13, - "endLine": 62, - "endColumn": 27, - "ruleDescription": "Check Fn::If has a path that cannot be reached", - "phase": "LINT" + "propertyPath": "Properties.Ipv4IpamPoolId", + "category": "Schema", + "startLine": 31, + "startColumn": 7, + "endLine": 31, + "endColumn": 21, + "ruleDescription": "Mutually exclusive properties", + "phase": "SCHEMA", + "context": { + "property": "Ipv4IpamPoolId" + } }, { - "ruleId": "W1028", - "severity": "WARN", - "message": "['Fn::If', 2] is not reachable. When setting condition 'IsProduction' to False from current status True", - "source": "CFN_LINT", + "ruleId": "F3021", + "severity": "FATAL", + "message": "'Ipv4IpamPoolId' is a dependency of 'Ipv4NetmaskLength'", + "source": "SCHEMA", "entity": { - "logicalId": "ProductionBucket", + "logicalId": "Subnet1", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.VersioningConfiguration.Status.Fn::If.2", + "propertyPath": "Properties", + "suggestedFix": "Add 'Ipv4IpamPoolId' when 'Ipv4NetmaskLength' is specified", + "category": "Schema", + "startLine": 7, + "startColumn": 5, + "endLine": 7, + "endColumn": 15, + "ruleDescription": "Dependent property required", + "phase": "SCHEMA" + }, + { + "ruleId": "F3021", + "severity": "FATAL", + "message": "'Ipv4NetmaskLength' is a dependency of 'Ipv4IpamPoolId'", + "source": "SCHEMA", + "entity": { + "logicalId": "Subnet3", + "entityType": "Resource", + "resourceType": "AWS::EC2::Subnet" + }, + "propertyPath": "Properties", + "suggestedFix": "Add 'Ipv4NetmaskLength' when 'Ipv4IpamPoolId' is specified", + "category": "Schema", + "startLine": 17, + "startColumn": 5, + "endLine": 17, + "endColumn": 15, + "ruleDescription": "Dependent property required", + "phase": "SCHEMA" + }, + { + "ruleId": "F3058", + "severity": "FATAL", + "message": "One of ['CidrBlock', 'Ipv4IpamPoolId', 'Ipv6IpamPoolId', 'Ipv6CidrBlock'] is a required property", + "source": "SCHEMA", + "entity": { + "logicalId": "Subnet2", + "entityType": "Resource", + "resourceType": "AWS::EC2::Subnet" + }, + "propertyPath": "Properties", + "category": "Schema", + "startLine": 13, + "startColumn": 5, + "endLine": 13, + "endColumn": 15, + "ruleDescription": "One of properties required (requiredOr)", + "phase": "SCHEMA" + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "Subnet1", + "entityType": "Resource", + "resourceType": "AWS::EC2::Subnet" + }, + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 70, - "startColumn": 15, - "endLine": 70, - "endColumn": 25, - "ruleDescription": "Check Fn::If has a path that cannot be reached", - "phase": "LINT" + "startLine": 8, + "startColumn": 7, + "endLine": 8, + "endColumn": 12, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "parameter 'Vpc' (type AWS::EC2::VPC::Id)" + } }, { - "ruleId": "W2501", - "severity": "WARN", - "message": "Property 'MasterUserPassword' should not be a hardcoded string - use a parameter with NoEcho or a dynamic reference", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Database", + "logicalId": "Subnet1", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.MasterUserPassword", - "category": "Security", - "startLine": 97, - "startColumn": 9, - "endLine": 97, - "endColumn": 28, - "ruleDescription": "Check if Password Properties are correctly configured", - "phase": "LINT" + "propertyPath": "Properties.CidrBlock", + "category": "Best Practice", + "startLine": 9, + "startColumn": 7, + "endLine": 9, + "endColumn": 16, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W8001", - "severity": "WARN", - "message": "Condition 'NotProduction' is not used by any resource or Fn::If", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Ipv4NetmaskLength' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "NotProduction", - "entityType": "Condition" + "logicalId": "Subnet1", + "entityType": "Resource", + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Conditions/NotProduction", + "propertyPath": "Properties.Ipv4NetmaskLength", "category": "Best Practice", - "startLine": 47, - "startColumn": 5, - "endLine": 47, - "endColumn": 19, - "ruleDescription": "Check if Conditions are Used", - "phase": "LINT" + "startLine": 10, + "startColumn": 7, + "endLine": 10, + "endColumn": 24, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "Subnet2", + "entityType": "Resource", + "resourceType": "AWS::EC2::Subnet" + }, + "propertyPath": "Properties.VpcId", + "category": "Best Practice", + "startLine": 14, + "startColumn": 7, + "endLine": 14, + "endColumn": 12, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "parameter 'Vpc' (type AWS::EC2::VPC::Id)" + } }, { - "ruleId": "W9008", - "severity": "WARN", - "message": "RDS instance should have StorageEncrypted set to true", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Database", + "logicalId": "Subnet3", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.StorageEncrypted", - "suggestedFix": "Set StorageEncrypted to true", - "category": "Security", - "startLine": 93, + "propertyPath": "Properties.VpcId", + "category": "Best Practice", + "startLine": 18, "startColumn": 7, - "endLine": 93, - "endColumn": 18, - "ruleDescription": "RDS instance should have StorageEncrypted", - "phase": "LINT" + "endLine": 18, + "endColumn": 12, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "parameter 'Vpc' (type AWS::EC2::VPC::Id)" + } }, { - "ruleId": "W9010", - "severity": "WARN", - "message": "Hardcoded AMI ID - use a parameter or mapping for portability", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Ipv4IpamPoolId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConditionalResource", + "logicalId": "Subnet3", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.ImageId", - "category": "Security", - "startLine": 104, - "startColumn": 9, - "endLine": 104, - "endColumn": 17, - "ruleDescription": "Hardcoded AMI ID", - "phase": "LINT" + "propertyPath": "Properties.Ipv4IpamPoolId", + "category": "Best Practice", + "startLine": 19, + "startColumn": 7, + "endLine": 19, + "endColumn": 21, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Database", + "logicalId": "Subnet4", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Subnet" }, + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 90, - "startColumn": 5, - "endLine": 90, - "endColumn": 14, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 23, + "startColumn": 7, + "endLine": 23, + "endColumn": 12, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "parameter 'Vpc' (type AWS::EC2::VPC::Id)" + } }, { - "ruleId": "I3011", + "ruleId": "I9001", "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Database", + "logicalId": "Subnet4", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Subnet" }, + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 90, - "startColumn": 5, - "endLine": 90, - "endColumn": 14, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "startLine": 24, + "startColumn": 7, + "endLine": 24, + "endColumn": 16, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3013", + "ruleId": "I9001", "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", + "message": "Property 'Ipv6CidrBlock' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Database", + "logicalId": "Subnet4", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties", + "propertyPath": "Properties.Ipv6CidrBlock", "category": "Best Practice", - "startLine": 93, + "startLine": 25, "startColumn": 7, - "endLine": 93, - "endColumn": 18, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", - "phase": "LINT" + "endLine": 25, + "endColumn": 20, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ProductionBucket", + "logicalId": "Subnet5", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.BucketName", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 58, - "startColumn": 9, - "endLine": 58, - "endColumn": 20, + "startLine": 29, + "startColumn": 7, + "endLine": 29, + "endColumn": 12, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "Fn::If on condition 'IsProduction'" + "resolutionSource": "parameter 'Vpc' (type AWS::EC2::VPC::Id)" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DevelopmentBucket", + "logicalId": "Subnet5", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.BucketName", + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 87, - "startColumn": 9, - "endLine": 87, - "endColumn": 20, + "startLine": 30, + "startColumn": 7, + "endLine": 30, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -15529,43 +10074,41 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'Ipv4IpamPoolId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Database", + "logicalId": "Subnet5", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.Ipv4IpamPoolId", "category": "Best Practice", - "startLine": 95, - "startColumn": 9, - "endLine": 95, - "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "startLine": 31, + "startColumn": 7, + "endLine": 31, + "endColumn": 21, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'MasterUsername' is create-only; updating it will cause resource replacement", + "message": "Property 'Ipv4NetmaskLength' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Database", + "logicalId": "Subnet5", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.MasterUsername", + "propertyPath": "Properties.Ipv4NetmaskLength", "category": "Best Practice", - "startLine": 96, - "startColumn": 9, - "endLine": 96, + "startLine": 32, + "startColumn": 7, + "endLine": 32, "endColumn": 24, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -15573,133 +10116,176 @@ } }, { - "ruleId": "I9001", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Subnet1' of type 'AWS::EC2::Subnet' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "Subnet1", + "entityType": "Resource", + "resourceType": "AWS::EC2::Subnet" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 7, + "startColumn": 5, + "endLine": 7, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Subnet2' of type 'AWS::EC2::Subnet' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "Subnet2", + "entityType": "Resource", + "resourceType": "AWS::EC2::Subnet" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 13, + "startColumn": 5, + "endLine": 13, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "message": "Resource 'Subnet3' of type 'AWS::EC2::Subnet' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ConditionalResource", + "logicalId": "Subnet3", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 104, - "startColumn": 9, - "endLine": 104, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 17, + "startColumn": 5, + "endLine": 17, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", + "message": "Resource 'Subnet4' of type 'AWS::EC2::Subnet' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ConditionalResource", + "logicalId": "Subnet4", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.InstanceType", - "category": "Best Practice", - "startLine": 105, - "startColumn": 9, - "endLine": 105, - "endColumn": 22, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only", - "resolutionSource": "Fn::If on condition 'IsProductionAndCreateDB'" - } - }, - { - "ruleId": "I9003", - "severity": "INFO", - "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", - "source": "ENGINE", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", + "startLine": 22, + "startColumn": 5, + "endLine": 22, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'ProductionBucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Resource 'Subnet5' of type 'AWS::EC2::Subnet' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ProductionBucket", + "logicalId": "Subnet5", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::EC2::Subnet" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 57, - "startColumn": 7, - "endLine": 57, - "endColumn": 18, + "startLine": 28, + "startColumn": 5, + "endLine": 28, + "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "integration/aws-lambda-function.yaml": { + "filePath": "integration/aws-lambda-function.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 2, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 2, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'DevelopmentBucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Resource 'Function' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "DevelopmentBucket", + "logicalId": "Function", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::Lambda::Function" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 86, - "startColumn": 7, - "endLine": 86, - "endColumn": 18, + "startLine": 4, + "startColumn": 5, + "endLine": 4, + "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Database' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", + "message": "Resource 'Role' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Database", + "logicalId": "Role", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::IAM::Role" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 93, - "startColumn": 7, - "endLine": 93, - "endColumn": 18, + "startLine": 10, + "startColumn": 5, + "endLine": 10, + "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "lsp/condition-usage.yaml": { - "filePath": "lsp/condition-usage.yaml", + "integration/cfn-gather.yaml": { + "filePath": "integration/cfn-gather.yaml", "status": "OK", "metadata": { - "resourcesScanned": 8, + "resourcesScanned": 17, "counts": { "fatal": 0, "errors": 7, - "warnings": 7, - "informational": 21, + "warnings": 1, + "informational": 55, "debug": 0 }, "suppressed": 0, @@ -15708,268 +10294,314 @@ }, "diagnostics": [ { - "ruleId": "E1028", + "ruleId": "E3052", "severity": "ERROR", - "message": "Fn::If first element must be the name of a condition, not an expression", - "source": "SCHEMA", + "message": "NetworkConfiguration required when TaskDefinition NetworkMode is 'awsvpc'", + "source": "CFN_LINT", "entity": { - "logicalId": "LogicalConditionResource", + "logicalId": "ServiceNoNetConfig", "entityType": "Resource", - "resourceType": "AWS::CloudWatch::Alarm" + "resourceType": "AWS::ECS::Service" }, - "propertyPath": "Properties.AlarmName.Fn::If.0", - "category": "Intrinsic Function", - "startLine": 172, - "startColumn": 18, - "endLine": 172, - "endColumn": 19, - "ruleDescription": "Fn::If condition must exist in Conditions section", - "phase": "PARSE" + "category": "Resource", + "startLine": 32, + "startColumn": 3, + "endLine": 32, + "endColumn": 21, + "ruleDescription": "Validate ECS service requires NetworkConfiguration", + "phase": "LINT" }, { - "ruleId": "E1028", + "ruleId": "E3054", "severity": "ERROR", - "message": "Fn::If first element must be the name of a condition, not an expression", - "source": "SCHEMA", + "message": "['EC2'] does not contain items matching 'FARGATE'", + "source": "CFN_LINT", "entity": { - "logicalId": "LogicalConditionResource", + "logicalId": "TaskDef", "entityType": "Resource", - "resourceType": "AWS::CloudWatch::Alarm" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Threshold.Fn::If.0", - "category": "Intrinsic Function", - "startLine": 184, - "startColumn": 17, - "endLine": 184, - "endColumn": 18, - "ruleDescription": "Fn::If condition must exist in Conditions section", - "phase": "PARSE" + "propertyPath": "Properties.RequiresCompatibilities", + "suggestedFix": "Add 'FARGATE' to RequiresCompatibilities", + "category": "Resource", + "startLine": 8, + "startColumn": 7, + "endLine": 8, + "endColumn": 30, + "ruleDescription": "Validate ECS service using Fargate uses TaskDefinition that allows Fargate", + "phase": "LINT" }, { - "ruleId": "E1028", + "ruleId": "E3502", "severity": "ERROR", - "message": "Fn::If first element must be the name of a condition, not an expression", - "source": "SCHEMA", + "message": "Source queue type 'FIFO' does not match destination queue type 'standard'", + "source": "CFN_LINT", "entity": { - "logicalId": "LogicalConditionResource", + "logicalId": "FifoQueue", "entityType": "Resource", - "resourceType": "AWS::CloudWatch::Alarm" + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Properties.TreatMissingData.Fn::If.0", - "category": "Intrinsic Function", - "startLine": 192, - "startColumn": 18, - "endLine": 192, - "endColumn": 19, - "ruleDescription": "Fn::If condition must exist in Conditions section", - "phase": "PARSE" + "propertyPath": "Properties.RedrivePolicy", + "category": "Resource", + "startLine": 42, + "startColumn": 7, + "endLine": 42, + "endColumn": 20, + "ruleDescription": "Validate SQS DLQ queues are the same type", + "phase": "LINT" }, { - "ruleId": "E1028", + "ruleId": "E3698", "severity": "ERROR", - "message": "Fn::If first element must be the name of a condition, not an expression", - "source": "SCHEMA", + "message": "{'Ref': 'RestApi2'} was expected", + "source": "CFN_LINT", "entity": { - "logicalId": "LogicalConditionalOutput", - "entityType": "Output" + "logicalId": "Deployment", + "entityType": "Resource", + "resourceType": "AWS::ApiGateway::Deployment" }, - "propertyPath": "Outputs/LogicalConditionalOutput/Value/Fn::If/0", - "category": "Intrinsic Function", - "startLine": 236, - "startColumn": 18, - "endLine": 236, - "endColumn": 19, - "ruleDescription": "Fn::If condition must exist in Conditions section", - "phase": "PARSE" + "propertyPath": "Properties.RestApiId", + "category": "Resource", + "startLine": 78, + "startColumn": 7, + "endLine": 78, + "endColumn": 16, + "ruleDescription": "API Gateway Stage and Deployment must use the same RestApi", + "phase": "LINT" + }, + { + "ruleId": "E3705", + "severity": "ERROR", + "message": "BatchSize 15 exceeds maximum of 10 for SQS FIFO queue event source", + "source": "CFN_LINT", + "entity": { + "logicalId": "FifoMapping", + "entityType": "Resource", + "resourceType": "AWS::Lambda::EventSourceMapping" + }, + "propertyPath": "Properties.BatchSize", + "category": "Resource", + "startLine": 107, + "startColumn": 7, + "endLine": 107, + "endColumn": 16, + "ruleDescription": "Validate SQS FIFO queue EventSourceMapping BatchSize is at most 10", + "phase": "LINT" }, { - "ruleId": "E1028", + "ruleId": "E3707", "severity": "ERROR", - "message": "Fn::If first element must be the name of a condition, not an expression", - "source": "SCHEMA", + "message": "DBInstance Engine 'aurora-postgresql' does not match DBCluster Engine 'aurora-mysql'", + "source": "CFN_LINT", "entity": { - "logicalId": "LogicalConditionalOutput", - "entityType": "Output" + "logicalId": "BadEngineInstance", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Outputs/LogicalConditionalOutput/Value/Fn::If/2/Fn::If/0", - "category": "Intrinsic Function", - "startLine": 241, - "startColumn": 21, - "endLine": 241, - "endColumn": 22, - "ruleDescription": "Fn::If condition must exist in Conditions section", - "phase": "PARSE" + "propertyPath": "Properties.Engine", + "category": "Resource", + "startLine": 120, + "startColumn": 7, + "endLine": 120, + "endColumn": 13, + "relatedResources": [ + { + "resource": { + "id": "AuroraCluster", + "resourceType": "AWS::RDS::DBCluster" + }, + "location": { + "startLine": 112, + "startColumn": 7, + "endLine": 112, + "endColumn": 13 + }, + "message": "cluster engine" + } + ], + "ruleDescription": "Validate RDS DBInstance Engine matches DBCluster Engine", + "phase": "LINT" }, { - "ruleId": "E1028", + "ruleId": "E3708", "severity": "ERROR", - "message": "Fn::If first element must be the name of a condition, not an expression", - "source": "SCHEMA", + "message": "'COGNITO_USER_POOLS' is not one of ['TOKEN', 'REQUEST']", + "source": "CFN_LINT", "entity": { - "logicalId": "EdgeCaseOutput", - "entityType": "Output" + "logicalId": "CognitoAuthorizer", + "entityType": "Resource", + "resourceType": "AWS::ApiGateway::Authorizer" }, - "propertyPath": "Outputs/EdgeCaseOutput/Value/Fn::If/0", - "category": "Intrinsic Function", - "startLine": 251, - "startColumn": 19, - "endLine": 251, - "endColumn": 20, - "ruleDescription": "Fn::If condition must exist in Conditions section", - "phase": "PARSE" + "propertyPath": "Properties.Type", + "category": "Resource", + "startLine": 58, + "startColumn": 7, + "endLine": 58, + "endColumn": 11, + "ruleDescription": "API Gateway Method AuthorizationType must match Authorizer Type", + "phase": "LINT" }, { - "ruleId": "E3016", - "severity": "ERROR", - "message": "UpdatePolicy is not supported on resource type 'AWS::S3::Bucket'", + "ruleId": "W2501", + "severity": "WARN", + "message": "Property 'MasterUserPassword' should not be a hardcoded string - use a parameter with NoEcho or a dynamic reference", "source": "CFN_LINT", "entity": { - "logicalId": "ProductionBucket", + "logicalId": "AuroraCluster", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::RDS::DBCluster" }, - "propertyPath": "UpdatePolicy", - "suggestedFix": "Remove UpdatePolicy or change resource type to one of: AWS::AppStream::Fleet, AWS::AutoScaling::AutoScalingGroup, AWS::ElastiCache::ReplicationGroup, AWS::Elasticsearch::Domain, AWS::Lambda::Alias, AWS::OpenSearchService::Domain", - "category": "Resource", - "startLine": 78, - "startColumn": 5, - "endLine": 78, - "endColumn": 17, - "ruleDescription": "Check UpdatePolicy values for Resources", + "propertyPath": "Properties.MasterUserPassword", + "category": "Security", + "startLine": 114, + "startColumn": 7, + "endLine": 114, + "endColumn": 25, + "ruleDescription": "Check if Password Properties are correctly configured", "phase": "LINT" }, { - "ruleId": "W1028", - "severity": "WARN", - "message": "['Fn::If', 2] is not reachable. When setting condition 'IsProduction' to False from current status True", + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "ProductionBucket", + "logicalId": "FifoQueue", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Properties.BucketName.Fn::If.2", "category": "Best Practice", - "startLine": 57, - "startColumn": 54, - "endLine": 57, - "endColumn": 55, - "ruleDescription": "Check Fn::If has a path that cannot be reached", + "startLine": 37, + "startColumn": 3, + "endLine": 37, + "endColumn": 12, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "W1028", - "severity": "WARN", - "message": "['Fn::If', 2] is not reachable. When setting condition 'IsProduction' to False from current status True", + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "ProductionBucket", + "logicalId": "FifoQueue", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Properties.VersioningConfiguration.Status.Fn::If.2", "category": "Best Practice", - "startLine": 62, - "startColumn": 43, - "endLine": 62, - "endColumn": 44, - "ruleDescription": "Check Fn::If has a path that cannot be reached", + "startLine": 37, + "startColumn": 3, + "endLine": 37, + "endColumn": 12, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "W1028", - "severity": "WARN", - "message": "['Fn::If', 2] is not reachable. When setting condition 'IsProduction' to False from current status True", + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "ProductionBucket", + "logicalId": "StandardDLQ", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Properties.PublicAccessBlockConfiguration.BlockPublicAcls.Fn::If.2", "category": "Best Practice", - "startLine": 69, - "startColumn": 13, - "endLine": 69, + "startLine": 45, + "startColumn": 3, + "endLine": 45, "endColumn": 14, - "ruleDescription": "Check Fn::If has a path that cannot be reached", + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "W1028", - "severity": "WARN", - "message": "['Fn::If', 2] is not reachable. When setting condition 'IsProduction' to False from current status True", + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "ProductionBucket", + "logicalId": "StandardDLQ", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Properties.PublicAccessBlockConfiguration.BlockPublicPolicy.Fn::If.2", "category": "Best Practice", - "startLine": 76, - "startColumn": 15, - "endLine": 76, - "endColumn": 16, - "ruleDescription": "Check Fn::If has a path that cannot be reached", + "startLine": 45, + "startColumn": 3, + "endLine": 45, + "endColumn": 14, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "W2501", - "severity": "WARN", - "message": "Property 'MasterUserPassword' should not be a hardcoded string - use a parameter with NoEcho or a dynamic reference", + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "Database", + "logicalId": "SqsFifoQueue", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Properties.MasterUserPassword", - "category": "Security", - "startLine": 98, - "startColumn": 7, - "endLine": 98, - "endColumn": 25, - "ruleDescription": "Check if Password Properties are correctly configured", + "category": "Best Practice", + "startLine": 86, + "startColumn": 3, + "endLine": 86, + "endColumn": 15, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "W9008", - "severity": "WARN", - "message": "RDS instance should have StorageEncrypted set to true", - "source": "ENGINE", + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "Database", + "logicalId": "SqsFifoQueue", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Properties.StorageEncrypted", - "suggestedFix": "Set StorageEncrypted to true", - "category": "Security", - "startLine": 94, - "startColumn": 5, - "endLine": 94, + "category": "Best Practice", + "startLine": 86, + "startColumn": 3, + "endLine": 86, "endColumn": 15, - "ruleDescription": "RDS instance should have StorageEncrypted", + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "W9010", - "severity": "WARN", - "message": "Hardcoded AMI ID - use a parameter or mapping for portability", - "source": "ENGINE", + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "ConditionalResource", + "logicalId": "AuroraCluster", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::RDS::DBCluster" + }, + "category": "Best Practice", + "startLine": 109, + "startColumn": 3, + "endLine": 109, + "endColumn": 16, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "AuroraCluster", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBCluster" }, - "propertyPath": "Properties.ImageId", - "category": "Security", - "startLine": 104, - "startColumn": 7, - "endLine": 104, - "endColumn": 14, - "ruleDescription": "Hardcoded AMI ID", + "category": "Best Practice", + "startLine": 109, + "startColumn": 3, + "endLine": 109, + "endColumn": 16, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { @@ -15978,15 +10610,15 @@ "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "Database", + "logicalId": "BadEngineInstance", "entityType": "Resource", "resourceType": "AWS::RDS::DBInstance" }, "category": "Best Practice", - "startLine": 91, + "startLine": 115, "startColumn": 3, - "endLine": 91, - "endColumn": 11, + "endLine": 115, + "endColumn": 20, "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, @@ -15996,76 +10628,149 @@ "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "Database", + "logicalId": "BadEngineInstance", "entityType": "Resource", "resourceType": "AWS::RDS::DBInstance" }, "category": "Best Practice", - "startLine": 91, + "startLine": 115, "startColumn": 3, - "endLine": 91, - "endColumn": 11, + "endLine": 115, + "endColumn": 20, "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, + { + "ruleId": "I3013", + "severity": "INFO", + "message": "'MessageRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "FifoQueue", + "entityType": "Resource", + "resourceType": "AWS::SQS::Queue" + }, + "propertyPath": "Properties", + "category": "Best Practice", + "startLine": 39, + "startColumn": 5, + "endLine": 39, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "phase": "LINT" + }, + { + "ruleId": "I3013", + "severity": "INFO", + "message": "'MessageRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "StandardDLQ", + "entityType": "Resource", + "resourceType": "AWS::SQS::Queue" + }, + "propertyPath": "Properties", + "category": "Best Practice", + "startLine": 47, + "startColumn": 5, + "endLine": 47, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "phase": "LINT" + }, + { + "ruleId": "I3013", + "severity": "INFO", + "message": "'MessageRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "SqsFifoQueue", + "entityType": "Resource", + "resourceType": "AWS::SQS::Queue" + }, + "propertyPath": "Properties", + "category": "Best Practice", + "startLine": 88, + "startColumn": 5, + "endLine": 88, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "phase": "LINT" + }, { "ruleId": "I3013", "severity": "INFO", "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", "source": "CFN_LINT", "entity": { - "logicalId": "Database", + "logicalId": "AuroraCluster", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::RDS::DBCluster" }, "propertyPath": "Properties", "category": "Best Practice", - "startLine": 94, + "startLine": 111, "startColumn": 5, - "endLine": 94, + "endLine": 111, "endColumn": 15, "ruleDescription": "Check resources with auto expiring content have explicit retention period", "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3042", "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "ARN in Resource CognitoAuthorizer contains hardcoded Partition in ARN or incorrectly placed Pseudo Parameters", + "source": "CFN_LINT", "entity": { - "logicalId": "ProductionBucket", + "logicalId": "CognitoAuthorizer", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::ApiGateway::Authorizer" }, - "propertyPath": "Properties.BucketName", + "propertyPath": "Properties.ProviderARNs.0.Fn::Sub", "category": "Best Practice", - "startLine": 57, + "startLine": 61, + "startColumn": 16, + "endLine": 61, + "endColumn": 23, + "ruleDescription": "ARNs should use correctly placed Pseudo Parameters", + "phase": "LINT" + }, + { + "ruleId": "I3042", + "severity": "INFO", + "message": "ARN in Resource FifoProcessor contains hardcoded Partition in ARN or incorrectly placed Pseudo Parameters", + "source": "CFN_LINT", + "entity": { + "logicalId": "FifoProcessor", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.Role.Fn::Sub", + "category": "Best Practice", + "startLine": 97, "startColumn": 7, - "endLine": 57, - "endColumn": 17, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "Fn::If on condition 'IsProduction'" - } + "endLine": 97, + "endColumn": 14, + "ruleDescription": "ARNs should use correctly placed Pseudo Parameters", + "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", + "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DevelopmentBucket", + "logicalId": "TaskDef", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.BucketName", + "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 89, + "startLine": 7, "startColumn": 7, - "endLine": 89, - "endColumn": 17, + "endLine": 7, + "endColumn": 18, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -16075,43 +10780,43 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Database", + "logicalId": "TaskDef", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 96, + "startLine": 8, "startColumn": 7, - "endLine": 96, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "endLine": 8, + "endColumn": 30, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'MasterUsername' is create-only; updating it will cause resource replacement", + "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Database", + "logicalId": "TaskDef", "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.MasterUsername", + "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 97, + "startLine": 10, "startColumn": 7, - "endLine": 97, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "endLine": 10, + "endColumn": 27, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -16121,67 +10826,65 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "message": "Property 'LaunchType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConditionalResource", + "logicalId": "FargateService", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::ECS::Service" }, - "propertyPath": "Properties.ImageId", + "propertyPath": "Properties.LaunchType", "category": "Best Practice", - "startLine": 104, + "startLine": 17, "startColumn": 7, - "endLine": 104, - "endColumn": 14, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 17, + "endColumn": 17, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", + "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConditionalResource", + "logicalId": "AwsvpcTaskDef", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.InstanceType", + "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 107, + "startLine": 27, "startColumn": 7, - "endLine": 107, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 27, + "endColumn": 18, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "conditional-create-only", - "resolutionSource": "Fn::If on condition 'IsProductionAndCreateDB'" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'SecurityGroups' is create-only; updating it will cause resource replacement", + "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConditionalResource", + "logicalId": "AwsvpcTaskDef", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.SecurityGroups", + "propertyPath": "Properties.ContainerDefinitions", "category": "Best Practice", - "startLine": 109, + "startLine": 28, "startColumn": 7, - "endLine": 109, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "endLine": 28, + "endColumn": 27, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -16191,19 +10894,20 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", + "message": "Property 'FifoQueue' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ProductionSecurityGroup", + "logicalId": "FifoQueue", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Properties.GroupDescription", + "propertyPath": "Properties.FifoQueue", "category": "Best Practice", - "startLine": 137, + "startLine": 40, "startColumn": 7, - "endLine": 137, - "endColumn": 23, + "endLine": 40, + "endColumn": 16, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sqs.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -16213,19 +10917,20 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", + "message": "Property 'QueueName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DevSecurityGroup", + "logicalId": "FifoQueue", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Properties.GroupDescription", + "propertyPath": "Properties.QueueName", "category": "Best Practice", - "startLine": 143, + "startLine": 41, "startColumn": 7, - "endLine": 143, - "endColumn": 23, + "endLine": 41, + "endColumn": 16, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sqs.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -16235,332 +10940,186 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Bucket' is create-only; updating it will cause resource replacement", + "message": "Property 'FifoQueue' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "NestedConditionResource", + "logicalId": "StandardDLQ", "entityType": "Resource", - "resourceType": "AWS::S3::BucketPolicy" + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Properties.Bucket", + "propertyPath": "Properties.FifoQueue", "category": "Best Practice", - "startLine": 149, + "startLine": 48, "startColumn": 7, - "endLine": 149, - "endColumn": 13, + "endLine": 48, + "endColumn": 16, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sqs.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Fn::If on condition 'IsProduction'" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'AlarmName' is create-only; updating it will cause resource replacement", + "message": "Property 'RestApiId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "LogicalConditionResource", + "logicalId": "CognitoAuthorizer", "entityType": "Resource", - "resourceType": "AWS::CloudWatch::Alarm" + "resourceType": "AWS::ApiGateway::Authorizer" }, - "propertyPath": "Properties.AlarmName", + "propertyPath": "Properties.RestApiId", "category": "Best Practice", - "startLine": 171, + "startLine": 57, "startColumn": 7, - "endLine": 171, + "endLine": 57, "endColumn": 16, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-cloudwatch.git", + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "Fn::If on condition '__inline_cond_131'" + "resolutionSource": "Ref to 'RestApi'" } }, { - "ruleId": "I9003", - "severity": "INFO", - "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", - "source": "ENGINE", - "category": "Best Practice", - "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'ProductionBucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "ProductionBucket", - "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 55, - "startColumn": 5, - "endLine": 55, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'DevelopmentBucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "DevelopmentBucket", - "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 88, - "startColumn": 5, - "endLine": 88, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Database' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "Database", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBInstance" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 94, - "startColumn": 5, - "endLine": 94, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'ProductionSecurityGroup' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "ProductionSecurityGroup", - "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 136, - "startColumn": 5, - "endLine": 136, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'DevSecurityGroup' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", + "message": "Property 'RestApiId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "DevSecurityGroup", + "logicalId": "MethodBadAuth", "entityType": "Resource", - "resourceType": "AWS::EC2::SecurityGroup" + "resourceType": "AWS::ApiGateway::Method" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.RestApiId", "category": "Best Practice", - "startLine": 142, - "startColumn": 5, - "endLine": 142, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 65, + "startColumn": 7, + "endLine": 65, + "endColumn": 16, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'RestApi'" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'LogicalConditionResource' of type 'AWS::CloudWatch::Alarm' supports Tags but none are configured", + "message": "Property 'ResourceId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "LogicalConditionResource", + "logicalId": "MethodBadAuth", "entityType": "Resource", - "resourceType": "AWS::CloudWatch::Alarm" + "resourceType": "AWS::ApiGateway::Method" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.ResourceId", "category": "Best Practice", - "startLine": 170, - "startColumn": 5, - "endLine": 170, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "lsp/constants.json": { - "filePath": "lsp/constants.json", - "status": "OK", - "metadata": { - "resourcesScanned": 2, - "counts": { - "fatal": 5, - "errors": 0, - "warnings": 0, - "informational": 3, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "F0005", - "severity": "FATAL", - "message": "'Constants' is not a valid top-level template section", - "source": "SCHEMA", - "propertyPath": "Constants", - "category": "Structure", - "startLine": 4, - "startColumn": 3, - "endLine": 4, - "endColumn": 13, - "ruleDescription": "Top-level keys must be valid section names", - "phase": "SCHEMA" - }, - { - "ruleId": "F1018", - "severity": "FATAL", - "message": "Fn::Sub variable '${sub}' does not reference a valid resource, parameter, or pseudo-parameter", - "source": "SCHEMA", - "entity": { - "logicalId": "Bucket", - "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" - }, - "propertyPath": "Metadata.Test", - "category": "Intrinsic Function", - "startLine": 19, - "startColumn": 9, - "endLine": 19, - "endColumn": 14, - "ruleDescription": "Sub variables must resolve", - "phase": "SCHEMA" - }, - { - "ruleId": "F1018", - "severity": "FATAL", - "message": "Fn::Sub variable '${foo}' does not reference a valid resource, parameter, or pseudo-parameter", - "source": "SCHEMA", - "entity": { - "logicalId": "Bucket", - "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" - }, - "propertyPath": "Properties.BucketName", - "category": "Intrinsic Function", - "startLine": 27, - "startColumn": 9, - "endLine": 27, - "endColumn": 20, - "ruleDescription": "Sub variables must resolve", + "startLine": 66, + "startColumn": 7, + "endLine": 66, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway.git", + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "resolutionSource": "dynamic (Sub:${foo})" + "lifecycle": "create-only", + "resolutionSource": "GetAtt RestApi.RootResourceId" } }, { - "ruleId": "F1020", - "severity": "FATAL", - "message": "'obj' is not one of ['AWS::AccountId', 'AWS::NoValue', 'AWS::NotificationARNs', 'AWS::Partition', 'AWS::Region', 'AWS::StackId', 'AWS::StackName', 'AWS::URLSuffix', 'Bucket', 'PersonalS3']", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'HttpMethod' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Bucket", + "logicalId": "MethodBadAuth", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::ApiGateway::Method" }, - "propertyPath": "Metadata.TestObj", - "suggestedFix": "Check that the Ref target exists as a resource, parameter, or pseudo-parameter", - "category": "Intrinsic Function", - "startLine": 22, - "startColumn": 9, - "endLine": 22, + "propertyPath": "Properties.HttpMethod", + "category": "Best Practice", + "startLine": 67, + "startColumn": 7, + "endLine": 67, "endColumn": 17, - "ruleDescription": "Ref/GetAtt target must exist", - "phase": "SCHEMA" + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "F1020", - "severity": "FATAL", - "message": "'foo' is not one of ['AWS::AccountId', 'AWS::NoValue', 'AWS::NotificationARNs', 'AWS::Partition', 'AWS::Region', 'AWS::StackId', 'AWS::StackName', 'AWS::URLSuffix', 'Bucket', 'PersonalS3']", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'RestApiId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Bucket", + "logicalId": "Deployment", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::ApiGateway::Deployment" }, - "propertyPath": "Properties.Tags.0.Value", - "suggestedFix": "Check that the Ref target exists as a resource, parameter, or pseudo-parameter", - "category": "Intrinsic Function", - "startLine": 33, - "startColumn": 13, - "endLine": 33, - "endColumn": 19, - "ruleDescription": "Ref/GetAtt target must exist", - "phase": "SCHEMA" + "propertyPath": "Properties.RestApiId", + "category": "Best Practice", + "startLine": 78, + "startColumn": 7, + "endLine": 78, + "endColumn": 16, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'RestApi'" + } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", + "message": "Property 'RestApiId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Bucket", + "logicalId": "StageBadApi", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::ApiGateway::Stage" }, - "propertyPath": "Properties.BucketName", + "propertyPath": "Properties.RestApiId", "category": "Best Practice", - "startLine": 27, - "startColumn": 9, - "endLine": 27, - "endColumn": 20, + "startLine": 82, + "startColumn": 7, + "endLine": 82, + "endColumn": 16, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "dynamic (Sub:${foo})" + "resolutionSource": "Ref to 'RestApi2'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", + "message": "Property 'StageName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "PersonalS3", + "logicalId": "StageBadApi", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::ApiGateway::Stage" }, - "propertyPath": "Properties.BucketName", + "propertyPath": "Properties.StageName", "category": "Best Practice", - "startLine": 43, - "startColumn": 9, - "endLine": 43, - "endColumn": 20, + "startLine": 84, + "startColumn": 7, + "endLine": 84, + "endColumn": 16, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-apigateway", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -16568,517 +11127,490 @@ } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'PersonalS3' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Property 'FifoQueue' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "PersonalS3", + "logicalId": "SqsFifoQueue", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.FifoQueue", "category": "Best Practice", - "startLine": 42, + "startLine": 89, "startColumn": 7, - "endLine": 42, - "endColumn": 18, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "lsp/constants.yaml": { - "filePath": "lsp/constants.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 2, - "counts": { - "fatal": 5, - "errors": 0, - "warnings": 0, - "informational": 3, - "debug": 0 + "endLine": 89, + "endColumn": 16, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sqs.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "F0005", - "severity": "FATAL", - "message": "'Constants' is not a valid top-level template section", - "source": "SCHEMA", - "propertyPath": "Constants", - "category": "Structure", - "startLine": 4, - "startColumn": 1, - "endLine": 4, - "endColumn": 10, - "ruleDescription": "Top-level keys must be valid section names", - "phase": "SCHEMA" + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'QueueName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "SqsFifoQueue", + "entityType": "Resource", + "resourceType": "AWS::SQS::Queue" + }, + "propertyPath": "Properties.QueueName", + "category": "Best Practice", + "startLine": 90, + "startColumn": 7, + "endLine": 90, + "endColumn": 16, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sqs.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "F1018", - "severity": "FATAL", - "message": "Fn::Sub variable '${sub}' does not reference a valid resource, parameter, or pseudo-parameter", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Bucket", + "logicalId": "FifoProcessor", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Metadata.Test", - "category": "Intrinsic Function", - "startLine": 15, + "propertyPath": "Properties.FunctionName", + "category": "Best Practice", + "startLine": 94, "startColumn": 7, - "endLine": 15, - "endColumn": 11, - "ruleDescription": "Sub variables must resolve", - "phase": "SCHEMA" + "endLine": 94, + "endColumn": 19, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "F1018", - "severity": "FATAL", - "message": "Fn::Sub variable '${foo}' does not reference a valid resource, parameter, or pseudo-parameter", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'EventSourceArn' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Bucket", + "logicalId": "FifoMapping", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::Lambda::EventSourceMapping" }, - "propertyPath": "Properties.BucketName", - "category": "Intrinsic Function", - "startLine": 18, + "propertyPath": "Properties.EventSourceArn", + "category": "Best Practice", + "startLine": 105, "startColumn": 7, - "endLine": 18, - "endColumn": 17, - "ruleDescription": "Sub variables must resolve", + "endLine": 105, + "endColumn": 21, + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "resolutionSource": "dynamic (Sub:${foo})" + "lifecycle": "create-only", + "resolutionSource": "GetAtt SqsFifoQueue.Arn" } }, { - "ruleId": "F1020", - "severity": "FATAL", - "message": "'obj' is not one of ['AWS::AccountId', 'AWS::NoValue', 'AWS::NotificationARNs', 'AWS::Partition', 'AWS::Region', 'AWS::StackId', 'AWS::StackName', 'AWS::URLSuffix', 'Bucket', 'PersonalS3']", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Bucket", + "logicalId": "AuroraCluster", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::RDS::DBCluster" }, - "propertyPath": "Metadata.TestObj", - "suggestedFix": "Check that the Ref target exists as a resource, parameter, or pseudo-parameter", - "category": "Intrinsic Function", - "startLine": 16, + "propertyPath": "Properties.Engine", + "category": "Best Practice", + "startLine": 112, "startColumn": 7, - "endLine": 16, - "endColumn": 14, - "ruleDescription": "Ref/GetAtt target must exist", - "phase": "SCHEMA" + "endLine": 112, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "F1020", - "severity": "FATAL", - "message": "'foo' is not one of ['AWS::AccountId', 'AWS::NoValue', 'AWS::NotificationARNs', 'AWS::Partition', 'AWS::Region', 'AWS::StackId', 'AWS::StackName', 'AWS::URLSuffix', 'Bucket', 'PersonalS3']", - "source": "SCHEMA", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'MasterUsername' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "Bucket", + "logicalId": "AuroraCluster", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::RDS::DBCluster" }, - "propertyPath": "Properties.Tags.0.Value", - "suggestedFix": "Check that the Ref target exists as a resource, parameter, or pseudo-parameter", - "category": "Intrinsic Function", - "startLine": 21, - "startColumn": 11, - "endLine": 21, - "endColumn": 16, - "ruleDescription": "Ref/GetAtt target must exist", - "phase": "SCHEMA" + "propertyPath": "Properties.MasterUsername", + "category": "Best Practice", + "startLine": 113, + "startColumn": 7, + "endLine": 113, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", + "message": "Property 'DBClusterIdentifier' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Bucket", + "logicalId": "BadEngineInstance", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.BucketName", + "propertyPath": "Properties.DBClusterIdentifier", "category": "Best Practice", - "startLine": 18, + "startLine": 118, "startColumn": 7, - "endLine": 18, - "endColumn": 17, + "endLine": 118, + "endColumn": 26, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "dynamic (Sub:${foo})" + "resolutionSource": "Ref to 'AuroraCluster'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "PersonalS3", + "logicalId": "BadEngineInstance", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.BucketName", + "propertyPath": "Properties.Engine", "category": "Best Practice", - "startLine": 26, + "startLine": 120, "startColumn": 7, - "endLine": 26, - "endColumn": 17, + "endLine": 120, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } }, + { + "ruleId": "I9003", + "severity": "INFO", + "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", + "source": "ENGINE", + "category": "Best Practice", + "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", + "phase": "LINT" + }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'PersonalS3' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Resource 'TaskDef' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "PersonalS3", + "logicalId": "TaskDef", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::ECS::TaskDefinition" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 25, + "startLine": 6, "startColumn": 5, - "endLine": 25, + "endLine": 6, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" - } - ] - }, - "lsp/parameter_usage.json": { - "filePath": "lsp/parameter_usage.json", - "status": "OK", - "metadata": { - "resourcesScanned": 5, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 3, - "informational": 10, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "E3001", - "severity": "ERROR", - "message": "Resource 'Bucket1' has invalid property 'Conditions'. Valid resource attributes: Type, Properties, DependsOn, Condition, Metadata, DeletionPolicy, UpdateReplacePolicy, UpdatePolicy, CreationPolicy, Fn::Transform, Version", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'FargateService' of type 'AWS::ECS::Service' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "Bucket1", + "logicalId": "FargateService", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" - }, - "category": "Resource", - "startLine": 31, - "startColumn": 7, - "endLine": 31, - "endColumn": 18, - "ruleDescription": "Basic CloudFormation Resource Check", - "phase": "PARSE" - }, - { - "ruleId": "W7001", - "severity": "WARN", - "message": "Mapping 'EnvMap' is not referenced by any Fn::FindInMap", - "source": "CFN_LINT", - "entity": { - "logicalId": "EnvMap", - "entityType": "Mapping" + "resourceType": "AWS::ECS::Service" }, - "propertyPath": "Mappings/EnvMap", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 11, + "startLine": 16, "startColumn": 5, - "endLine": 11, - "endColumn": 12, - "ruleDescription": "Check if Mappings are Used", + "endLine": 16, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "W8001", - "severity": "WARN", - "message": "Condition 'IsProduction' is not used by any resource or Fn::If", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'AwsvpcTaskDef' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "IsProduction", - "entityType": "Condition" + "logicalId": "AwsvpcTaskDef", + "entityType": "Resource", + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Conditions/IsProduction", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 21, + "startLine": 26, "startColumn": 5, - "endLine": 21, - "endColumn": 18, - "ruleDescription": "Check if Conditions are Used", + "endLine": 26, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "W8001", - "severity": "WARN", - "message": "Condition 'IsDevEnv' is not used by any resource or Fn::If", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'ServiceNoNetConfig' of type 'AWS::ECS::Service' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "IsDevEnv", - "entityType": "Condition" + "logicalId": "ServiceNoNetConfig", + "entityType": "Resource", + "resourceType": "AWS::ECS::Service" }, - "propertyPath": "Conditions/IsDevEnv", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 24, + "startLine": 34, "startColumn": 5, - "endLine": 24, - "endColumn": 14, - "ruleDescription": "Check if Conditions are Used", + "endLine": 34, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", + "message": "Resource 'FifoQueue' of type 'AWS::SQS::Queue' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Bucket1", + "logicalId": "FifoQueue", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Properties.BucketName", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 33, - "startColumn": 9, - "endLine": 33, - "endColumn": 20, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 39, + "startColumn": 5, + "endLine": 39, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", + "message": "Resource 'StandardDLQ' of type 'AWS::SQS::Queue' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Bucket2", + "logicalId": "StandardDLQ", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Properties.BucketName", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 41, - "startColumn": 9, - "endLine": 41, - "endColumn": 20, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 47, + "startColumn": 5, + "endLine": 47, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", + "message": "Resource 'RestApi' of type 'AWS::ApiGateway::RestApi' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Bucket3", + "logicalId": "RestApi", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::ApiGateway::RestApi" }, - "propertyPath": "Properties.BucketName", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 49, - "startColumn": 9, - "endLine": 49, - "endColumn": 20, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 52, + "startColumn": 5, + "endLine": 52, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", + "message": "Resource 'RestApi2' of type 'AWS::ApiGateway::RestApi' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Bucket4", + "logicalId": "RestApi2", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::ApiGateway::RestApi" }, - "propertyPath": "Properties.BucketName", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 57, - "startColumn": 9, - "endLine": 57, - "endColumn": 20, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 73, + "startColumn": 5, + "endLine": 73, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", + "message": "Resource 'StageBadApi' of type 'AWS::ApiGateway::Stage' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Bucket5", + "logicalId": "StageBadApi", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::ApiGateway::Stage" }, - "propertyPath": "Properties.BucketName", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 65, - "startColumn": 9, - "endLine": 65, - "endColumn": 20, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 81, + "startColumn": 5, + "endLine": 81, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Bucket1' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Resource 'SqsFifoQueue' of type 'AWS::SQS::Queue' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Bucket1", + "logicalId": "SqsFifoQueue", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::SQS::Queue" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 32, - "startColumn": 7, - "endLine": 32, - "endColumn": 18, + "startLine": 88, + "startColumn": 5, + "endLine": 88, + "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Bucket2' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Resource 'FifoProcessor' of type 'AWS::Lambda::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Bucket2", + "logicalId": "FifoProcessor", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::Lambda::Function" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 40, - "startColumn": 7, - "endLine": 40, - "endColumn": 18, + "startLine": 93, + "startColumn": 5, + "endLine": 93, + "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Bucket3' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Resource 'FifoMapping' of type 'AWS::Lambda::EventSourceMapping' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Bucket3", + "logicalId": "FifoMapping", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::Lambda::EventSourceMapping" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 48, - "startColumn": 7, - "endLine": 48, - "endColumn": 18, + "startLine": 104, + "startColumn": 5, + "endLine": 104, + "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Bucket4' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Resource 'AuroraCluster' of type 'AWS::RDS::DBCluster' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Bucket4", + "logicalId": "AuroraCluster", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::RDS::DBCluster" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 56, - "startColumn": 7, - "endLine": 56, - "endColumn": 18, + "startLine": 111, + "startColumn": 5, + "endLine": 111, + "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'Bucket5' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Resource 'BadEngineInstance' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Bucket5", + "logicalId": "BadEngineInstance", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::RDS::DBInstance" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 64, - "startColumn": 7, - "endLine": 64, - "endColumn": 18, + "startLine": 117, + "startColumn": 5, + "endLine": 117, + "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "lsp/parameter_usage.yaml": { - "filePath": "lsp/parameter_usage.yaml", + "integration/custom-resources.yaml": { + "filePath": "integration/custom-resources.yaml", "status": "OK", "metadata": { - "resourcesScanned": 7, + "resourcesScanned": 2, "counts": { "fatal": 0, "errors": 1, - "warnings": 3, - "informational": 14, + "warnings": 0, + "informational": 2, "debug": 0 }, "suppressed": 0, @@ -17087,115 +11619,41 @@ }, "diagnostics": [ { - "ruleId": "E3001", + "ruleId": "E9004", "severity": "ERROR", - "message": "Resource 'Bucket1' has invalid property 'Conditions'. Valid resource attributes: Type, Properties, DependsOn, Condition, Metadata, DeletionPolicy, UpdateReplacePolicy, UpdatePolicy, CreationPolicy, Fn::Transform, Version", - "source": "CFN_LINT", + "message": "'ArnA' is not one of ['Arn', 'KeyId']", + "source": "SCHEMA", "entity": { - "logicalId": "Bucket1", + "logicalId": "CustomResource", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" - }, - "category": "Resource", - "startLine": 27, - "startColumn": 5, - "endLine": 27, - "endColumn": 15, - "ruleDescription": "Basic CloudFormation Resource Check", - "phase": "PARSE" - }, - { - "ruleId": "W7001", - "severity": "WARN", - "message": "Mapping 'EnvMap' is not referenced by any Fn::FindInMap", - "source": "CFN_LINT", - "entity": { - "logicalId": "EnvMap", - "entityType": "Mapping" + "resourceType": "AWS::CloudFormation::CustomResource" }, - "propertyPath": "Mappings/EnvMap", - "category": "Best Practice", + "propertyPath": "Properties.KmsKeyId", + "suggestedFix": "Check the resource type documentation for valid GetAtt attributes", + "category": "Intrinsic Function", "startLine": 12, - "startColumn": 3, + "startColumn": 7, "endLine": 12, - "endColumn": 9, - "ruleDescription": "Check if Mappings are Used", - "phase": "LINT" - }, - { - "ruleId": "W8001", - "severity": "WARN", - "message": "Condition 'IsProduction' is not used by any resource or Fn::If", - "source": "CFN_LINT", - "entity": { - "logicalId": "IsProduction", - "entityType": "Condition" - }, - "propertyPath": "Conditions/IsProduction", - "category": "Best Practice", - "startLine": 20, - "startColumn": 3, - "endLine": 20, "endColumn": 15, - "ruleDescription": "Check if Conditions are Used", - "phase": "LINT" - }, - { - "ruleId": "W8001", - "severity": "WARN", - "message": "Condition 'IsDevEnv' is not used by any resource or Fn::If", - "source": "CFN_LINT", - "entity": { - "logicalId": "IsDevEnv", - "entityType": "Condition" - }, - "propertyPath": "Conditions/IsDevEnv", - "category": "Best Practice", - "startLine": 21, - "startColumn": 3, - "endLine": 21, - "endColumn": 11, - "ruleDescription": "Check if Conditions are Used", + "ruleDescription": "GetAtt attribute must exist on target resource type", "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "Bucket1", - "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" - }, - "propertyPath": "Properties.BucketName", - "category": "Best Practice", - "startLine": 29, - "startColumn": 7, - "endLine": 29, - "endColumn": 17, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", + "message": "Property 'ServiceToken' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Bucket2", + "logicalId": "CustomResource", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::CloudFormation::CustomResource" }, - "propertyPath": "Properties.BucketName", + "propertyPath": "Properties.ServiceToken", "category": "Best Practice", - "startLine": 35, + "startLine": 11, "startColumn": 7, - "endLine": 35, - "endColumn": 17, + "endLine": 11, + "endColumn": 19, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -17203,43 +11661,60 @@ } }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", + "message": "Resource 'KmsKey' of type 'AWS::KMS::Key' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "Bucket3", + "logicalId": "KmsKey", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::KMS::Key" }, - "propertyPath": "Properties.BucketName", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 42, - "startColumn": 7, - "endLine": 42, - "endColumn": 17, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 6, + "startColumn": 5, + "endLine": 6, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "integration/deployment-file-template.yaml": { + "filePath": "integration/deployment-file-template.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 3, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 13, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Bucket4", + "logicalId": "Vpc", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::EC2::VPC" }, - "propertyPath": "Properties.BucketName", + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 48, + "startLine": 24, "startColumn": 7, - "endLine": 48, - "endColumn": 17, + "endLine": 24, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -17249,19 +11724,19 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", + "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Bucket5", + "logicalId": "Subnet1", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.BucketName", + "propertyPath": "Properties.AvailabilityZone", "category": "Best Practice", - "startLine": 53, + "startLine": 28, "startColumn": 7, - "endLine": 53, - "endColumn": 17, + "endLine": 28, + "endColumn": 23, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -17271,19 +11746,19 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Bucket6", + "logicalId": "Subnet1", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.BucketName", + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 58, + "startLine": 29, "startColumn": 7, - "endLine": 58, - "endColumn": 17, + "endLine": 29, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -17293,314 +11768,189 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Bucket7", + "logicalId": "Subnet1", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.BucketName", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 64, + "startLine": 30, "startColumn": 7, - "endLine": 64, - "endColumn": 17, + "endLine": 30, + "endColumn": 12, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'Vpc'" } }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Bucket1' of type 'AWS::S3::Bucket' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "Bucket1", - "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 28, - "startColumn": 5, - "endLine": 28, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'Bucket2' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Property 'Affinity' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Bucket2", + "logicalId": "MyInstance", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.Affinity", "category": "Best Practice", "startLine": 34, - "startColumn": 5, + "startColumn": 7, "endLine": 34, "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Bucket3' of type 'AWS::S3::Bucket' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "Bucket3", - "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 41, - "startColumn": 5, - "endLine": 41, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'Bucket4' of type 'AWS::S3::Bucket' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "Bucket4", - "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 47, - "startColumn": 5, - "endLine": 47, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'Bucket5' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Bucket5", + "logicalId": "MyInstance", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 52, - "startColumn": 5, - "endLine": 52, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 35, + "startColumn": 7, + "endLine": 35, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "parameter 'ImageId' (type AWS::EC2::Image::Id)" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'Bucket6' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Bucket6", + "logicalId": "MyInstance", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 57, - "startColumn": 5, - "endLine": 57, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 36, + "startColumn": 7, + "endLine": 36, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'Bucket7' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Property 'SubnetId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Bucket7", + "logicalId": "MyInstance", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.SubnetId", "category": "Best Practice", - "startLine": 63, - "startColumn": 5, - "endLine": 63, + "startLine": 37, + "startColumn": 7, + "endLine": 37, "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "lsp/simple.json": { - "filePath": "lsp/simple.json", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 1, - "debug": 0 + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "GetAtt Subnet1.SubnetId" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'MyS3Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Property 'Tenancy' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "MyS3Bucket", + "logicalId": "MyInstance", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.Tenancy", "category": "Best Practice", - "startLine": 4, - "startColumn": 5, - "endLine": 4, - "endColumn": 16, - "ruleDescription": "Resource should have Tags", + "startLine": 38, + "startColumn": 7, + "endLine": 38, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only", + "resolutionSource": "parameter with AllowedValues" + } + }, + { + "ruleId": "I9003", + "severity": "INFO", + "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", + "source": "ENGINE", + "category": "Best Practice", + "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", "phase": "LINT" - } - ] - }, - "lsp/simple.yaml": { - "filePath": "lsp/simple.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 0, - "informational": 1, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'MyS3Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "message": "Resource 'Vpc' of type 'AWS::EC2::VPC' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "MyS3Bucket", + "logicalId": "Vpc", "entityType": "Resource", - "resourceType": "AWS::S3::Bucket" + "resourceType": "AWS::EC2::VPC" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 3, - "startColumn": 3, - "endLine": 3, - "endColumn": 13, + "startLine": 23, + "startColumn": 5, + "endLine": 23, + "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" - } - ] - }, - "lsp/test-template.yaml": { - "filePath": "lsp/test-template.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 2, - "counts": { - "fatal": 0, - "errors": 2, - "warnings": 0, - "informational": 2, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "E3038", - "severity": "ERROR", - "message": "Resource type 'AWS::Serverless::Function' requires the AWS::Serverless-2016-10-31 transform", - "source": "CFN_LINT", - "entity": { - "logicalId": "MyFunction", - "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" - }, - "category": "Structure", - "startLine": 2, - "startColumn": 3, - "endLine": 2, - "endColumn": 13, - "ruleDescription": "Check if Serverless Resources have Serverless Transform", - "phase": "LINT" - }, - { - "ruleId": "E3038", - "severity": "ERROR", - "message": "Resource type 'AWS::Serverless::Api' requires the AWS::Serverless-2016-10-31 transform", - "source": "CFN_LINT", - "entity": { - "logicalId": "MyApi", - "entityType": "Resource", - "resourceType": "AWS::Serverless::Api" - }, - "category": "Structure", - "startLine": 6, - "startColumn": 3, - "endLine": 6, - "endColumn": 8, - "ruleDescription": "Check if Serverless Resources have Serverless Transform", - "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'MyFunction' of type 'AWS::Serverless::Function' supports Tags but none are configured", + "message": "Resource 'Subnet1' of type 'AWS::EC2::Subnet' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "MyFunction", + "logicalId": "Subnet1", "entityType": "Resource", - "resourceType": "AWS::Serverless::Function" + "resourceType": "AWS::EC2::Subnet" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 4, + "startLine": 27, "startColumn": 5, - "endLine": 4, + "endLine": 27, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -17608,114 +11958,124 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'MyApi' of type 'AWS::Serverless::Api' supports Tags but none are configured", + "message": "Resource 'MyInstance' of type 'AWS::EC2::Instance' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "MyApi", + "logicalId": "MyInstance", "entityType": "Resource", - "resourceType": "AWS::Serverless::Api" + "resourceType": "AWS::EC2::Instance" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 8, + "startLine": 33, "startColumn": 5, - "endLine": 8, + "endLine": 33, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "malformed.yaml": { - "filePath": "malformed.yaml", - "status": "ERROR", + "integration/dynamic-references.yaml": { + "filePath": "integration/dynamic-references.yaml", + "status": "OK", "metadata": { - "resourcesScanned": 0, + "resourcesScanned": 4, "counts": { "fatal": 1, "errors": 0, - "warnings": 0, - "informational": 0, + "warnings": 1, + "informational": 11, "debug": 0 }, - "suppressed": 0, + "suppressed": 1, "strict": false, "severityLevel": "DEBUG" }, "diagnostics": [ { - "ruleId": "F1101", + "ruleId": "F3031", "severity": "FATAL", - "message": "YAML parse error: mapping values are not allowed in this context at byte 10 line 1 column 11", + "message": "'{{:ssm:/SQS_Queue/SQS_ARN}}' does not match pattern 'arn:(aws[a-zA-Z0-9-]*):([a-zA-Z0-9\\-])+:((eusc-)?[a-z]{2}((-gov)|(-iso([a-z]?)))?-[a-z]+-\\d{1})?:(\\d{12})?:(.*)'", "source": "SCHEMA", - "category": "Structure", - "startLine": 1, - "startColumn": 11, - "endLine": 1, - "endColumn": 11, - "ruleDescription": "Invalid YAML/JSON syntax", - "phase": "PARSE" - } - ] - }, - "public/lambda-poller.json": { - "filePath": "public/lambda-poller.json", - "status": "OK", - "metadata": { - "resourcesScanned": 5, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 0, - "informational": 9, - "debug": 0 + "entity": { + "logicalId": "SESEventSourceMappingBadDynamicReference", + "entityType": "Resource", + "resourceType": "AWS::Lambda::EventSourceMapping" + }, + "propertyPath": "Properties.EventSourceArn", + "category": "Schema", + "startLine": 16, + "startColumn": 7, + "endLine": 16, + "endColumn": 21, + "ruleDescription": "Value does not match pattern", + "phase": "SCHEMA", + "context": { + "actualValue": "{{:ssm:/SQS_Queue/SQS_ARN}}", + "expectedConstraint": "arn:(aws[a-zA-Z0-9-]*):([a-zA-Z0-9\\-])+:((eusc-)?[a-z]{2}((-gov)|(-iso([a-z]?)))?-[a-z]+-\\d{1})?:(\\d{12})?:(.*)" + } }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "E2533", - "severity": "ERROR", - "message": "Runtime 'nodejs6.10' was deprecated on '2019-08-12'. Creation was disabled on '2019-07-12', and updates were disabled on '2019-08-12'. Please consider updating to 'nodejs24.x'", + "ruleId": "W1053", + "severity": "WARN", + "message": "'{{ resolve:ssm:/SQS_Queue/SQS_ARN }}' has spaces and will not be resolved as a dynamic reference. Remove spaces from '{{resolve:...}}'", "source": "CFN_LINT", "entity": { - "logicalId": "PollerFunction", + "logicalId": "SESEventSourceMappingSpaces", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::Lambda::EventSourceMapping" }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 92, - "startColumn": 17, - "endLine": 92, - "endColumn": 25, - "ruleDescription": "Check if Lambda Function Runtimes are updatable", + "propertyPath": "Properties.EventSourceArn", + "suggestedFix": "Remove spaces from the dynamic reference", + "category": "Best Practice", + "startLine": 37, + "startColumn": 7, + "endLine": 37, + "endColumn": 21, + "ruleDescription": "Dynamic references should not contain spaces", + "phase": "LINT" + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'EventSourceArn' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "SESEventSourceMapping", + "entityType": "Resource", + "resourceType": "AWS::Lambda::EventSourceMapping" + }, + "propertyPath": "Properties.EventSourceArn", + "category": "Best Practice", + "startLine": 9, + "startColumn": 7, + "endLine": 9, + "endColumn": 21, + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "actualValue": "nodejs6.10", - "lifecycle": "end-of-life" + "lifecycle": "create-only", + "resolutionSource": "dynamic (dynamic reference: {{resolve:ssm:/SQS_Queue/SQS_ARN}})" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Path' is create-only; updating it will cause resource replacement", + "message": "Property 'EventSourceArn' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "PollerFunctionIamRole", + "logicalId": "SESEventSourceMappingBadDynamicReference", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::Lambda::EventSourceMapping" }, - "propertyPath": "Properties.Path", + "propertyPath": "Properties.EventSourceArn", "category": "Best Practice", - "startLine": 37, - "startColumn": 17, - "endLine": 37, - "endColumn": 22, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "startLine": 16, + "startColumn": 7, + "endLine": 16, + "endColumn": 21, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -17725,20 +12085,19 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Path' is create-only; updating it will cause resource replacement", + "message": "Property 'DeploymentMode' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "PollerEventRuleIamRole", + "logicalId": "Broker", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::AmazonMQ::Broker" }, - "propertyPath": "Properties.Path", + "propertyPath": "Properties.DeploymentMode", "category": "Best Practice", - "startLine": 133, - "startColumn": 17, - "endLine": 133, - "endColumn": 22, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "startLine": 24, + "startColumn": 9, + "endLine": 24, + "endColumn": 23, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -17748,19 +12107,19 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Action' is create-only; updating it will cause resource replacement", + "message": "Property 'EngineType' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "PollerFunctionEventInvokePermission", + "logicalId": "Broker", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::AmazonMQ::Broker" }, - "propertyPath": "Properties.Action", + "propertyPath": "Properties.EngineType", "category": "Best Practice", - "startLine": 192, - "startColumn": 17, - "endLine": 192, - "endColumn": 24, + "startLine": 25, + "startColumn": 9, + "endLine": 25, + "endColumn": 19, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -17770,41 +12129,40 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "message": "Property 'BrokerName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "PollerFunctionEventInvokePermission", + "logicalId": "Broker", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::AmazonMQ::Broker" }, - "propertyPath": "Properties.FunctionName", + "propertyPath": "Properties.BrokerName", "category": "Best Practice", - "startLine": 193, - "startColumn": 17, - "endLine": 193, - "endColumn": 30, + "startLine": 30, + "startColumn": 9, + "endLine": 30, + "endColumn": 19, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "Ref to 'PollerFunction'" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Principal' is create-only; updating it will cause resource replacement", + "message": "Property 'PubliclyAccessible' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "PollerFunctionEventInvokePermission", + "logicalId": "Broker", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::AmazonMQ::Broker" }, - "propertyPath": "Properties.Principal", + "propertyPath": "Properties.PubliclyAccessible", "category": "Best Practice", - "startLine": 196, - "startColumn": 17, - "endLine": 196, + "startLine": 31, + "startColumn": 9, + "endLine": 31, "endColumn": 27, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", @@ -17815,98 +12173,117 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'SourceArn' is create-only; updating it will cause resource replacement", + "message": "Property 'EventSourceArn' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "PollerFunctionEventInvokePermission", + "logicalId": "SESEventSourceMappingSpaces", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::Lambda::EventSourceMapping" }, - "propertyPath": "Properties.SourceArn", + "propertyPath": "Properties.EventSourceArn", "category": "Best Practice", - "startLine": 197, - "startColumn": 17, - "endLine": 197, - "endColumn": 27, + "startLine": 37, + "startColumn": 7, + "endLine": 37, + "endColumn": 21, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt PollerEventRule.Arn" + "lifecycle": "create-only" } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'PollerFunctionIamRole' of type 'AWS::IAM::Role' supports Tags but none are configured", + "message": "Resource 'SESEventSourceMapping' of type 'AWS::Lambda::EventSourceMapping' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "PollerFunctionIamRole", + "logicalId": "SESEventSourceMapping", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::Lambda::EventSourceMapping" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 20, - "startColumn": 13, - "endLine": 20, - "endColumn": 24, + "startLine": 6, + "startColumn": 5, + "endLine": 6, + "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'PollerEventRuleIamRole' of type 'AWS::IAM::Role' supports Tags but none are configured", + "message": "Resource 'SESEventSourceMappingBadDynamicReference' of type 'AWS::Lambda::EventSourceMapping' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "PollerEventRuleIamRole", + "logicalId": "SESEventSourceMappingBadDynamicReference", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::Lambda::EventSourceMapping" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 116, - "startColumn": 13, - "endLine": 116, - "endColumn": 24, + "startLine": 13, + "startColumn": 5, + "endLine": 13, + "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'PollerEventRule' of type 'AWS::Events::Rule' supports Tags but none are configured", + "message": "Resource 'Broker' of type 'AWS::AmazonMQ::Broker' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "PollerEventRule", + "logicalId": "Broker", "entityType": "Resource", - "resourceType": "AWS::Events::Rule" + "resourceType": "AWS::AmazonMQ::Broker" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 162, - "startColumn": 13, - "endLine": 162, - "endColumn": 24, + "startLine": 20, + "startColumn": 5, + "endLine": 20, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'SESEventSourceMappingSpaces' of type 'AWS::Lambda::EventSourceMapping' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "SESEventSourceMappingSpaces", + "entityType": "Resource", + "resourceType": "AWS::Lambda::EventSourceMapping" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 34, + "startColumn": 5, + "endLine": 34, + "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "public/lambda-poller.yaml": { - "filePath": "public/lambda-poller.yaml", + "integration/formats.yaml": { + "filePath": "integration/formats.yaml", "status": "OK", "metadata": { - "resourcesScanned": 5, + "resourcesScanned": 4, "counts": { "fatal": 0, - "errors": 1, - "warnings": 0, - "informational": 9, + "errors": 2, + "warnings": 4, + "informational": 13, "debug": 0 }, "suppressed": 0, @@ -17915,45 +12292,143 @@ }, "diagnostics": [ { - "ruleId": "E2533", + "ruleId": "E1040", "severity": "ERROR", - "message": "Runtime 'nodejs6.10' was deprecated on '2019-08-12'. Creation was disabled on '2019-07-12', and updates were disabled on '2019-08-12'. Please consider updating to 'nodejs24.x'", + "message": "{'Fn::GetAtt': ['SecurityGroup', 'GroupName']} does not match destination format of 'AWS::EC2::SecurityGroup.Id'", + "source": "CFN_LINT", + "entity": { + "logicalId": "Instance1", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Properties.NetworkInterfaces.2.GroupSet.0", + "suggestedFix": "Use the correct GetAtt attribute", + "category": "Intrinsic Function", + "startLine": 44, + "startColumn": 21, + "endLine": 44, + "endColumn": 22, + "ruleDescription": "Check if GetAtt matches destination format", + "phase": "LINT" + }, + { + "ruleId": "E1150", + "severity": "ERROR", + "message": "'sg-dne' does not match format 'AWS::EC2::SecurityGroup.Id'", + "source": "CFN_LINT", + "entity": { + "logicalId": "Instance1", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Properties.NetworkInterfaces.1.GroupSet.3", + "category": "Intrinsic Function", + "startLine": 40, + "startColumn": 13, + "endLine": 40, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Validate security group format", + "phase": "SCHEMA", + "context": { + "actualValue": "sg-dne" + } + }, + { + "ruleId": "W9003", + "severity": "WARN", + "message": "0 is not of type 'string' - automatically coerced (number to string)", + "source": "CFN_LINT", + "entity": { + "logicalId": "Instance1", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Properties.NetworkInterfaces.0.DeviceIndex", + "category": "Best Practice", + "startLine": 31, + "startColumn": 11, + "endLine": 31, + "endColumn": 22, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Property type coercion warning", + "phase": "SCHEMA" + }, + { + "ruleId": "W9003", + "severity": "WARN", + "message": "1 is not of type 'string' - automatically coerced (number to string)", + "source": "CFN_LINT", + "entity": { + "logicalId": "Instance1", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Properties.NetworkInterfaces.1.DeviceIndex", + "category": "Best Practice", + "startLine": 34, + "startColumn": 11, + "endLine": 34, + "endColumn": 22, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Property type coercion warning", + "phase": "SCHEMA" + }, + { + "ruleId": "W9003", + "severity": "WARN", + "message": "2 is not of type 'string' - automatically coerced (number to string)", "source": "CFN_LINT", "entity": { - "logicalId": "PollerFunction", + "logicalId": "Instance1", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Properties.NetworkInterfaces.2.DeviceIndex", + "category": "Best Practice", + "startLine": 41, + "startColumn": 11, + "endLine": 41, + "endColumn": 22, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Property type coercion warning", + "phase": "SCHEMA" + }, + { + "ruleId": "W9010", + "severity": "WARN", + "message": "Hardcoded AMI ID - use a parameter or mapping for portability", + "source": "ENGINE", + "entity": { + "logicalId": "Instance1", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 151, + "propertyPath": "Properties.ImageId", + "category": "Security", + "startLine": 28, "startColumn": 7, - "endLine": 151, + "endLine": 28, "endColumn": 14, - "ruleDescription": "Check if Lambda Function Runtimes are updatable", - "phase": "SCHEMA", - "context": { - "actualValue": "nodejs6.10", - "lifecycle": "end-of-life" - } + "ruleDescription": "Hardcoded AMI ID", + "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Path' is create-only; updating it will cause resource replacement", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "PollerFunctionIamRole", + "logicalId": "Vpc", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::EC2::VPC" }, - "propertyPath": "Properties.Path", + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 27, + "startLine": 11, "startColumn": 7, - "endLine": 27, - "endColumn": 11, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "endLine": 11, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -17963,42 +12438,42 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Path' is create-only; updating it will cause resource replacement", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "PollerEventRuleIamRole", + "logicalId": "Subnet", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.Path", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 172, + "startLine": 16, "startColumn": 7, - "endLine": 172, - "endColumn": 11, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "endLine": 16, + "endColumn": 12, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'Vpc'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Action' is create-only; updating it will cause resource replacement", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "PollerFunctionEventInvokePermission", + "logicalId": "Subnet", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.Action", + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 197, + "startLine": 17, "startColumn": 7, - "endLine": 197, - "endColumn": 13, + "endLine": 17, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -18008,42 +12483,42 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "PollerFunctionEventInvokePermission", + "logicalId": "SecurityGroup", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.FunctionName", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 198, + "startLine": 22, "startColumn": 7, - "endLine": 198, - "endColumn": 19, + "endLine": 22, + "endColumn": 12, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "Ref to 'PollerFunction'" + "resolutionSource": "Ref to 'Vpc'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Principal' is create-only; updating it will cause resource replacement", + "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "PollerFunctionEventInvokePermission", + "logicalId": "SecurityGroup", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.Principal", + "propertyPath": "Properties.GroupDescription", "category": "Best Practice", - "startLine": 199, + "startLine": 23, "startColumn": 7, - "endLine": 199, - "endColumn": 16, + "endLine": 23, + "endColumn": 23, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -18053,305 +12528,173 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'SourceArn' is create-only; updating it will cause resource replacement", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "PollerFunctionEventInvokePermission", + "logicalId": "Instance1", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.SourceArn", + "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 200, + "startLine": 28, "startColumn": 7, - "endLine": 200, - "endColumn": 16, + "endLine": 28, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt PollerEventRule.Arn" + "lifecycle": "create-only" } }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'PollerFunctionIamRole' of type 'AWS::IAM::Role' supports Tags but none are configured", - "source": "ENGINE", - "entity": { - "logicalId": "PollerFunctionIamRole", - "entityType": "Resource", - "resourceType": "AWS::IAM::Role" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 17, - "startColumn": 5, - "endLine": 17, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - }, - { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'PollerEventRuleIamRole' of type 'AWS::IAM::Role' supports Tags but none are configured", + "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "PollerEventRuleIamRole", + "logicalId": "Instance1", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 162, - "startColumn": 5, - "endLine": 162, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 29, + "startColumn": 7, + "endLine": 29, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'PollerEventRule' of type 'AWS::Events::Rule' supports Tags but none are configured", + "message": "Property 'NetworkInterfaces' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "PollerEventRule", + "logicalId": "Instance1", "entityType": "Resource", - "resourceType": "AWS::Events::Rule" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.NetworkInterfaces", "category": "Best Practice", - "startLine": 185, - "startColumn": 5, - "endLine": 185, - "endColumn": 15, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" - } - ] - }, - "public/rds-cluster.yaml": { - "filePath": "public/rds-cluster.yaml", - "status": "OK", - "metadata": { - "resourcesScanned": 1, - "counts": { - "fatal": 0, - "errors": 1, - "warnings": 1, - "informational": 7, - "debug": 0 - }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ - { - "ruleId": "E9006", - "severity": "ERROR", - "message": "'aurora' is not one of ['aurora-mysql', 'aurora-postgresql', 'mysql', 'postgres']", - "source": "CFN_LINT", - "entity": { - "logicalId": "DBCluster", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" - }, - "propertyPath": "Properties.Engine", - "category": "Schema", - "startLine": 24, - "startColumn": 7, - "endLine": 24, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", - "ruleDescription": "Property value not valid for conditional extension enum", - "phase": "SCHEMA" - }, - { - "ruleId": "W1011", - "severity": "WARN", - "message": "Use dynamic references (e.g., SSM SecureString) instead of parameter 'DatabaseMasterPassword' for secrets", - "source": "CFN_LINT", - "entity": { - "logicalId": "DBCluster", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" - }, - "propertyPath": "Properties.MasterUserPassword", - "category": "Security", - "startLine": 22, + "startLine": 30, "startColumn": 7, - "endLine": 22, - "endColumn": 25, - "ruleDescription": "Instead of REFing a parameter for a secret use a dynamic reference", - "phase": "LINT" - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "DBCluster", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" - }, - "category": "Best Practice", - "startLine": 18, - "startColumn": 3, - "endLine": 18, - "endColumn": 12, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" - }, - { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "DBCluster", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" - }, - "category": "Best Practice", - "startLine": 18, - "startColumn": 3, - "endLine": 18, - "endColumn": 12, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", - "phase": "LINT" + "endLine": 30, + "endColumn": 24, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I3013", + "ruleId": "I9003", "severity": "INFO", - "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", - "source": "CFN_LINT", - "entity": { - "logicalId": "DBCluster", - "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" - }, - "propertyPath": "Properties", - "category": "Best Practice", - "startLine": 20, - "startColumn": 5, - "endLine": 20, - "endColumn": 15, - "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", + "source": "ENGINE", + "category": "Best Practice", + "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'MasterUsername' is conditionally create-only; updating it may cause resource replacement", + "message": "Resource 'Vpc' of type 'AWS::EC2::VPC' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "DBCluster", + "logicalId": "Vpc", "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" + "resourceType": "AWS::EC2::VPC" }, - "propertyPath": "Properties.MasterUsername", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 21, - "startColumn": 7, - "endLine": 21, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only", - "resolutionSource": "parameter 'DatabaseMasterUsername' (type String)" - } + "startLine": 10, + "startColumn": 5, + "endLine": 10, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'DatabaseName' is create-only; updating it will cause resource replacement", + "message": "Resource 'Subnet' of type 'AWS::EC2::Subnet' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "DBCluster", + "logicalId": "Subnet", "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.DatabaseName", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 23, - "startColumn": 7, - "endLine": 23, - "endColumn": 19, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter 'DatabaseName' (type String)" - } + "startLine": 15, + "startColumn": 5, + "endLine": 15, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "message": "Resource 'SecurityGroup' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "DBCluster", + "logicalId": "SecurityGroup", "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.Engine", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 24, - "startColumn": 7, - "endLine": 24, - "endColumn": 13, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "startLine": 21, + "startColumn": 5, + "endLine": 21, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'EngineMode' is create-only; updating it will cause resource replacement", + "message": "Resource 'Instance1' of type 'AWS::EC2::Instance' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "DBCluster", + "logicalId": "Instance1", "entityType": "Resource", - "resourceType": "AWS::RDS::DBCluster" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.EngineMode", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 25, - "startColumn": 7, - "endLine": 25, - "endColumn": 17, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 27, + "startColumn": 5, + "endLine": 27, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" } ] }, - "public/watchmaker.json": { - "filePath": "public/watchmaker.json", + "integration/get-stack-output.yaml": { + "filePath": "integration/get-stack-output.yaml", "status": "OK", "metadata": { - "resourcesScanned": 2, + "resourcesScanned": 5, "counts": { "fatal": 0, - "errors": 0, + "errors": 2, "warnings": 0, - "informational": 41, + "informational": 5, "debug": 0 }, "suppressed": 0, @@ -18360,212 +12703,270 @@ }, "diagnostics": [ { - "ruleId": "I1022", - "severity": "INFO", - "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", - "source": "CFN_LINT", + "ruleId": "E1033", + "severity": "ERROR", + "message": "'OutputName' is a required property", + "source": "SCHEMA", "entity": { - "logicalId": "WatchmakerInstance", + "logicalId": "InvalidMissing", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.cw-agent-install.commands.01-get-cloudwatch-agent.command.Fn::Join", + "propertyPath": "Properties.DisplayName.Fn::GetStackOutput", "category": "Intrinsic Function", - "startLine": 647, - "startColumn": 37, - "endLine": 647, - "endColumn": 46, - "ruleDescription": "Use Sub instead of Join", + "startLine": 47, + "startColumn": 9, + "endLine": 47, + "endColumn": 27, + "ruleDescription": "GetStackOutput validation of parameters", + "phase": "PARSE" + }, + { + "ruleId": "E1033", + "severity": "ERROR", + "message": "'not-an-object' is not of type 'object'", + "source": "SCHEMA", + "entity": { + "logicalId": "InvalidType", + "entityType": "Resource", + "resourceType": "AWS::SNS::Topic" + }, + "propertyPath": "Properties.DisplayName.Fn::GetStackOutput", + "category": "Intrinsic Function", + "startLine": 54, + "startColumn": 9, + "endLine": 54, + "endColumn": 27, + "ruleDescription": "GetStackOutput validation of parameters", + "phase": "PARSE" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'ValidTopic' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "ValidTopic", + "entityType": "Resource", + "resourceType": "AWS::SNS::Topic" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 15, + "startColumn": 5, + "endLine": 15, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "I1022", + "ruleId": "I9040", "severity": "INFO", - "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", - "source": "CFN_LINT", + "message": "Resource 'ValidJoin' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "WatchmakerInstance", + "logicalId": "ValidJoin", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.cw-agent-install.commands.02-extract-cloudwatch-agent.command.Fn::Join", - "category": "Intrinsic Function", - "startLine": 662, - "startColumn": 37, - "endLine": 662, - "endColumn": 46, - "ruleDescription": "Use Sub instead of Join", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 23, + "startColumn": 5, + "endLine": 23, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "I1022", + "ruleId": "I9040", "severity": "INFO", - "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", - "source": "CFN_LINT", + "message": "Resource 'ValidIf' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "WatchmakerInstance", + "logicalId": "ValidIf", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.cw-agent-install.commands.10-install-cloudwatch-agent.command.Fn::Join", - "category": "Intrinsic Function", - "startLine": 673, - "startColumn": 37, - "endLine": 673, - "endColumn": 46, - "ruleDescription": "Use Sub instead of Join", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 34, + "startColumn": 5, + "endLine": 34, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "I1022", + "ruleId": "I9040", "severity": "INFO", - "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", - "source": "CFN_LINT", + "message": "Resource 'InvalidMissing' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "WatchmakerInstance", + "logicalId": "InvalidMissing", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.finalize.commands.10-signal-success.command.Fn::Join.1.4.Fn::If.1.Fn::Join", - "category": "Intrinsic Function", - "startLine": 816, - "startColumn": 57, - "endLine": 816, - "endColumn": 66, - "ruleDescription": "Use Sub instead of Join", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 45, + "startColumn": 5, + "endLine": 45, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "I1022", + "ruleId": "I9040", "severity": "INFO", - "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", - "source": "CFN_LINT", + "message": "Resource 'InvalidType' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "WatchmakerInstance", + "logicalId": "InvalidType", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.finalize.commands.10-signal-success.command.Fn::Join.1.5.Fn::If.1.Fn::Join", - "category": "Intrinsic Function", - "startLine": 833, - "startColumn": 57, - "endLine": 833, - "endColumn": 66, - "ruleDescription": "Use Sub instead of Join", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 52, + "startColumn": 5, + "endLine": 52, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "integration/getatt-types.yaml": { + "filePath": "integration/getatt-types.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 8, + "counts": { + "fatal": 5, + "errors": 1, + "warnings": 0, + "informational": 19, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I1022", - "severity": "INFO", - "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", - "source": "CFN_LINT", + "ruleId": "F6101", + "severity": "FATAL", + "message": "Output 'SubWithGetAtt': GetAtt 'CapacityReservation.InstanceCount' returns type 'integer', not 'string'", + "source": "SCHEMA", "entity": { - "logicalId": "WatchmakerInstance", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "logicalId": "SubWithGetAtt", + "entityType": "Output" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.make-app.commands.05-get-appscript.command.Fn::Join", - "category": "Intrinsic Function", - "startLine": 869, - "startColumn": 37, - "endLine": 869, - "endColumn": 46, - "ruleDescription": "Use Sub instead of Join", - "phase": "LINT" + "propertyPath": "Outputs/SubWithGetAtt/Value.Fn::GetAtt", + "category": "Structure", + "startLine": 84, + "startColumn": 3, + "endLine": 84, + "endColumn": 16, + "ruleDescription": "Output value must be a string", + "phase": "SCHEMA" }, { - "ruleId": "I1022", - "severity": "INFO", - "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", - "source": "CFN_LINT", + "ruleId": "F6101", + "severity": "FATAL", + "message": "Output 'Ipv4NetmaskLength': GetAtt 'CapacityReservation.InstanceCount' returns type 'integer', not 'string'", + "source": "SCHEMA", "entity": { - "logicalId": "WatchmakerInstance", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "logicalId": "Ipv4NetmaskLength", + "entityType": "Output" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.make-app.commands.10-make-app.command.Fn::Join", - "category": "Intrinsic Function", - "startLine": 887, - "startColumn": 37, - "endLine": 887, - "endColumn": 46, - "ruleDescription": "Use Sub instead of Join", - "phase": "LINT" + "propertyPath": "Outputs/Ipv4NetmaskLength/Value.Fn::GetAtt", + "category": "Structure", + "startLine": 86, + "startColumn": 3, + "endLine": 86, + "endColumn": 20, + "ruleDescription": "Output value must be a string", + "phase": "SCHEMA" }, { - "ruleId": "I1022", - "severity": "INFO", - "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", - "source": "CFN_LINT", + "ruleId": "F6101", + "severity": "FATAL", + "message": "Output 'String': GetAtt 'CapacityReservation.InstanceCount' returns type 'integer', not 'string'", + "source": "SCHEMA", "entity": { - "logicalId": "WatchmakerInstance", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "logicalId": "String", + "entityType": "Output" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.setup.files./etc/cfn/cfn-hup.conf.content.Fn::Join.1.7.Fn::If.1.Fn::Join", - "category": "Intrinsic Function", - "startLine": 932, - "startColumn": 57, - "endLine": 932, - "endColumn": 66, - "ruleDescription": "Use Sub instead of Join", - "phase": "LINT" + "propertyPath": "Outputs/String/Value.Fn::Sub", + "category": "Structure", + "startLine": 88, + "startColumn": 3, + "endLine": 88, + "endColumn": 9, + "ruleDescription": "Output value must be a string", + "phase": "SCHEMA" }, { - "ruleId": "I1022", - "severity": "INFO", - "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", - "source": "CFN_LINT", + "ruleId": "F6101", + "severity": "FATAL", + "message": "Output 'JoinWithGetAtt': GetAtt 'CapacityReservation.InstanceCount' returns type 'integer', not 'string'", + "source": "SCHEMA", "entity": { - "logicalId": "WatchmakerInstance", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "logicalId": "JoinWithGetAtt", + "entityType": "Output" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.setup.files./etc/cfn/cfn-hup.conf.content.Fn::Join.1.8.Fn::If.1.Fn::Join", - "category": "Intrinsic Function", - "startLine": 950, - "startColumn": 57, - "endLine": 950, - "endColumn": 66, - "ruleDescription": "Use Sub instead of Join", - "phase": "LINT" + "propertyPath": "Outputs/JoinWithGetAtt/Value.Fn::Join.1.0.Fn::GetAtt", + "category": "Structure", + "startLine": 92, + "startColumn": 3, + "endLine": 92, + "endColumn": 17, + "ruleDescription": "Output value must be a string", + "phase": "SCHEMA" }, { - "ruleId": "I1022", - "severity": "INFO", - "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", - "source": "CFN_LINT", + "ruleId": "F6101", + "severity": "FATAL", + "message": "Output 'BooleanGetAtt': GetAtt 'CapacityReservation.EphemeralStorage' returns type 'boolean', not 'string'", + "source": "SCHEMA", "entity": { - "logicalId": "WatchmakerInstance", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "logicalId": "BooleanGetAtt", + "entityType": "Output" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.setup.files./etc/cfn/hooks.d/cfn-auto-reloader.conf.content.Fn::Join.1.7.Fn::If.1.Fn::Join", - "category": "Intrinsic Function", - "startLine": 993, - "startColumn": 57, - "endLine": 993, - "endColumn": 66, - "ruleDescription": "Use Sub instead of Join", - "phase": "LINT" + "propertyPath": "Outputs/BooleanGetAtt/Value.Fn::GetAtt", + "category": "Structure", + "startLine": 96, + "startColumn": 3, + "endLine": 96, + "endColumn": 16, + "ruleDescription": "Output value must be a string", + "phase": "SCHEMA" }, { - "ruleId": "I1022", - "severity": "INFO", - "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", + "ruleId": "E1040", + "severity": "ERROR", + "message": "{'Fn::GetAtt': ['TestLogGroup', 'Arn']} does not match destination format of 'AWS::Logs::LogGroup.Name'", "source": "CFN_LINT", "entity": { - "logicalId": "WatchmakerInstance", + "logicalId": "TestTaskDefinitionWithGetAtt", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.setup.files./etc/cfn/hooks.d/cfn-auto-reloader.conf.content.Fn::Join.1.8.Fn::If.1.Fn::Join", + "propertyPath": "Properties.ContainerDefinitions.0.LogConfiguration.Options.awslogs-group", + "suggestedFix": "Use the correct GetAtt attribute", "category": "Intrinsic Function", - "startLine": 1010, - "startColumn": 57, - "endLine": 1010, - "endColumn": 66, - "ruleDescription": "Use Sub instead of Join", + "startLine": 62, + "startColumn": 15, + "endLine": 62, + "endColumn": 28, + "ruleDescription": "Check if GetAtt matches destination format", "phase": "LINT" }, { @@ -18574,16 +12975,15 @@ "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", "source": "CFN_LINT", "entity": { - "logicalId": "WatchmakerInstance", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "logicalId": "Join", + "entityType": "Output" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.setup.files./etc/cfn/scripts/watchmaker-install.sh.content.Fn::Join", + "propertyPath": "Outputs/Join/Value.Fn::Join", "category": "Intrinsic Function", - "startLine": 1038, - "startColumn": 37, - "endLine": 1038, - "endColumn": 46, + "startLine": 90, + "startColumn": 3, + "endLine": 90, + "endColumn": 7, "ruleDescription": "Use Sub instead of Join", "phase": "LINT" }, @@ -18593,584 +12993,666 @@ "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", "source": "CFN_LINT", "entity": { - "logicalId": "WatchmakerInstance", - "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "logicalId": "JoinWithGetAtt", + "entityType": "Output" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.watchmaker-launch.commands.10-watchmaker-launch.command.Fn::Join.1.3.Fn::If.1.Fn::Join", + "propertyPath": "Outputs/JoinWithGetAtt/Value.Fn::Join", "category": "Intrinsic Function", - "startLine": 1101, - "startColumn": 57, - "endLine": 1101, - "endColumn": 66, + "startLine": 92, + "startColumn": 3, + "endLine": 92, + "endColumn": 17, "ruleDescription": "Use Sub instead of Join", "phase": "LINT" }, { - "ruleId": "I1022", + "ruleId": "I9001", "severity": "INFO", - "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", - "source": "CFN_LINT", + "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "WatchmakerInstance", + "logicalId": "CapacityReservation", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::EC2::CapacityReservation" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.watchmaker-launch.commands.10-watchmaker-launch.command.Fn::Join.1.4.Fn::If.1.Fn::Join", - "category": "Intrinsic Function", - "startLine": 1119, - "startColumn": 57, - "endLine": 1119, - "endColumn": 66, - "ruleDescription": "Use Sub instead of Join", - "phase": "LINT" + "propertyPath": "Properties.AvailabilityZone", + "category": "Best Practice", + "startLine": 10, + "startColumn": 7, + "endLine": 10, + "endColumn": 23, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I1022", + "ruleId": "I9001", "severity": "INFO", - "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", - "source": "CFN_LINT", + "message": "Property 'InstanceType' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "WatchmakerInstance", + "logicalId": "CapacityReservation", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::EC2::CapacityReservation" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.watchmaker-launch.commands.10-watchmaker-launch.command.Fn::Join.1.5.Fn::If.1.Fn::Join", - "category": "Intrinsic Function", - "startLine": 1137, - "startColumn": 57, - "endLine": 1137, - "endColumn": 66, - "ruleDescription": "Use Sub instead of Join", - "phase": "LINT" + "propertyPath": "Properties.InstanceType", + "category": "Best Practice", + "startLine": 12, + "startColumn": 7, + "endLine": 12, + "endColumn": 19, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I1022", + "ruleId": "I9001", "severity": "INFO", - "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", - "source": "CFN_LINT", + "message": "Property 'InstancePlatform' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "WatchmakerInstance", + "logicalId": "CapacityReservation", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::EC2::CapacityReservation" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.watchmaker-launch.commands.10-watchmaker-launch.command.Fn::Join.1.6.Fn::If.1.Fn::Join", - "category": "Intrinsic Function", - "startLine": 1155, - "startColumn": 57, - "endLine": 1155, - "endColumn": 66, - "ruleDescription": "Use Sub instead of Join", - "phase": "LINT" + "propertyPath": "Properties.InstancePlatform", + "category": "Best Practice", + "startLine": 13, + "startColumn": 7, + "endLine": 13, + "endColumn": 23, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I1022", + "ruleId": "I9001", "severity": "INFO", - "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", - "source": "CFN_LINT", + "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "WatchmakerInstance", + "logicalId": "TestTaskDefinitionWithGetAtt", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.watchmaker-launch.commands.10-watchmaker-launch.command.Fn::Join.1.7.Fn::If.1.Fn::Join", - "category": "Intrinsic Function", - "startLine": 1173, - "startColumn": 57, - "endLine": 1173, - "endColumn": 66, - "ruleDescription": "Use Sub instead of Join", - "phase": "LINT" + "propertyPath": "Properties.ContainerDefinitions", + "category": "Best Practice", + "startLine": 57, + "startColumn": 7, + "endLine": 57, + "endColumn": 27, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I1022", + "ruleId": "I9001", "severity": "INFO", - "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", - "source": "CFN_LINT", + "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "WatchmakerInstance", + "logicalId": "TestTaskDefinitionWithGetAtt", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.watchmaker-launch.commands.10-watchmaker-launch.command.Fn::Join.1.8.Fn::If.1.Fn::Join", - "category": "Intrinsic Function", - "startLine": 1191, - "startColumn": 57, - "endLine": 1191, - "endColumn": 66, - "ruleDescription": "Use Sub instead of Join", - "phase": "LINT" + "propertyPath": "Properties.Cpu", + "category": "Best Practice", + "startLine": 68, + "startColumn": 7, + "endLine": 68, + "endColumn": 10, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I1022", + "ruleId": "I9001", "severity": "INFO", - "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", - "source": "CFN_LINT", + "message": "Property 'ExecutionRoleArn' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "WatchmakerInstance", + "logicalId": "TestTaskDefinitionWithGetAtt", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.watchmaker-update.commands.10-watchmaker-update.command.Fn::Join.1.4.Fn::If.1.Fn::Join", - "category": "Intrinsic Function", - "startLine": 1226, - "startColumn": 57, - "endLine": 1226, - "endColumn": 66, - "ruleDescription": "Use Sub instead of Join", - "phase": "LINT" + "propertyPath": "Properties.ExecutionRoleArn", + "category": "Best Practice", + "startLine": 69, + "startColumn": 7, + "endLine": 69, + "endColumn": 23, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "GetAtt TestFargateExecutionRole.Arn" + } }, { - "ruleId": "I1022", + "ruleId": "I9001", "severity": "INFO", - "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", - "source": "CFN_LINT", + "message": "Property 'Memory' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "WatchmakerInstance", + "logicalId": "TestTaskDefinitionWithGetAtt", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.watchmaker-update.commands.10-watchmaker-update.command.Fn::Join.1.5.Fn::If.1.Fn::Join", - "category": "Intrinsic Function", - "startLine": 1244, - "startColumn": 57, - "endLine": 1244, - "endColumn": 66, - "ruleDescription": "Use Sub instead of Join", - "phase": "LINT" + "propertyPath": "Properties.Memory", + "category": "Best Practice", + "startLine": 70, + "startColumn": 7, + "endLine": 70, + "endColumn": 13, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I1022", + "ruleId": "I9001", "severity": "INFO", - "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", - "source": "CFN_LINT", + "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "WatchmakerInstance", + "logicalId": "TestTaskDefinitionWithGetAtt", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.watchmaker-update.commands.10-watchmaker-update.command.Fn::Join.1.6.Fn::If.1.Fn::Join", - "category": "Intrinsic Function", - "startLine": 1262, - "startColumn": 57, - "endLine": 1262, - "endColumn": 66, - "ruleDescription": "Use Sub instead of Join", - "phase": "LINT" + "propertyPath": "Properties.NetworkMode", + "category": "Best Practice", + "startLine": 71, + "startColumn": 7, + "endLine": 71, + "endColumn": 18, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I1022", + "ruleId": "I9001", "severity": "INFO", - "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", - "source": "CFN_LINT", + "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "WatchmakerInstance", + "logicalId": "TestTaskDefinitionWithGetAtt", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.watchmaker-update.commands.10-watchmaker-update.command.Fn::Join.1.7.Fn::If.1.Fn::Join", - "category": "Intrinsic Function", - "startLine": 1280, - "startColumn": 57, - "endLine": 1280, - "endColumn": 66, - "ruleDescription": "Use Sub instead of Join", - "phase": "LINT" + "propertyPath": "Properties.RequiresCompatibilities", + "category": "Best Practice", + "startLine": 72, + "startColumn": 7, + "endLine": 72, + "endColumn": 30, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I1022", + "ruleId": "I9001", "severity": "INFO", - "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", - "source": "CFN_LINT", + "message": "Property 'TaskRoleArn' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "WatchmakerInstance", + "logicalId": "TestTaskDefinitionWithGetAtt", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.watchmaker-update.commands.10-watchmaker-update.command.Fn::Join.1.8.Fn::If.1.Fn::Join", - "category": "Intrinsic Function", - "startLine": 1298, - "startColumn": 57, - "endLine": 1298, - "endColumn": 66, - "ruleDescription": "Use Sub instead of Join", - "phase": "LINT" + "propertyPath": "Properties.TaskRoleArn", + "category": "Best Practice", + "startLine": 74, + "startColumn": 7, + "endLine": 74, + "endColumn": 18, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "GetAtt TestFargateTaskRole.Arn" + } }, { - "ruleId": "I1022", + "ruleId": "I9040", "severity": "INFO", - "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", - "source": "CFN_LINT", + "message": "Resource 'SsmParameter' of type 'AWS::SSM::Parameter' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "WatchmakerInstance", + "logicalId": "SsmParameter", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::SSM::Parameter" }, - "propertyPath": "Metadata.AWS::CloudFormation::Init.watchmaker-update.commands.10-watchmaker-update.command.Fn::Join.1.9.Fn::If.1.Fn::Join", - "category": "Intrinsic Function", - "startLine": 1316, - "startColumn": 57, - "endLine": 1316, - "endColumn": 66, - "ruleDescription": "Use Sub instead of Join", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 16, + "startColumn": 5, + "endLine": 16, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "I1022", + "ruleId": "I9040", "severity": "INFO", - "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", - "source": "CFN_LINT", + "message": "Resource 'DocDBCluster' of type 'AWS::DocDB::DBCluster' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "WatchmakerInstance", + "logicalId": "DocDBCluster", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::DocDB::DBCluster" }, - "propertyPath": "Properties.Tags.0.Value.Fn::Join", - "category": "Intrinsic Function", - "startLine": 1440, - "startColumn": 29, - "endLine": 1440, - "endColumn": 38, - "ruleDescription": "Use Sub instead of Join", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 23, + "startColumn": 5, + "endLine": 23, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "I1022", + "ruleId": "I9040", "severity": "INFO", - "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", - "source": "CFN_LINT", + "message": "Resource 'TestCluster' of type 'AWS::ECS::Cluster' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "WatchmakerInstance", + "logicalId": "TestCluster", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::ECS::Cluster" }, - "propertyPath": "Properties.UserData.Fn::Base64.Fn::Join.1.88.Fn::If.1.Fn::Join", - "category": "Intrinsic Function", - "startLine": 1596, - "startColumn": 45, - "endLine": 1596, - "endColumn": 54, - "ruleDescription": "Use Sub instead of Join", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 25, + "startColumn": 3, + "endLine": 25, + "endColumn": 14, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "I1022", + "ruleId": "I9040", "severity": "INFO", - "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", - "source": "CFN_LINT", + "message": "Resource 'TestFargateExecutionRole' of type 'AWS::IAM::Role' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "WatchmakerInstance", + "logicalId": "TestFargateExecutionRole", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.UserData.Fn::Base64.Fn::Join.1.89.Fn::If.1.Fn::Join", - "category": "Intrinsic Function", - "startLine": 1613, - "startColumn": 45, - "endLine": 1613, - "endColumn": 54, - "ruleDescription": "Use Sub instead of Join", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 29, + "startColumn": 5, + "endLine": 29, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "I1022", + "ruleId": "I9040", "severity": "INFO", - "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", - "source": "CFN_LINT", + "message": "Resource 'TestFargateTaskRole' of type 'AWS::IAM::Role' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "WatchmakerInstance", + "logicalId": "TestFargateTaskRole", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.UserData.Fn::Base64.Fn::Join.1.98.Fn::If.1.Fn::Join", - "category": "Intrinsic Function", - "startLine": 1642, - "startColumn": 45, - "endLine": 1642, - "endColumn": 54, - "ruleDescription": "Use Sub instead of Join", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 42, + "startColumn": 5, + "endLine": 42, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "I1022", + "ruleId": "I9040", "severity": "INFO", - "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", - "source": "CFN_LINT", + "message": "Resource 'TestLogGroup' of type 'AWS::Logs::LogGroup' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "WatchmakerInstance", + "logicalId": "TestLogGroup", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::Logs::LogGroup" }, - "propertyPath": "Properties.UserData.Fn::Base64.Fn::Join.1.99.Fn::If.1.Fn::Join", - "category": "Intrinsic Function", - "startLine": 1659, - "startColumn": 45, - "endLine": 1659, - "endColumn": 54, - "ruleDescription": "Use Sub instead of Join", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 50, + "startColumn": 3, + "endLine": 50, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "I1022", + "ruleId": "I9040", "severity": "INFO", - "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", - "source": "CFN_LINT", + "message": "Resource 'TestTaskDefinitionWithGetAtt' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "WatchmakerInstanceLogGroup", + "logicalId": "TestTaskDefinitionWithGetAtt", "entityType": "Resource", - "resourceType": "AWS::Logs::LogGroup" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.LogGroupName.Fn::Join", - "category": "Intrinsic Function", - "startLine": 1691, - "startColumn": 21, - "endLine": 1691, - "endColumn": 30, - "ruleDescription": "Use Sub instead of Join", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 56, + "startColumn": 5, + "endLine": 56, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "integration/metdata.yaml": { + "filePath": "integration/metdata.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 0, + "counts": { + "fatal": 1, + "errors": 0, + "warnings": 1, + "informational": 0, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I3011", - "severity": "INFO", - "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "ruleId": "F0001", + "severity": "FATAL", + "message": "Resources section must exist and be non-empty", + "source": "SCHEMA", + "category": "Structure", + "startLine": 21, + "startColumn": 1, + "endLine": 21, + "endColumn": 10, + "ruleDescription": "Resources section must exist and be non-empty", + "phase": "SCHEMA" + }, + { + "ruleId": "W2001", + "severity": "WARN", + "message": "Parameter 'VpcId' is not referenced anywhere in the template", "source": "CFN_LINT", "entity": { - "logicalId": "WatchmakerInstanceLogGroup", - "entityType": "Resource", - "resourceType": "AWS::Logs::LogGroup" + "logicalId": "VpcId", + "entityType": "Parameter" }, + "propertyPath": "Parameters/VpcId", "category": "Best Practice", - "startLine": 1687, - "startColumn": 9, - "endLine": 1687, - "endColumn": 36, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "startLine": 17, + "startColumn": 3, + "endLine": 17, + "endColumn": 8, + "ruleDescription": "Check if Parameters are Used", "phase": "LINT" + } + ] + }, + "integration/module-sub-resources.yaml": { + "filePath": "integration/module-sub-resources.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 0, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [] + }, + "integration/ref-no-value.yaml": { + "filePath": "integration/ref-no-value.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 5, + "counts": { + "fatal": 0, + "errors": 7, + "warnings": 0, + "informational": 2, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I3011", - "severity": "INFO", - "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "ruleId": "E3003", + "severity": "ERROR", + "message": "'Key' is a required property", "source": "CFN_LINT", "entity": { - "logicalId": "WatchmakerInstanceLogGroup", + "logicalId": "IamRole1", "entityType": "Resource", - "resourceType": "AWS::Logs::LogGroup" + "resourceType": "AWS::IAM::Role" }, - "category": "Best Practice", - "startLine": 1687, - "startColumn": 9, - "endLine": 1687, - "endColumn": 36, - "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "propertyPath": "Properties.Tags", + "suggestedFix": "Tag Key cannot be null or AWS::NoValue", + "category": "Resource", + "startLine": 11, + "startColumn": 7, + "endLine": 11, + "endColumn": 11, + "ruleDescription": "Required Resource properties are missing", "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'BlockDeviceMappings' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "E3003", + "severity": "ERROR", + "message": "'DefaultCacheBehavior' is a required property", + "source": "CFN_LINT", "entity": { - "logicalId": "WatchmakerInstance", + "logicalId": "CloudFront2", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::CloudFront::Distribution" }, - "propertyPath": "Properties.BlockDeviceMappings", - "category": "Best Practice", - "startLine": 1342, - "startColumn": 17, - "endLine": 1342, - "endColumn": 37, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only" - } + "propertyPath": "Properties.DistributionConfig", + "suggestedFix": "Add DefaultCacheBehavior to the Fn::If branch", + "category": "Resource", + "startLine": 43, + "startColumn": 7, + "endLine": 43, + "endColumn": 25, + "ruleDescription": "Required Resource properties are missing", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E3003", + "severity": "ERROR", + "message": "'TargetOriginId' is a required property", + "source": "CFN_LINT", "entity": { - "logicalId": "WatchmakerInstance", + "logicalId": "CloudFront2", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::CloudFront::Distribution" }, - "propertyPath": "Properties.ImageId", - "category": "Best Practice", - "startLine": 1398, - "startColumn": 17, - "endLine": 1398, - "endColumn": 25, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter 'AmiId' (type AWS::EC2::Image::Id)" - } + "propertyPath": "Properties.DistributionConfig.DefaultCacheBehavior.Fn::If.2", + "suggestedFix": "Add TargetOriginId to the DefaultCacheBehavior", + "category": "Resource", + "startLine": 49, + "startColumn": 13, + "endLine": 49, + "endColumn": 14, + "ruleDescription": "Required Resource properties are missing", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "E3003", + "severity": "ERROR", + "message": "'ViewerProtocolPolicy' is a required property", + "source": "CFN_LINT", "entity": { - "logicalId": "WatchmakerInstance", + "logicalId": "CloudFront2", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::CloudFront::Distribution" }, - "propertyPath": "Properties.InstanceType", - "category": "Best Practice", - "startLine": 1401, - "startColumn": 17, - "endLine": 1401, - "endColumn": 30, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only", - "resolutionSource": "parameter with AllowedValues" - } + "propertyPath": "Properties.DistributionConfig.DefaultCacheBehavior.Fn::If.2", + "suggestedFix": "Add ViewerProtocolPolicy to the DefaultCacheBehavior", + "category": "Resource", + "startLine": 49, + "startColumn": 13, + "endLine": 49, + "endColumn": 14, + "ruleDescription": "Required Resource properties are missing", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'KeyName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E3024", + "severity": "ERROR", + "message": "'Key' is a required property", + "source": "CFN_LINT", "entity": { - "logicalId": "WatchmakerInstance", + "logicalId": "IamRole1", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.KeyName", - "category": "Best Practice", - "startLine": 1404, - "startColumn": 17, - "endLine": 1404, - "endColumn": 25, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "parameter 'KeyPairName' (type AWS::EC2::KeyPair::KeyName)" - } + "propertyPath": "Properties.Tags", + "suggestedFix": "Tag Key cannot be null or AWS::NoValue", + "category": "Resource", + "startLine": 11, + "startColumn": 7, + "endLine": 11, + "endColumn": 11, + "ruleDescription": "Validate tag configuration", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'NetworkInterfaces' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E3530", + "severity": "ERROR", + "message": "'Statement' is a required property", + "source": "CFN_LINT", "entity": { - "logicalId": "WatchmakerInstance", + "logicalId": "IamRole1", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.NetworkInterfaces", - "category": "Best Practice", - "startLine": 1407, - "startColumn": 17, - "endLine": 1407, - "endColumn": 35, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "propertyPath": "Properties.AssumeRolePolicyDocument", + "suggestedFix": "Add a Statement array to the AssumeRolePolicyDocument", + "category": "Resource", + "startLine": 10, + "startColumn": 7, + "endLine": 10, + "endColumn": 31, + "ruleDescription": "Validate IAM trust policies", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", - "source": "ENGINE", + "ruleId": "E3530", + "severity": "ERROR", + "message": "'Statement' is a required property", + "source": "CFN_LINT", "entity": { - "logicalId": "WatchmakerInstance", + "logicalId": "IamRole3", "entityType": "Resource", - "resourceType": "AWS::EC2::Instance" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.UserData", - "category": "Best Practice", - "startLine": 1451, - "startColumn": 17, - "endLine": 1451, - "endColumn": 26, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "conditional-create-only", - "resolutionSource": "dynamic (Base64 with unresolvable argument)" - } + "propertyPath": "Properties.AssumeRolePolicyDocument", + "suggestedFix": "Add a Statement array to the AssumeRolePolicyDocument", + "category": "Resource", + "startLine": 30, + "startColumn": 7, + "endLine": 30, + "endColumn": 31, + "ruleDescription": "Validate IAM trust policies", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'LogGroupName' is create-only; updating it will cause resource replacement", + "message": "Resource 'IamRole3' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "WatchmakerInstanceLogGroup", + "logicalId": "IamRole3", "entityType": "Resource", - "resourceType": "AWS::Logs::LogGroup" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.LogGroupName", - "category": "Best Practice", - "startLine": 1690, - "startColumn": 17, - "endLine": 1690, - "endColumn": 30, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-logs.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9003", - "severity": "INFO", - "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", - "source": "ENGINE", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", + "startLine": 31, + "startColumn": 7, + "endLine": 31, + "endColumn": 11, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'WatchmakerInstanceLogGroup' of type 'AWS::Logs::LogGroup' supports Tags but none are configured", + "message": "Resource 'CloudFront2' of type 'AWS::CloudFront::Distribution' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "WatchmakerInstanceLogGroup", + "logicalId": "CloudFront2", "entityType": "Resource", - "resourceType": "AWS::Logs::LogGroup" + "resourceType": "AWS::CloudFront::Distribution" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1689, - "startColumn": 13, - "endLine": 1689, - "endColumn": 24, + "startLine": 42, + "startColumn": 5, + "endLine": 42, + "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "quickstart/cis_benchmark.yaml": { - "filePath": "quickstart/cis_benchmark.yaml", + "integration/ref-types.yaml": { + "filePath": "integration/ref-types.yaml", "status": "OK", "metadata": { - "resourcesScanned": 79, + "resourcesScanned": 13, "counts": { "fatal": 0, - "errors": 0, - "warnings": 75, - "informational": 142, + "errors": 1, + "warnings": 1, + "informational": 40, "debug": 0 }, "suppressed": 0, @@ -19179,1977 +13661,2188 @@ }, "diagnostics": [ { - "ruleId": "W2531", + "ruleId": "E1041", + "severity": "ERROR", + "message": "{'Ref': 'FargateTaskRole'} does not match destination format of 'AWS::EC2::VPC.Id'", + "source": "CFN_LINT", + "entity": { + "logicalId": "Subnet2", + "entityType": "Resource", + "resourceType": "AWS::EC2::Subnet" + }, + "propertyPath": "Properties.VpcId", + "suggestedFix": "Use a Ref to a resource whose type matches the expected format", + "category": "Intrinsic Function", + "startLine": 45, + "startColumn": 7, + "endLine": 45, + "endColumn": 12, + "ruleDescription": "Check if Ref matches destination format", + "phase": "LINT" + }, + { + "ruleId": "W3697", "severity": "WARN", - "message": "Runtime 'python3.8' was deprecated on '2024-10-14'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'python3.14'", + "message": "Resource type 'AWS::AutoScaling::LaunchConfiguration' is from a service in maintenance mode since 2024-10-01. Consider migrating to an alternative", "source": "CFN_LINT", "entity": { - "logicalId": "FunctiontForEvaluateCisBenchmarkingPreconditions", + "logicalId": "LaunchConfiguration", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::AutoScaling::LaunchConfiguration" }, - "propertyPath": "Properties.Runtime", "category": "Deprecation", - "startLine": 176, - "startColumn": 9, - "endLine": 176, + "startLine": 111, + "startColumn": 3, + "endLine": 111, + "endColumn": 22, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", + "ruleDescription": "Resource type is from a service in maintenance mode", + "phase": "SCHEMA" + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "Vpc", + "entityType": "Resource", + "resourceType": "AWS::EC2::VPC" + }, + "propertyPath": "Properties.CidrBlock", + "category": "Best Practice", + "startLine": 35, + "startColumn": 7, + "endLine": 35, "endColumn": 16, - "ruleDescription": "Check if EOL Lambda Function Runtimes are used", + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "actualValue": "python3.8", - "lifecycle": "deprecated" + "lifecycle": "create-only" } }, { - "ruleId": "W2531", - "severity": "WARN", - "message": "Runtime 'python3.8' was deprecated on '2024-10-14'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'python3.14'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "FunctionForEvaluateRootAccountRule", + "logicalId": "Subnet1", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 309, - "startColumn": 9, - "endLine": 309, + "propertyPath": "Properties.CidrBlock", + "category": "Best Practice", + "startLine": 39, + "startColumn": 7, + "endLine": 39, "endColumn": 16, - "ruleDescription": "Check if EOL Lambda Function Runtimes are used", + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "actualValue": "python3.8", - "lifecycle": "deprecated" + "lifecycle": "create-only" } }, { - "ruleId": "W2531", - "severity": "WARN", - "message": "Runtime 'python3.8' was deprecated on '2024-10-14'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'python3.14'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "FunctionForVpcFlowLogRule", + "logicalId": "Subnet1", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 481, - "startColumn": 9, - "endLine": 481, - "endColumn": 16, - "ruleDescription": "Check if EOL Lambda Function Runtimes are used", + "propertyPath": "Properties.VpcId", + "category": "Best Practice", + "startLine": 40, + "startColumn": 7, + "endLine": 40, + "endColumn": 12, + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "actualValue": "python3.8", - "lifecycle": "deprecated" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'Vpc'" } }, { - "ruleId": "W2531", - "severity": "WARN", - "message": "Runtime 'python3.8' was deprecated on '2024-10-14'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'python3.14'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "FunctionForVpcDefaultSecurityGroupsRule", + "logicalId": "Subnet2", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 551, - "startColumn": 9, - "endLine": 551, + "propertyPath": "Properties.CidrBlock", + "category": "Best Practice", + "startLine": 44, + "startColumn": 7, + "endLine": 44, "endColumn": 16, - "ruleDescription": "Check if EOL Lambda Function Runtimes are used", + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "actualValue": "python3.8", - "lifecycle": "deprecated" + "lifecycle": "create-only" } }, { - "ruleId": "W2531", - "severity": "WARN", - "message": "Runtime 'python3.8' was deprecated on '2024-10-14'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'python3.14'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "FunctionForRoleForMfaOnUsersRule", + "logicalId": "Subnet2", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::EC2::Subnet" + }, + "propertyPath": "Properties.VpcId", + "category": "Best Practice", + "startLine": 45, + "startColumn": 7, + "endLine": 45, + "endColumn": 12, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'FargateTaskRole'" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "SecurityGroup1", + "entityType": "Resource", + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 666, - "startColumn": 9, - "endLine": 666, - "endColumn": 16, - "ruleDescription": "Check if EOL Lambda Function Runtimes are used", + "propertyPath": "Properties.GroupDescription", + "category": "Best Practice", + "startLine": 49, + "startColumn": 7, + "endLine": 49, + "endColumn": 23, + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "actualValue": "python3.8", - "lifecycle": "deprecated" + "lifecycle": "create-only" } }, { - "ruleId": "W2531", - "severity": "WARN", - "message": "Runtime 'python3.8' was deprecated on '2024-10-14'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'python3.14'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "FunctionForEvaluatePolicyPermissionsRule", + "logicalId": "SecurityGroup1", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 760, - "startColumn": 9, - "endLine": 760, - "endColumn": 16, - "ruleDescription": "Check if EOL Lambda Function Runtimes are used", + "propertyPath": "Properties.VpcId", + "category": "Best Practice", + "startLine": 50, + "startColumn": 7, + "endLine": 50, + "endColumn": 12, + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "actualValue": "python3.8", - "lifecycle": "deprecated" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'Vpc'" } }, { - "ruleId": "W2531", - "severity": "WARN", - "message": "Runtime 'python3.8' was deprecated on '2024-10-14'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'python3.14'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "FunctionForEvaluateUserPolicyAssociationRule", + "logicalId": "SecurityGroup2", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 850, - "startColumn": 9, - "endLine": 850, - "endColumn": 16, - "ruleDescription": "Check if EOL Lambda Function Runtimes are used", + "propertyPath": "Properties.GroupDescription", + "category": "Best Practice", + "startLine": 54, + "startColumn": 7, + "endLine": 54, + "endColumn": 23, + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "actualValue": "python3.8", - "lifecycle": "deprecated" + "lifecycle": "create-only" } }, { - "ruleId": "W2531", - "severity": "WARN", - "message": "Runtime 'python3.8' was deprecated on '2024-10-14'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'python3.14'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Type' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "FunctionForEvaluateCloudTrailRule", + "logicalId": "LoadBalancer", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::ElasticLoadBalancingV2::LoadBalancer" }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 966, - "startColumn": 9, - "endLine": 966, - "endColumn": 16, - "ruleDescription": "Check if EOL Lambda Function Runtimes are used", + "propertyPath": "Properties.Type", + "category": "Best Practice", + "startLine": 58, + "startColumn": 7, + "endLine": 58, + "endColumn": 11, + "documentationUrl": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-loadbalancer.html", + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "actualValue": "python3.8", - "lifecycle": "deprecated" + "lifecycle": "create-only" } }, { - "ruleId": "W2531", - "severity": "WARN", - "message": "Runtime 'python3.8' was deprecated on '2024-10-14'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'python3.14'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Scheme' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "FunctionForEvaluateCloudTrailBucketRule", + "logicalId": "LoadBalancer", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::ElasticLoadBalancingV2::LoadBalancer" }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 1082, - "startColumn": 9, - "endLine": 1082, - "endColumn": 16, - "ruleDescription": "Check if EOL Lambda Function Runtimes are used", + "propertyPath": "Properties.Scheme", + "category": "Best Practice", + "startLine": 59, + "startColumn": 7, + "endLine": 59, + "endColumn": 13, + "documentationUrl": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-loadbalancer.html", + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "actualValue": "python3.8", - "lifecycle": "deprecated" + "lifecycle": "create-only" } }, { - "ruleId": "W2531", - "severity": "WARN", - "message": "Runtime 'python3.8' was deprecated on '2024-10-14'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'python3.14'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "FunctionForEvaluateCloudTrailLogIntegrityRule", + "logicalId": "TaskDefinitionWithRefToResource", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 1178, - "startColumn": 9, - "endLine": 1178, - "endColumn": 16, - "ruleDescription": "Check if EOL Lambda Function Runtimes are used", + "propertyPath": "Properties.ContainerDefinitions", + "category": "Best Practice", + "startLine": 72, + "startColumn": 7, + "endLine": 72, + "endColumn": 27, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "actualValue": "python3.8", - "lifecycle": "deprecated" + "lifecycle": "create-only" } }, { - "ruleId": "W2531", - "severity": "WARN", - "message": "Runtime 'python3.8' was deprecated on '2024-10-14'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'python3.14'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "FunctionForInstanceRoleUseRule", + "logicalId": "TaskDefinitionWithRefToResource", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 1260, - "startColumn": 9, - "endLine": 1260, - "endColumn": 16, - "ruleDescription": "Check if EOL Lambda Function Runtimes are used", + "propertyPath": "Properties.Cpu", + "category": "Best Practice", + "startLine": 83, + "startColumn": 7, + "endLine": 83, + "endColumn": 10, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "actualValue": "python3.8", - "lifecycle": "deprecated" + "lifecycle": "create-only" } }, { - "ruleId": "W2531", - "severity": "WARN", - "message": "Runtime 'python3.8' was deprecated on '2024-10-14'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'python3.14'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ExecutionRoleArn' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "FunctionForEvaluateKeyRotationRule", + "logicalId": "TaskDefinitionWithRefToResource", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 1357, - "startColumn": 9, - "endLine": 1357, - "endColumn": 16, - "ruleDescription": "Check if EOL Lambda Function Runtimes are used", + "propertyPath": "Properties.ExecutionRoleArn", + "category": "Best Practice", + "startLine": 84, + "startColumn": 7, + "endLine": 84, + "endColumn": 23, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "actualValue": "python3.8", - "lifecycle": "deprecated" + "lifecycle": "create-only", + "resolutionSource": "GetAtt FargateExecutionRole.Arn" } }, { - "ruleId": "W2531", - "severity": "WARN", - "message": "Runtime 'python3.8' was deprecated on '2024-10-14'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'python3.14'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Memory' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "FunctionForEvaluateConfigInAllRegionsRule", + "logicalId": "TaskDefinitionWithRefToResource", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 1465, - "startColumn": 9, - "endLine": 1465, - "endColumn": 16, - "ruleDescription": "Check if EOL Lambda Function Runtimes are used", + "propertyPath": "Properties.Memory", + "category": "Best Practice", + "startLine": 85, + "startColumn": 7, + "endLine": 85, + "endColumn": 13, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "actualValue": "python3.8", - "lifecycle": "deprecated" + "lifecycle": "create-only" } }, { - "ruleId": "W2531", - "severity": "WARN", - "message": "Runtime 'python3.8' was deprecated on '2024-10-14'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'python3.14'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "FunctionForVpcPeeringRouteTablesRule", + "logicalId": "TaskDefinitionWithRefToResource", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 1550, - "startColumn": 9, - "endLine": 1550, - "endColumn": 16, - "ruleDescription": "Check if EOL Lambda Function Runtimes are used", + "propertyPath": "Properties.NetworkMode", + "category": "Best Practice", + "startLine": 86, + "startColumn": 7, + "endLine": 86, + "endColumn": 18, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "actualValue": "python3.8", - "lifecycle": "deprecated" + "lifecycle": "create-only" } }, { - "ruleId": "W2531", - "severity": "WARN", - "message": "Runtime 'python3.8' was deprecated on '2024-10-14'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'python3.14'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "GetCloudTrailCloudWatchLog", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 1633, - "startColumn": 9, - "endLine": 1633, - "endColumn": 16, - "ruleDescription": "Check if EOL Lambda Function Runtimes are used", + "logicalId": "TaskDefinitionWithRefToResource", + "entityType": "Resource", + "resourceType": "AWS::ECS::TaskDefinition" + }, + "propertyPath": "Properties.RequiresCompatibilities", + "category": "Best Practice", + "startLine": 87, + "startColumn": 7, + "endLine": 87, + "endColumn": 30, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "actualValue": "python3.8", - "lifecycle": "deprecated" + "lifecycle": "create-only" } }, { - "ruleId": "W2531", - "severity": "WARN", - "message": "Runtime 'python3.8' was deprecated on '2024-10-14'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'python3.14'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'TaskRoleArn' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "FunctionToFormatCloudWatchEvent", + "logicalId": "TaskDefinitionWithRefToResource", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 1889, - "startColumn": 9, - "endLine": 1889, - "endColumn": 16, - "ruleDescription": "Check if EOL Lambda Function Runtimes are used", + "propertyPath": "Properties.TaskRoleArn", + "category": "Best Practice", + "startLine": 89, + "startColumn": 7, + "endLine": 89, + "endColumn": 18, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "actualValue": "python3.8", - "lifecycle": "deprecated" + "lifecycle": "create-only", + "resolutionSource": "GetAtt FargateTaskRole.Arn" } }, { - "ruleId": "W2531", - "severity": "WARN", - "message": "Runtime 'python3.8' was deprecated on '2024-10-14'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'python3.14'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ContainerDefinitions' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "FunctionToDisableUnusedCredentials", + "logicalId": "TaskDefinitionWithRefToParameter", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 2334, - "startColumn": 9, - "endLine": 2334, - "endColumn": 16, - "ruleDescription": "Check if EOL Lambda Function Runtimes are used", + "propertyPath": "Properties.ContainerDefinitions", + "category": "Best Practice", + "startLine": 93, + "startColumn": 7, + "endLine": 93, + "endColumn": 27, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "actualValue": "python3.8", - "lifecycle": "deprecated" + "lifecycle": "create-only" } }, { - "ruleId": "W3005", - "severity": "WARN", - "message": "'MasterConfigRole' dependency already enforced by a 'GetAtt' at 'Properties.Role'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Cpu' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "FunctiontForEvaluateCisBenchmarkingPreconditions", + "logicalId": "TaskDefinitionWithRefToParameter", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", + "propertyPath": "Properties.Cpu", "category": "Best Practice", - "startLine": 121, + "startLine": 104, "startColumn": 7, - "endLine": 121, - "endColumn": 16, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", - "phase": "LINT" + "endLine": 104, + "endColumn": 10, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W3005", - "severity": "WARN", - "message": "'FunctiontForEvaluateCisBenchmarkingPreconditions' dependency already enforced by a 'GetAtt' at 'Properties.ServiceToken'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ExecutionRoleArn' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ResourceForEvaluateCisBenchmarkingPreconditions", + "logicalId": "TaskDefinitionWithRefToParameter", "entityType": "Resource", - "resourceType": "Custom::ResourceForEvaluateCisBenchmarkingPreconditions" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", + "propertyPath": "Properties.ExecutionRoleArn", "category": "Best Practice", - "startLine": 181, + "startLine": 105, "startColumn": 7, - "endLine": 181, - "endColumn": 16, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", - "phase": "LINT" + "endLine": 105, + "endColumn": 23, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "GetAtt FargateExecutionRole.Arn" + } }, { - "ruleId": "W3005", - "severity": "WARN", - "message": "'MasterConfigRole' dependency already enforced by a 'GetAtt' at 'Properties.Role'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Memory' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "FunctionForEvaluateRootAccountRule", + "logicalId": "TaskDefinitionWithRefToParameter", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", + "propertyPath": "Properties.Memory", "category": "Best Practice", - "startLine": 227, + "startLine": 106, "startColumn": 7, - "endLine": 227, - "endColumn": 16, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", - "phase": "LINT" + "endLine": 106, + "endColumn": 13, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W3005", - "severity": "WARN", - "message": "'FunctionForEvaluateRootAccountRule' dependency already enforced by a 'GetAtt' at 'Properties.FunctionName'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'NetworkMode' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "EvaluateRootAccountFunctionPermission", + "logicalId": "TaskDefinitionWithRefToParameter", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", + "propertyPath": "Properties.NetworkMode", "category": "Best Practice", - "startLine": 315, + "startLine": 107, "startColumn": 7, - "endLine": 315, - "endColumn": 16, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", - "phase": "LINT" + "endLine": 107, + "endColumn": 18, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W3005", - "severity": "WARN", - "message": "'MasterConfigRole' dependency already enforced by a 'GetAtt' at 'Properties.Role'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'RequiresCompatibilities' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "FunctionForVpcFlowLogRule", + "logicalId": "TaskDefinitionWithRefToParameter", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", + "propertyPath": "Properties.RequiresCompatibilities", "category": "Best Practice", - "startLine": 421, + "startLine": 108, "startColumn": 7, - "endLine": 421, - "endColumn": 16, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", - "phase": "LINT" + "endLine": 108, + "endColumn": 30, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W3005", - "severity": "WARN", - "message": "'FunctionForVpcFlowLogRule' dependency already enforced by a 'GetAtt' at 'Properties.FunctionName'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'TaskRoleArn' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ConfigPermissionToCallVpcFlowLogLambda", + "logicalId": "TaskDefinitionWithRefToParameter", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", + "propertyPath": "Properties.TaskRoleArn", "category": "Best Practice", - "startLine": 486, + "startLine": 110, "startColumn": 7, - "endLine": 486, - "endColumn": 16, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", - "phase": "LINT" + "endLine": 110, + "endColumn": 18, + "documentationUrl": "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "GetAtt FargateTaskRole.Arn" + } }, { - "ruleId": "W3005", - "severity": "WARN", - "message": "'MasterConfigRole' dependency already enforced by a 'GetAtt' at 'Properties.Role'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "FunctionForVpcDefaultSecurityGroupsRule", + "logicalId": "LaunchConfiguration", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::AutoScaling::LaunchConfiguration" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", + "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 497, + "startLine": 114, "startColumn": 7, - "endLine": 497, - "endColumn": 16, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", - "phase": "LINT" + "endLine": 114, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W3005", - "severity": "WARN", - "message": "'FunctionForVpcDefaultSecurityGroupsRule' dependency already enforced by a 'GetAtt' at 'Properties.FunctionName'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'InstanceType' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ConfigPermissionToCallVpcDefaultSecurityGroupsLambda", + "logicalId": "LaunchConfiguration", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::AutoScaling::LaunchConfiguration" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", + "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 556, + "startLine": 115, "startColumn": 7, - "endLine": 556, - "endColumn": 16, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", - "phase": "LINT" + "endLine": 115, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W3005", - "severity": "WARN", - "message": "'FunctionForVpcDefaultSecurityGroupsRule' dependency already enforced by a 'GetAtt' at 'Properties.Source.SourceIdentifier'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'AssociatePublicIpAddress' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ConfigRuleForVpcDefaultSecurityGroupss", + "logicalId": "LaunchConfiguration", "entityType": "Resource", - "resourceType": "AWS::Config::ConfigRule" + "resourceType": "AWS::AutoScaling::LaunchConfiguration" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", + "propertyPath": "Properties.AssociatePublicIpAddress", "category": "Best Practice", - "startLine": 565, + "startLine": 116, "startColumn": 7, - "endLine": 565, - "endColumn": 16, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", - "phase": "LINT" + "endLine": 116, + "endColumn": 31, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W3005", - "severity": "WARN", - "message": "'FunctionForVpcFlowLogRule' dependency already enforced by a 'GetAtt' at 'Properties.Source.SourceIdentifier'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'SecurityGroups' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ConfigRuleForVpcFlowLogs", + "logicalId": "LaunchConfiguration", "entityType": "Resource", - "resourceType": "AWS::Config::ConfigRule" + "resourceType": "AWS::AutoScaling::LaunchConfiguration" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", + "propertyPath": "Properties.SecurityGroups", "category": "Best Practice", - "startLine": 584, + "startLine": 117, "startColumn": 7, - "endLine": 584, - "endColumn": 16, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", - "phase": "LINT" + "endLine": 117, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-autoscaling.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W3005", - "severity": "WARN", - "message": "'MasterConfigRole' dependency already enforced by a 'GetAtt' at 'Properties.Role'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Cluster' of type 'AWS::ECS::Cluster' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "FunctionForRoleForMfaOnUsersRule", + "logicalId": "Cluster", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::ECS::Cluster" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 606, - "startColumn": 7, - "endLine": 606, - "endColumn": 16, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "startLine": 7, + "startColumn": 3, + "endLine": 7, + "endColumn": 10, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "W3005", - "severity": "WARN", - "message": "'FunctionForRoleForMfaOnUsersRule' dependency already enforced by a 'GetAtt' at 'Properties.FunctionName'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'FargateExecutionRole' of type 'AWS::IAM::Role' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "ConfigPermissionToCallMfaForUsersLambda", + "logicalId": "FargateExecutionRole", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 671, - "startColumn": 7, - "endLine": 671, - "endColumn": 16, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "startLine": 11, + "startColumn": 5, + "endLine": 11, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "W3005", - "severity": "WARN", - "message": "'MasterConfigRole' dependency already enforced by a 'GetAtt' at 'Properties.Role'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'FargateTaskRole' of type 'AWS::IAM::Role' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "FunctionForEvaluatePolicyPermissionsRule", + "logicalId": "FargateTaskRole", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 699, - "startColumn": 7, - "endLine": 699, - "endColumn": 16, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "startLine": 24, + "startColumn": 5, + "endLine": 24, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "W3005", - "severity": "WARN", - "message": "'FunctionForEvaluatePolicyPermissionsRule' dependency already enforced by a 'GetAtt' at 'Properties.FunctionName'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Vpc' of type 'AWS::EC2::VPC' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "ConfigPermissionToCallEvaluatePolicyPermissionsLambda", + "logicalId": "Vpc", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::EC2::VPC" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 765, - "startColumn": 7, - "endLine": 765, - "endColumn": 16, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "startLine": 34, + "startColumn": 5, + "endLine": 34, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "W3005", - "severity": "WARN", - "message": "'FunctionForEvaluatePolicyPermissionsRule' dependency already enforced by a 'GetAtt' at 'Properties.Source.SourceIdentifier'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Subnet1' of type 'AWS::EC2::Subnet' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "ConfigRuleForEvaluatePolicyPermissions", + "logicalId": "Subnet1", "entityType": "Resource", - "resourceType": "AWS::Config::ConfigRule" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 773, - "startColumn": 7, - "endLine": 773, - "endColumn": 16, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "startLine": 38, + "startColumn": 5, + "endLine": 38, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "W3005", - "severity": "WARN", - "message": "'MasterConfigRole' dependency already enforced by a 'GetAtt' at 'Properties.Role'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Subnet2' of type 'AWS::EC2::Subnet' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "FunctionForEvaluateUserPolicyAssociationRule", + "logicalId": "Subnet2", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 795, - "startColumn": 7, - "endLine": 795, - "endColumn": 16, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "startLine": 43, + "startColumn": 5, + "endLine": 43, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "W3005", - "severity": "WARN", - "message": "'FunctionForEvaluateUserPolicyAssociationRule' dependency already enforced by a 'GetAtt' at 'Properties.FunctionName'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'SecurityGroup1' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "ConfigPermissionToCallEvaluateUserPolicyAssociationLambda", + "logicalId": "SecurityGroup1", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 855, - "startColumn": 7, - "endLine": 855, - "endColumn": 16, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "startLine": 48, + "startColumn": 5, + "endLine": 48, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "W3005", - "severity": "WARN", - "message": "'FunctionForEvaluateUserPolicyAssociationRule' dependency already enforced by a 'GetAtt' at 'Properties.Source.SourceIdentifier'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'SecurityGroup2' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "ConfigRuleForEvaluateUserPolicyAssociations", + "logicalId": "SecurityGroup2", "entityType": "Resource", - "resourceType": "AWS::Config::ConfigRule" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 863, - "startColumn": 7, - "endLine": 863, - "endColumn": 16, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "startLine": 53, + "startColumn": 5, + "endLine": 53, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "W3005", - "severity": "WARN", - "message": "'MasterConfigRole' dependency already enforced by a 'GetAtt' at 'Properties.Role'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'LoadBalancer' of type 'AWS::ElasticLoadBalancingV2::LoadBalancer' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "FunctionForEvaluateCloudTrailRule", + "logicalId": "LoadBalancer", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::ElasticLoadBalancingV2::LoadBalancer" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 886, - "startColumn": 7, - "endLine": 886, - "endColumn": 16, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "startLine": 57, + "startColumn": 5, + "endLine": 57, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "W3005", - "severity": "WARN", - "message": "'FunctionForEvaluateCloudTrailRule' dependency already enforced by a 'GetAtt' at 'Properties.FunctionName'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'LogGroup' of type 'AWS::Logs::LogGroup' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "ConfigPermissionToCallEvaluateCloudTrailLambda", + "logicalId": "LogGroup", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::Logs::LogGroup" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 971, - "startColumn": 7, - "endLine": 971, - "endColumn": 16, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "startLine": 65, + "startColumn": 3, + "endLine": 65, + "endColumn": 11, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "W3005", - "severity": "WARN", - "message": "'FunctionForEvaluateCloudTrailRule' dependency already enforced by a 'GetAtt' at 'Properties.Source.SourceIdentifier'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'TaskDefinitionWithRefToResource' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "ConfigRuleForEvaluateCloudTrail", + "logicalId": "TaskDefinitionWithRefToResource", "entityType": "Resource", - "resourceType": "AWS::Config::ConfigRule" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 979, - "startColumn": 7, - "endLine": 979, - "endColumn": 16, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "startLine": 71, + "startColumn": 5, + "endLine": 71, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "W3005", - "severity": "WARN", - "message": "'MasterConfigRole' dependency already enforced by a 'GetAtt' at 'Properties.Role'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'TaskDefinitionWithRefToParameter' of type 'AWS::ECS::TaskDefinition' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "FunctionForEvaluateCloudTrailBucketRule", + "logicalId": "TaskDefinitionWithRefToParameter", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::ECS::TaskDefinition" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 999, - "startColumn": 7, - "endLine": 999, - "endColumn": 16, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "startLine": 92, + "startColumn": 5, + "endLine": 92, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "integration/resources-cloudformation-init.yaml": { + "filePath": "integration/resources-cloudformation-init.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 2, + "informational": 2, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "W3005", + "ruleId": "W2509", "severity": "WARN", - "message": "'FunctionForEvaluateCloudTrailBucketRule' dependency already enforced by a 'GetAtt' at 'Properties.FunctionName'", - "source": "CFN_LINT", + "message": "Parameter 'DBPassword' appears to be a password but does not have NoEcho set to true", + "source": "ENGINE", "entity": { - "logicalId": "ConfigPermissionToCallEvaluateCloudTrailBucketLambda", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" - }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", - "category": "Best Practice", - "startLine": 1087, - "startColumn": 7, - "endLine": 1087, - "endColumn": 16, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "logicalId": "DBPassword", + "entityType": "Parameter" + }, + "propertyPath": "Parameters/DBPassword", + "category": "Security", + "startLine": 6, + "startColumn": 3, + "endLine": 6, + "endColumn": 13, + "ruleDescription": "Password parameter should have NoEcho", "phase": "LINT" }, { - "ruleId": "W3005", + "ruleId": "W9010", "severity": "WARN", - "message": "'FunctionForEvaluateCloudTrailBucketRule' dependency already enforced by a 'GetAtt' at 'Properties.Source.SourceIdentifier'", - "source": "CFN_LINT", + "message": "Hardcoded AMI ID - use a parameter or mapping for portability", + "source": "ENGINE", "entity": { - "logicalId": "ConfigRuleForEvaluateCloudTrailBucket", + "logicalId": "MyInstance", "entityType": "Resource", - "resourceType": "AWS::Config::ConfigRule" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", - "category": "Best Practice", - "startLine": 1095, + "propertyPath": "Properties.ImageId", + "category": "Security", + "startLine": 94, "startColumn": 7, - "endLine": 1095, - "endColumn": 16, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "endLine": 94, + "endColumn": 14, + "ruleDescription": "Hardcoded AMI ID", "phase": "LINT" }, { - "ruleId": "W3005", - "severity": "WARN", - "message": "'MasterConfigRole' dependency already enforced by a 'GetAtt' at 'Properties.Role'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "FunctionForEvaluateCloudTrailLogIntegrityRule", + "logicalId": "MyInstance", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", + "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 1116, + "startLine": 94, "startColumn": 7, - "endLine": 1116, - "endColumn": 16, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", - "phase": "LINT" + "endLine": 94, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W3005", - "severity": "WARN", - "message": "'FunctionForEvaluateCloudTrailLogIntegrityRule' dependency already enforced by a 'GetAtt' at 'Properties.FunctionName'", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'MyInstance' of type 'AWS::EC2::Instance' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "ConfigPermissionToCallEvaluateCloudTrailLogIntegrityLambda", + "logicalId": "MyInstance", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1184, - "startColumn": 7, - "endLine": 1184, - "endColumn": 16, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "startLine": 93, + "startColumn": 5, + "endLine": 93, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "issues/sam_w_conditions.yaml": { + "filePath": "issues/sam_w_conditions.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 17, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 37, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "W3005", - "severity": "WARN", - "message": "'FunctionForEvaluateCloudTrailLogIntegrityRule' dependency already enforced by a 'GetAtt' at 'Properties.Source.SourceIdentifier'", + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "ConfigRuleForEvaluateCloudTrailLogIntegrity", + "logicalId": "VmdEventsQueue", "entityType": "Resource", - "resourceType": "AWS::Config::ConfigRule" + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", "category": "Best Practice", - "startLine": 1193, - "startColumn": 7, - "endLine": 1193, - "endColumn": 16, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "startLine": 203, + "startColumn": 3, + "endLine": 203, + "endColumn": 17, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "W3005", - "severity": "WARN", - "message": "'MasterConfigRole' dependency already enforced by a 'GetAtt' at 'Properties.Role'", + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "FunctionForInstanceRoleUseRule", + "logicalId": "VmdEventsQueue", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", "category": "Best Practice", - "startLine": 1213, - "startColumn": 7, - "endLine": 1213, - "endColumn": 16, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "startLine": 203, + "startColumn": 3, + "endLine": 203, + "endColumn": 17, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "W3005", - "severity": "WARN", - "message": "'FunctionForInstanceRoleUseRule' dependency already enforced by a 'GetAtt' at 'Properties.FunctionName'", + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "ConfigPermissionToCallInstanceRoleUseLambda", + "logicalId": "VmdEventsDeadLetterQueue", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", "category": "Best Practice", - "startLine": 1266, - "startColumn": 7, - "endLine": 1266, - "endColumn": 16, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "startLine": 214, + "startColumn": 3, + "endLine": 214, + "endColumn": 27, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "W3005", - "severity": "WARN", - "message": "'FunctionForInstanceRoleUseRule' dependency already enforced by a 'GetAtt' at 'Properties.Source.SourceIdentifier'", + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "ConfigRuleForInstanceRoleUses", + "logicalId": "VmdEventsDeadLetterQueue", "entityType": "Resource", - "resourceType": "AWS::Config::ConfigRule" + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", "category": "Best Practice", - "startLine": 1275, - "startColumn": 7, - "endLine": 1275, - "endColumn": 16, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "startLine": 214, + "startColumn": 3, + "endLine": 214, + "endColumn": 27, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "W3005", - "severity": "WARN", - "message": "'MasterConfigRole' dependency already enforced by a 'GetAtt' at 'Properties.Role'", + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "FunctionForEvaluateKeyRotationRule", + "logicalId": "DmdEventsQueue", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", "category": "Best Practice", - "startLine": 1298, - "startColumn": 7, - "endLine": 1298, - "endColumn": 16, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "startLine": 328, + "startColumn": 3, + "endLine": 328, + "endColumn": 17, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "W3005", - "severity": "WARN", - "message": "'FunctionForEvaluateKeyRotationRule' dependency already enforced by a 'GetAtt' at 'Properties.FunctionName'", + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "ConfigPermissionToCallEvaluateKeyRotationLambda", + "logicalId": "DmdEventsQueue", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", "category": "Best Practice", - "startLine": 1363, - "startColumn": 7, - "endLine": 1363, - "endColumn": 16, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "startLine": 328, + "startColumn": 3, + "endLine": 328, + "endColumn": 17, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "W3005", - "severity": "WARN", - "message": "'FunctionForEvaluateKeyRotationRule' dependency already enforced by a 'GetAtt' at 'Properties.Source.SourceIdentifier'", + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "ConfigRuleForEvaluateKeyRotations", + "logicalId": "DmdEventsDeadLetterQueue", "entityType": "Resource", - "resourceType": "AWS::Config::ConfigRule" + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", "category": "Best Practice", - "startLine": 1372, - "startColumn": 7, - "endLine": 1372, - "endColumn": 16, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "startLine": 339, + "startColumn": 3, + "endLine": 339, + "endColumn": 27, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "W3005", - "severity": "WARN", - "message": "'MasterConfigRole' dependency already enforced by a 'GetAtt' at 'Properties.Role'", + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", "source": "CFN_LINT", "entity": { - "logicalId": "FunctionForEvaluateConfigInAllRegionsRule", + "logicalId": "DmdEventsDeadLetterQueue", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", "category": "Best Practice", - "startLine": 1394, - "startColumn": 7, - "endLine": 1394, - "endColumn": 16, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "startLine": 339, + "startColumn": 3, + "endLine": 339, + "endColumn": 27, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "W3005", - "severity": "WARN", - "message": "'FunctionForEvaluateConfigInAllRegionsRule' dependency already enforced by a 'GetAtt' at 'Properties.FunctionName'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ManagedPolicyName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "EvaluateConfigInAllRegionsFunctionPermission", + "logicalId": "DeniedPolicies", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::IAM::ManagedPolicy" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", + "propertyPath": "Properties.ManagedPolicyName", "category": "Best Practice", - "startLine": 1470, + "startLine": 118, "startColumn": 7, - "endLine": 1470, - "endColumn": 16, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", - "phase": "LINT" + "endLine": 118, + "endColumn": 24, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "dynamic (Sub:${GlobalPrefix}-${ComponentShortName}-DeniedPolicies-${TenantAwsResource})" + } }, { - "ruleId": "W3005", - "severity": "WARN", - "message": "'MasterConfigRole' dependency already enforced by a 'GetAtt' at 'Properties.Role'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Description' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "FunctionForVpcPeeringRouteTablesRule", + "logicalId": "DeniedPolicies", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::IAM::ManagedPolicy" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", + "propertyPath": "Properties.Description", "category": "Best Practice", - "startLine": 1499, + "startLine": 119, "startColumn": 7, - "endLine": 1499, - "endColumn": 16, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", - "phase": "LINT" + "endLine": 119, + "endColumn": 18, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W3005", - "severity": "WARN", - "message": "'FunctionForVpcPeeringRouteTablesRule' dependency already enforced by a 'GetAtt' at 'Properties.FunctionName'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Path' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ConfigPermissionToCallVpcPeeringRouteTablesLambda", + "logicalId": "DeniedPolicies", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::IAM::ManagedPolicy" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", + "propertyPath": "Properties.Path", "category": "Best Practice", - "startLine": 1555, + "startLine": 120, "startColumn": 7, - "endLine": 1555, - "endColumn": 16, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", - "phase": "LINT" + "endLine": 120, + "endColumn": 11, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W3005", - "severity": "WARN", - "message": "'FunctionForVpcPeeringRouteTablesRule' dependency already enforced by a 'GetAtt' at 'Properties.Source.SourceIdentifier'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ManagedPolicyName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ConfigRuleForVpcPeeringRouteTabless", + "logicalId": "LogMonitoringPolicy", "entityType": "Resource", - "resourceType": "AWS::Config::ConfigRule" + "resourceType": "AWS::IAM::ManagedPolicy" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", + "propertyPath": "Properties.ManagedPolicyName", "category": "Best Practice", - "startLine": 1564, + "startLine": 138, "startColumn": 7, - "endLine": 1564, - "endColumn": 16, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", - "phase": "LINT" + "endLine": 138, + "endColumn": 24, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "dynamic (Sub:${GlobalPrefix}-${ComponentShortName}-LogMonitoringPolicy-${TenantAwsResource})" + } }, { - "ruleId": "W3005", - "severity": "WARN", - "message": "'MasterConfigRole' dependency already enforced by a 'GetAtt' at 'Properties.Role'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Description' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "GetCloudTrailCloudWatchLog", + "logicalId": "LogMonitoringPolicy", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::IAM::ManagedPolicy" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", + "propertyPath": "Properties.Description", "category": "Best Practice", - "startLine": 1601, + "startLine": 139, "startColumn": 7, - "endLine": 1601, - "endColumn": 16, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", - "phase": "LINT" + "endLine": 139, + "endColumn": 18, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W3005", - "severity": "WARN", - "message": "'GetCloudTrailCloudWatchLog' dependency already enforced by a 'GetAtt' at 'Properties.ServiceToken'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Path' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ResourceForGetCloudTrailCloudWatchLog", + "logicalId": "LogMonitoringPolicy", "entityType": "Resource", - "resourceType": "Custom::ResourceForGetCloudTrailCloudWatchLog" + "resourceType": "AWS::IAM::ManagedPolicy" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", + "propertyPath": "Properties.Path", "category": "Best Practice", - "startLine": 1638, + "startLine": 140, "startColumn": 7, - "endLine": 1638, - "endColumn": 16, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", - "phase": "LINT" + "endLine": 140, + "endColumn": 11, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W3005", - "severity": "WARN", - "message": "'ResourceForGetCloudTrailCloudWatchLog' dependency already enforced by a 'GetAtt' at 'Properties.LogGroupName'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Description' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "UnauthorizedAttemptsCloudWatchFilter", + "logicalId": "TenantInfoReadPolicy", "entityType": "Resource", - "resourceType": "AWS::Logs::MetricFilter" + "resourceType": "AWS::IAM::ManagedPolicy" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", + "propertyPath": "Properties.Description", "category": "Best Practice", - "startLine": 1647, + "startLine": 154, "startColumn": 7, - "endLine": 1647, - "endColumn": 16, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", - "phase": "LINT" + "endLine": 154, + "endColumn": 18, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W3005", - "severity": "WARN", - "message": "'ResourceForGetCloudTrailCloudWatchLog' dependency already enforced by a 'GetAtt' at 'Properties.LogGroupName'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'QueueName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "IAMRootActivityCloudWatchMetric", + "logicalId": "VmdEventsQueue", "entityType": "Resource", - "resourceType": "AWS::Logs::MetricFilter" + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", + "propertyPath": "Properties.QueueName", "category": "Best Practice", - "startLine": 1681, + "startLine": 207, "startColumn": 7, - "endLine": 1681, + "endLine": 207, "endColumn": 16, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", - "phase": "LINT" + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sqs.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "dynamic (Sub:${Solution}-${Environment}-${ComponentShortName}-VmdEventsQueue-${TenantAwsResource}.fifo)" + } }, { - "ruleId": "W3005", - "severity": "WARN", - "message": "'ResourceForGetCloudTrailCloudWatchLog' dependency already enforced by a 'GetAtt' at 'Properties.LogGroupName'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'FifoQueue' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ConsoleSigninWithoutMfaCloudWatchMetric", + "logicalId": "VmdEventsQueue", "entityType": "Resource", - "resourceType": "AWS::Logs::MetricFilter" + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", + "propertyPath": "Properties.FifoQueue", "category": "Best Practice", - "startLine": 1718, + "startLine": 209, "startColumn": 7, - "endLine": 1718, + "endLine": 209, "endColumn": 16, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", - "phase": "LINT" + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sqs.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W3005", - "severity": "WARN", - "message": "'ResourceForGetCloudTrailCloudWatchLog' dependency already enforced by a 'GetAtt' at 'Properties.LogGroupName'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'QueueName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ConsoleLoginFailureCloudWatchMetric", + "logicalId": "VmdEventsDeadLetterQueue", "entityType": "Resource", - "resourceType": "AWS::Logs::MetricFilter" + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", + "propertyPath": "Properties.QueueName", "category": "Best Practice", - "startLine": 1757, + "startLine": 218, "startColumn": 7, - "endLine": 1757, + "endLine": 218, "endColumn": 16, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", - "phase": "LINT" + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sqs.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "dynamic (Sub:${Solution}-${Environment}-${ComponentShortName}-VmdEventsDeadLetterQueue-${TenantAwsResource}.fifo)" + } }, { - "ruleId": "W3005", - "severity": "WARN", - "message": "'ResourceForGetCloudTrailCloudWatchLog' dependency already enforced by a 'GetAtt' at 'Properties.LogGroupName'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'FifoQueue' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "KMSCustomerKeyDeletionCloudWatchMetric", + "logicalId": "VmdEventsDeadLetterQueue", "entityType": "Resource", - "resourceType": "AWS::Logs::MetricFilter" + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", + "propertyPath": "Properties.FifoQueue", "category": "Best Practice", - "startLine": 1794, + "startLine": 220, "startColumn": 7, - "endLine": 1794, + "endLine": 220, "endColumn": 16, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", - "phase": "LINT" + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sqs.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W3005", - "severity": "WARN", - "message": "'SnsTopicForCloudWatchEvents' dependency already enforced by a 'Ref' at 'Properties.Policies.0.PolicyDocument.Statement.0.Resource'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Protocol' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "RoleForCloudWatchEvents", + "logicalId": "VmdEventsSubscription", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::SNS::Subscription" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", + "propertyPath": "Properties.Protocol", "category": "Best Practice", - "startLine": 1830, + "startLine": 265, "startColumn": 7, - "endLine": 1830, - "endColumn": 16, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", - "phase": "LINT" + "endLine": 265, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sns", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W3005", - "severity": "WARN", - "message": "'RoleForCloudWatchEvents' dependency already enforced by a 'GetAtt' at 'Properties.Role'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Endpoint' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "FunctionToFormatCloudWatchEvent", + "logicalId": "VmdEventsSubscription", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::SNS::Subscription" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", + "propertyPath": "Properties.Endpoint", "category": "Best Practice", - "startLine": 1856, + "startLine": 266, "startColumn": 7, - "endLine": 1856, - "endColumn": 16, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", - "phase": "LINT" + "endLine": 266, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sns", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "GetAtt VmdEventsQueue.Arn" + } }, { - "ruleId": "W3005", - "severity": "WARN", - "message": "'SnsTopicForCloudWatchEvents' dependency already enforced by a 'Ref' at 'Properties.Code.ZipFile'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Region' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "FunctionToFormatCloudWatchEvent", + "logicalId": "VmdEventsSubscription", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::SNS::Subscription" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", + "propertyPath": "Properties.Region", "category": "Best Practice", - "startLine": 1856, + "startLine": 267, "startColumn": 7, - "endLine": 1856, - "endColumn": 16, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", - "phase": "LINT" + "endLine": 267, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sns", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only", + "resolutionSource": "parameter 'VmdEventsSourceRegion' (type String)" + } }, { - "ruleId": "W3005", - "severity": "WARN", - "message": "'FunctionToFormatCloudWatchEvent' dependency already enforced by a 'GetAtt' at 'Properties.FunctionName'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'TopicArn' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "LambdaPermissionForCloudTrailCloudWatchEventRules", + "logicalId": "VmdEventsSubscription", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::SNS::Subscription" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", + "propertyPath": "Properties.TopicArn", "category": "Best Practice", - "startLine": 1894, + "startLine": 268, "startColumn": 7, - "endLine": 1894, - "endColumn": 16, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", - "phase": "LINT" + "endLine": 268, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sns", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "parameter 'VmdEventsSourceArn' (type String)" + } }, { - "ruleId": "W3005", - "severity": "WARN", - "message": "'ResourceForGetCloudTrailCloudWatchLog' dependency already enforced by a 'GetAtt' at 'Properties.LogGroupName'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'QueueName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "BillingChangesCloudWatchFilter", + "logicalId": "DmdEventsQueue", "entityType": "Resource", - "resourceType": "AWS::Logs::MetricFilter" + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", + "propertyPath": "Properties.QueueName", "category": "Best Practice", - "startLine": 2183, + "startLine": 332, "startColumn": 7, - "endLine": 2183, + "endLine": 332, "endColumn": 16, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", - "phase": "LINT" + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sqs.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "dynamic (Sub:${Solution}-${Environment}-${ComponentShortName}-DmdEventsQueue-${TenantAwsResource}.fifo)" + } }, { - "ruleId": "W3005", - "severity": "WARN", - "message": "'RoleForDisableUnusedCredentialsFunction' dependency already enforced by a 'GetAtt' at 'Properties.Role'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'FifoQueue' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "FunctionToDisableUnusedCredentials", + "logicalId": "DmdEventsQueue", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", + "propertyPath": "Properties.FifoQueue", "category": "Best Practice", - "startLine": 2253, + "startLine": 334, "startColumn": 7, - "endLine": 2253, + "endLine": 334, "endColumn": 16, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", - "phase": "LINT" + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sqs.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W3005", - "severity": "WARN", - "message": "'FunctionToDisableUnusedCredentials' dependency already enforced by a 'GetAtt' at 'Properties.FunctionName'", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'QueueName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "LambdaPermissionForDisableUnusedCredentials", + "logicalId": "DmdEventsDeadLetterQueue", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", + "propertyPath": "Properties.QueueName", "category": "Best Practice", - "startLine": 2339, + "startLine": 343, "startColumn": 7, - "endLine": 2339, + "endLine": 343, "endColumn": 16, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", - "phase": "LINT" + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sqs.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "dynamic (Sub:${Solution}-${Environment}-${ComponentShortName}-DmdEventsDeadLetterQueue-${TenantAwsResource}.fifo)" + } }, { - "ruleId": "W9003", - "severity": "WARN", - "message": "1 is not of type 'string' - automatically coerced (number to string)", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'FifoQueue' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "UnauthorizedAttemptsCloudWatchFilter", + "logicalId": "DmdEventsDeadLetterQueue", "entityType": "Resource", - "resourceType": "AWS::Logs::MetricFilter" + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Properties.MetricTransformations.0.MetricValue", + "propertyPath": "Properties.FifoQueue", "category": "Best Practice", - "startLine": 1657, - "startColumn": 13, - "endLine": 1657, - "endColumn": 24, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-logs.git", - "ruleDescription": "Property type coercion warning", - "phase": "SCHEMA" + "startLine": 345, + "startColumn": 7, + "endLine": 345, + "endColumn": 16, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sqs.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W9003", - "severity": "WARN", - "message": "1 is not of type 'string' - automatically coerced (number to string)", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Protocol' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "IAMRootActivityCloudWatchMetric", + "logicalId": "DmdEventsSubscription", "entityType": "Resource", - "resourceType": "AWS::Logs::MetricFilter" + "resourceType": "AWS::SNS::Subscription" }, - "propertyPath": "Properties.MetricTransformations.0.MetricValue", + "propertyPath": "Properties.Protocol", "category": "Best Practice", - "startLine": 1695, - "startColumn": 13, - "endLine": 1695, - "endColumn": 24, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-logs.git", - "ruleDescription": "Property type coercion warning", - "phase": "SCHEMA" + "startLine": 390, + "startColumn": 7, + "endLine": 390, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sns", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W9003", - "severity": "WARN", - "message": "1 is not of type 'string' - automatically coerced (number to string)", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Endpoint' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ConsoleSigninWithoutMfaCloudWatchMetric", + "logicalId": "DmdEventsSubscription", "entityType": "Resource", - "resourceType": "AWS::Logs::MetricFilter" + "resourceType": "AWS::SNS::Subscription" }, - "propertyPath": "Properties.MetricTransformations.0.MetricValue", + "propertyPath": "Properties.Endpoint", "category": "Best Practice", - "startLine": 1733, - "startColumn": 13, - "endLine": 1733, - "endColumn": 24, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-logs.git", - "ruleDescription": "Property type coercion warning", - "phase": "SCHEMA" + "startLine": 391, + "startColumn": 7, + "endLine": 391, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sns", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "GetAtt DmdEventsQueue.Arn" + } }, { - "ruleId": "W9003", - "severity": "WARN", - "message": "1 is not of type 'string' - automatically coerced (number to string)", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Region' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "ConsoleLoginFailureCloudWatchMetric", + "logicalId": "DmdEventsSubscription", "entityType": "Resource", - "resourceType": "AWS::Logs::MetricFilter" + "resourceType": "AWS::SNS::Subscription" }, - "propertyPath": "Properties.MetricTransformations.0.MetricValue", + "propertyPath": "Properties.Region", "category": "Best Practice", - "startLine": 1770, - "startColumn": 13, - "endLine": 1770, - "endColumn": 24, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-logs.git", - "ruleDescription": "Property type coercion warning", - "phase": "SCHEMA" + "startLine": 392, + "startColumn": 7, + "endLine": 392, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sns", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only", + "resolutionSource": "parameter 'DmdEventsSourceRegion' (type String)" + } }, { - "ruleId": "W9003", - "severity": "WARN", - "message": "1 is not of type 'string' - automatically coerced (number to string)", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'TopicArn' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "KMSCustomerKeyDeletionCloudWatchMetric", + "logicalId": "DmdEventsSubscription", "entityType": "Resource", - "resourceType": "AWS::Logs::MetricFilter" + "resourceType": "AWS::SNS::Subscription" }, - "propertyPath": "Properties.MetricTransformations.0.MetricValue", + "propertyPath": "Properties.TopicArn", "category": "Best Practice", - "startLine": 1807, - "startColumn": 13, - "endLine": 1807, - "endColumn": 24, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-logs.git", - "ruleDescription": "Property type coercion warning", - "phase": "SCHEMA" + "startLine": 393, + "startColumn": 7, + "endLine": 393, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sns", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "parameter 'DmdEventsSourceArn' (type String)" + } }, { - "ruleId": "W9003", - "severity": "WARN", - "message": "1 is not of type 'string' - automatically coerced (number to string)", - "source": "CFN_LINT", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'VmdEventsLambda' of type 'AWS::Serverless::Function' supports Tags but none are configured", + "source": "ENGINE", "entity": { - "logicalId": "BillingChangesCloudWatchFilter", + "logicalId": "VmdEventsLambda", "entityType": "Resource", - "resourceType": "AWS::Logs::MetricFilter" + "resourceType": "AWS::Serverless::Function" }, - "propertyPath": "Properties.MetricTransformations.0.MetricValue", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 2197, - "startColumn": 13, - "endLine": 2197, - "endColumn": 24, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-logs.git", - "ruleDescription": "Property type coercion warning", - "phase": "SCHEMA" + "startLine": 171, + "startColumn": 5, + "endLine": 171, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "message": "Resource 'VmdEventsQueue' of type 'AWS::SQS::Queue' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "FunctiontForEvaluateCisBenchmarkingPreconditions", + "logicalId": "VmdEventsQueue", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Properties.FunctionName", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 124, - "startColumn": 9, - "endLine": 124, - "endColumn": 21, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 206, + "startColumn": 5, + "endLine": 206, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'ConfigRuleName' is create-only; updating it will cause resource replacement", + "message": "Resource 'VmdEventsLambdaErrorsGreaterThanZeroAlarm' of type 'AWS::CloudWatch::Alarm' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ConfigRuleForIamPasswordPolicy", + "logicalId": "VmdEventsLambdaErrorsGreaterThanZeroAlarm", "entityType": "Resource", - "resourceType": "AWS::Config::ConfigRule" + "resourceType": "AWS::CloudWatch::Alarm" }, - "propertyPath": "Properties.ConfigRuleName", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 202, - "startColumn": 9, - "endLine": 202, - "endColumn": 23, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-config.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 274, + "startColumn": 5, + "endLine": 274, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "message": "Resource 'DmdEventsLambda' of type 'AWS::Serverless::Function' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "FunctionForEvaluateRootAccountRule", + "logicalId": "DmdEventsLambda", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::Serverless::Function" }, - "propertyPath": "Properties.FunctionName", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 231, - "startColumn": 9, - "endLine": 231, - "endColumn": 21, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 296, + "startColumn": 5, + "endLine": 296, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "message": "Resource 'DmdEventsQueue' of type 'AWS::SQS::Queue' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "EvaluateRootAccountFunctionPermission", + "logicalId": "DmdEventsQueue", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::SQS::Queue" }, - "propertyPath": "Properties.FunctionName", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 317, - "startColumn": 9, - "endLine": 317, - "endColumn": 21, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt FunctionForEvaluateRootAccountRule.Arn" - } + "startLine": 331, + "startColumn": 5, + "endLine": 331, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Action' is create-only; updating it will cause resource replacement", + "message": "Resource 'DmdEventsLambdaErrorsGreaterThanZeroAlarm' of type 'AWS::CloudWatch::Alarm' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "EvaluateRootAccountFunctionPermission", + "logicalId": "DmdEventsLambdaErrorsGreaterThanZeroAlarm", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::CloudWatch::Alarm" }, - "propertyPath": "Properties.Action", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 318, - "startColumn": 9, - "endLine": 318, + "startLine": 399, + "startColumn": 5, + "endLine": 399, "endColumn": 15, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "lsp/comprehensive.json": { + "filePath": "lsp/comprehensive.json", + "status": "OK", + "metadata": { + "resourcesScanned": 12, + "counts": { + "fatal": 4, + "errors": 1, + "warnings": 8, + "informational": 29, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Principal' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "F3003", + "severity": "FATAL", + "message": "'MaxSize' is a required property", + "source": "SCHEMA", "entity": { - "logicalId": "EvaluateRootAccountFunctionPermission", + "logicalId": "AutoScalingGroup", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::AutoScaling::AutoScalingGroup" }, - "propertyPath": "Properties.Principal", - "category": "Best Practice", - "startLine": 319, - "startColumn": 9, - "endLine": 319, + "propertyPath": "Properties", + "suggestedFix": "Add the required property 'MaxSize'", + "category": "Schema", + "startLine": 564, + "startColumn": 7, + "endLine": 564, "endColumn": 18, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "ruleDescription": "Required property missing", + "phase": "SCHEMA" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ConfigRuleName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "F3003", + "severity": "FATAL", + "message": "'MinSize' is a required property", + "source": "SCHEMA", "entity": { - "logicalId": "ConfigRuleForEvaluateRootAccount", + "logicalId": "AutoScalingGroup", "entityType": "Resource", - "resourceType": "AWS::Config::ConfigRule" + "resourceType": "AWS::AutoScaling::AutoScalingGroup" }, - "propertyPath": "Properties.ConfigRuleName", - "category": "Best Practice", - "startLine": 328, - "startColumn": 9, - "endLine": 328, - "endColumn": 23, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-config.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "propertyPath": "Properties", + "suggestedFix": "Add the required property 'MinSize'", + "category": "Schema", + "startLine": 564, + "startColumn": 7, + "endLine": 564, + "endColumn": 18, + "ruleDescription": "Required property missing", + "phase": "SCHEMA" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ConfigRuleName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "F6101", + "severity": "FATAL", + "message": "Fn::Sub variable '${MaxScaling}' does not reference a valid resource, parameter, or pseudo-parameter", + "source": "SCHEMA", + "entity": { + "logicalId": "ComplexOutput", + "entityType": "Output" + }, + "propertyPath": "Outputs/ComplexOutput/Value.Fn::Sub", + "category": "Structure", + "startLine": 943, + "startColumn": 5, + "endLine": 943, + "endColumn": 19, + "ruleDescription": "Output value must be a string", + "phase": "SCHEMA" + }, + { + "ruleId": "F8611", + "severity": "FATAL", + "message": "'Fn::FindInMap' is not supported in the Rules section - allowed: ['Ref', 'Fn::ValueOf', 'Fn::ValueOfAll', 'Fn::RefAll', 'Fn::Contains', 'Fn::EachMemberEquals', 'Fn::EachMemberIn', 'Fn::Equals', 'Fn::And', 'Fn::Or', 'Fn::Not', 'Fn::If', 'Fn::Select']", + "source": "SCHEMA", + "entity": { + "logicalId": "ValidateRegionAndEnvironment", + "entityType": "Rule" + }, + "propertyPath": "Rules/ValidateRegionAndEnvironment", + "category": "Structure", + "startLine": 197, + "startColumn": 5, + "endLine": 197, + "endColumn": 34, + "ruleDescription": "Disallowed function in Rules section", + "phase": "PARSE" + }, + { + "ruleId": "E9006", + "severity": "ERROR", + "message": "'8.0' is not one of ['5.5.62', '5.6.51', '5.7.33', '5.7.34', '5.7.36', '5.7.37', '5.7.38', '5.7.39', '5.7.40', '5.7.41', '5.7.42', '5.7.43', '5.7.44', '5.7.44-rds.20240408', '5.7.44-rds.20240529', '5.7.44-rds.20240808', '5.7.44-rds.20250103', '5.7.44-rds.20250213', '5.7.44-rds.20250508', '5.7.44-rds.20250818', '5.7.44-rds.20251212', '5.7.44-rds.20260212', '5.7.44-rds.20260521', '5.7.44-rds.20260624', '5.7.44-rds.20260902', '8.0.11', '8.0.13', '8.0.15', '8.0.16', '8.0.17', '8.0.19', '8.0.20', '8.0.21', '8.0.23', '8.0.25', '8.0.26', '8.0.27', '8.0.28', '8.0.29', '8.0.30', '8.0.31', '8.0.32', '8.0.33', '8.0.34', '8.0.35', '8.0.36', '8.0.37', '8.0.39', '8.0.40', '8.0.41', '8.0.42', '8.0.43', '8.0.44', '8.0.45', '8.0.46', '8.0.46-rds.20260624', '8.0.46-rds.20260908', '8.4.10', '8.4.11', '8.4.3', '8.4.4', '8.4.5', '8.4.6', '8.4.7', '8.4.8', '8.4.9']", + "source": "CFN_LINT", "entity": { - "logicalId": "ConfigRuleForRequiredTags", + "logicalId": "Database", "entityType": "Resource", - "resourceType": "AWS::Config::ConfigRule" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.ConfigRuleName", - "category": "Best Practice", - "startLine": 342, + "propertyPath": "Properties.EngineVersion", + "category": "Schema", + "startLine": 647, "startColumn": 9, - "endLine": 342, + "endLine": 647, "endColumn": 23, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-config.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Property value not valid for conditional extension enum", + "phase": "SCHEMA" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ConfigRuleName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W1011", + "severity": "WARN", + "message": "Use dynamic references (e.g., SSM SecureString) instead of parameter 'DatabasePassword' for secrets", + "source": "CFN_LINT", "entity": { - "logicalId": "ConfigRuleForEncryptedVolumes", + "logicalId": "Database", "entityType": "Resource", - "resourceType": "AWS::Config::ConfigRule" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.ConfigRuleName", - "category": "Best Practice", - "startLine": 373, + "propertyPath": "Properties.MasterUserPassword", + "category": "Security", + "startLine": 664, "startColumn": 9, - "endLine": 373, - "endColumn": 23, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-config.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "endLine": 664, + "endColumn": 28, + "ruleDescription": "Instead of REFing a parameter for a secret use a dynamic reference", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ConfigRuleName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W1028", + "severity": "WARN", + "message": "['Fn::If', 2] is not reachable. When setting condition 'IsProduction' to False from current status True", + "source": "CFN_LINT", "entity": { - "logicalId": "ConfigRuleForRestrictedSsh", - "entityType": "Resource", - "resourceType": "AWS::Config::ConfigRule" + "logicalId": "ConditionalOutput", + "entityType": "Output" }, - "propertyPath": "Properties.ConfigRuleName", + "propertyPath": "Outputs/ConditionalOutput/Value.Fn::If.2", "category": "Best Practice", - "startLine": 389, - "startColumn": 9, - "endLine": 389, + "startLine": 996, + "startColumn": 5, + "endLine": 996, "endColumn": 23, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-config.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "ruleDescription": "Check Fn::If has a path that cannot be reached", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ConfigRuleName' is create-only; updating it will cause resource replacement", + "ruleId": "W2508", + "severity": "WARN", + "message": "Security group allows 0.0.0.0/0 access to sensitive port 22 (range 22-22)", "source": "ENGINE", "entity": { - "logicalId": "ConfigRuleForUnrestrictedPorts", + "logicalId": "BastionSecurityGroup", "entityType": "Resource", - "resourceType": "AWS::Config::ConfigRule" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.ConfigRuleName", - "category": "Best Practice", - "startLine": 405, + "propertyPath": "Properties.SecurityGroupIngress", + "suggestedFix": "Restrict the CIDR range to specific IP addresses", + "category": "Security", + "startLine": 495, "startColumn": 9, - "endLine": 405, - "endColumn": 23, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-config.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "endLine": 495, + "endColumn": 30, + "ruleDescription": "Security group allows open access to sensitive port", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W2531", + "severity": "WARN", + "message": "Runtime 'python3.9' was deprecated on '2025-12-15'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'python3.14'", + "source": "CFN_LINT", "entity": { - "logicalId": "FunctionForVpcFlowLogRule", + "logicalId": "LambdaFunction", "entityType": "Resource", "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.FunctionName", - "category": "Best Practice", - "startLine": 425, + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 738, "startColumn": 9, - "endLine": 425, - "endColumn": 21, - "ruleDescription": "Create-only property updated triggers resource replacement", + "endLine": 738, + "endColumn": 17, + "ruleDescription": "Check if EOL Lambda Function Runtimes are used", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "actualValue": "python3.9", + "lifecycle": "deprecated" } }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W8001", + "severity": "WARN", + "message": "Condition 'IsNotProduction' is not used by any resource or Fn::If", + "source": "CFN_LINT", "entity": { - "logicalId": "ConfigPermissionToCallVpcFlowLogLambda", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "logicalId": "IsNotProduction", + "entityType": "Condition" }, - "propertyPath": "Properties.FunctionName", + "propertyPath": "Conditions/IsNotProduction", "category": "Best Practice", - "startLine": 488, - "startColumn": 9, - "endLine": 488, + "startLine": 125, + "startColumn": 5, + "endLine": 125, "endColumn": 21, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt FunctionForVpcFlowLogRule.Arn" - } + "ruleDescription": "Check if Conditions are Used", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Action' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W8001", + "severity": "WARN", + "message": "Condition 'ComplexCondition' is not used by any resource or Fn::If", + "source": "CFN_LINT", "entity": { - "logicalId": "ConfigPermissionToCallVpcFlowLogLambda", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "logicalId": "ComplexCondition", + "entityType": "Condition" }, - "propertyPath": "Properties.Action", + "propertyPath": "Conditions/ComplexCondition", "category": "Best Practice", - "startLine": 489, - "startColumn": 9, - "endLine": 489, - "endColumn": 15, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 155, + "startColumn": 5, + "endLine": 155, + "endColumn": 22, + "ruleDescription": "Check if Conditions are Used", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Principal' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W9003", + "severity": "WARN", + "message": "100 (from Fn::If on condition 'IsProduction') is not of type 'string' - automatically coerced (number to string)", + "source": "CFN_LINT", "entity": { - "logicalId": "ConfigPermissionToCallVpcFlowLogLambda", + "logicalId": "Database", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Principal", + "propertyPath": "Properties.AllocatedStorage", "category": "Best Practice", - "startLine": 490, + "startLine": 648, "startColumn": 9, - "endLine": 490, - "endColumn": 18, - "ruleDescription": "Create-only property updated triggers resource replacement", + "endLine": 648, + "endColumn": 26, + "conditionScenario": { + "IsProduction": true + }, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Property type coercion warning", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "resolutionSource": "Fn::If on condition 'IsProduction'" } }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "ruleId": "W9008", + "severity": "WARN", + "message": "RDS instance should have StorageEncrypted set to true", "source": "ENGINE", "entity": { - "logicalId": "FunctionForVpcDefaultSecurityGroupsRule", + "logicalId": "Database", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.FunctionName", - "category": "Best Practice", - "startLine": 501, + "propertyPath": "Properties.StorageEncrypted", + "suggestedFix": "Set StorageEncrypted to true", + "category": "Security", + "startLine": 656, "startColumn": 9, - "endLine": 501, - "endColumn": 21, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "endLine": 656, + "endColumn": 26, + "ruleDescription": "RDS instance should have StorageEncrypted", + "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConfigPermissionToCallVpcDefaultSecurityGroupsLambda", + "logicalId": "VPC", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::EC2::VPC" }, - "propertyPath": "Properties.FunctionName", + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 558, + "startLine": 362, "startColumn": 9, - "endLine": 558, - "endColumn": 21, + "endLine": 362, + "endColumn": 19, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt FunctionForVpcDefaultSecurityGroupsRule.Arn" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Action' is create-only; updating it will cause resource replacement", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConfigPermissionToCallVpcDefaultSecurityGroupsLambda", + "logicalId": "PublicSubnet", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.Action", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 559, + "startLine": 390, "startColumn": 9, - "endLine": 559, + "endLine": 390, "endColumn": 15, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'VPC'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Principal' is create-only; updating it will cause resource replacement", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConfigPermissionToCallVpcDefaultSecurityGroupsLambda", + "logicalId": "PublicSubnet", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.Principal", + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 560, + "startLine": 393, "startColumn": 9, - "endLine": 560, - "endColumn": 18, + "endLine": 393, + "endColumn": 19, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -21159,43 +15852,42 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ConfigRuleName' is create-only; updating it will cause resource replacement", + "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConfigRuleForVpcDefaultSecurityGroupss", + "logicalId": "PublicSubnet", "entityType": "Resource", - "resourceType": "AWS::Config::ConfigRule" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.ConfigRuleName", + "propertyPath": "Properties.AvailabilityZone", "category": "Best Practice", - "startLine": 569, + "startLine": 401, "startColumn": 9, - "endLine": 569, - "endColumn": 23, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-config.git", + "endLine": 401, + "endColumn": 26, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "dynamic (Select with unresolvable arguments)" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ConfigRuleName' is create-only; updating it will cause resource replacement", + "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConfigRuleForVpcFlowLogs", + "logicalId": "WebSecurityGroup", "entityType": "Resource", - "resourceType": "AWS::Config::ConfigRule" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.ConfigRuleName", + "propertyPath": "Properties.GroupDescription", "category": "Best Practice", - "startLine": 588, + "startLine": 443, "startColumn": 9, - "endLine": 588, - "endColumn": 23, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-config.git", + "endLine": 443, + "endColumn": 26, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -21205,243 +15897,249 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FunctionForRoleForMfaOnUsersRule", + "logicalId": "WebSecurityGroup", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.FunctionName", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 610, + "startLine": 444, "startColumn": 9, - "endLine": 610, - "endColumn": 21, + "endLine": 444, + "endColumn": 15, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'VPC'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConfigPermissionToCallMfaForUsersLambda", + "logicalId": "BastionSecurityGroup", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.FunctionName", + "propertyPath": "Properties.GroupDescription", "category": "Best Practice", - "startLine": 673, + "startLine": 491, "startColumn": 9, - "endLine": 673, - "endColumn": 21, + "endLine": 491, + "endColumn": 26, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt FunctionForRoleForMfaOnUsersRule.Arn" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Action' is create-only; updating it will cause resource replacement", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConfigPermissionToCallMfaForUsersLambda", + "logicalId": "BastionSecurityGroup", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.Action", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 674, + "startLine": 492, "startColumn": 9, - "endLine": 674, + "endLine": 492, "endColumn": 15, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'VPC'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Principal' is create-only; updating it will cause resource replacement", + "message": "Property 'LaunchTemplateName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConfigPermissionToCallMfaForUsersLambda", + "logicalId": "LaunchTemplate", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::EC2::LaunchTemplate" }, - "propertyPath": "Properties.Principal", + "propertyPath": "Properties.LaunchTemplateName", "category": "Best Practice", - "startLine": 675, + "startLine": 508, "startColumn": 9, - "endLine": 675, - "endColumn": 18, + "endLine": 508, + "endColumn": 28, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "parameter with AllowedValues" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ConfigRuleName' is create-only; updating it will cause resource replacement", + "message": "Property 'AutoScalingGroupName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConfigRuleForMfaForUsers", + "logicalId": "AutoScalingGroup", "entityType": "Resource", - "resourceType": "AWS::Config::ConfigRule" + "resourceType": "AWS::AutoScaling::AutoScalingGroup" }, - "propertyPath": "Properties.ConfigRuleName", + "propertyPath": "Properties.AutoScalingGroupName", "category": "Best Practice", - "startLine": 681, + "startLine": 565, "startColumn": 9, - "endLine": 681, - "endColumn": 23, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-config.git", + "endLine": 565, + "endColumn": 30, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "parameter with AllowedValues" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "message": "Property 'LaunchTemplate' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FunctionForEvaluatePolicyPermissionsRule", + "logicalId": "AutoScalingGroup", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::AutoScaling::AutoScalingGroup" }, - "propertyPath": "Properties.FunctionName", + "propertyPath": "Properties.LaunchTemplate", "category": "Best Practice", - "startLine": 703, + "startLine": 568, "startColumn": 9, - "endLine": 703, - "endColumn": 21, + "endLine": 568, + "endColumn": 24, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "message": "Property 'VPCZoneIdentifier' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConfigPermissionToCallEvaluatePolicyPermissionsLambda", + "logicalId": "AutoScalingGroup", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::AutoScaling::AutoScalingGroup" }, - "propertyPath": "Properties.FunctionName", + "propertyPath": "Properties.VPCZoneIdentifier", "category": "Best Practice", - "startLine": 767, + "startLine": 582, "startColumn": 9, - "endLine": 767, - "endColumn": 21, + "endLine": 582, + "endColumn": 27, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt FunctionForEvaluatePolicyPermissionsRule.Arn" + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Action' is create-only; updating it will cause resource replacement", + "message": "Property 'DBInstanceIdentifier' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConfigPermissionToCallEvaluatePolicyPermissionsLambda", + "logicalId": "Database", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Action", + "propertyPath": "Properties.DBInstanceIdentifier", "category": "Best Practice", - "startLine": 768, + "startLine": 634, "startColumn": 9, - "endLine": 768, - "endColumn": 15, + "endLine": 634, + "endColumn": 30, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "parameter with AllowedValues" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Principal' is create-only; updating it will cause resource replacement", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConfigPermissionToCallEvaluatePolicyPermissionsLambda", + "logicalId": "Database", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Principal", + "propertyPath": "Properties.Engine", "category": "Best Practice", - "startLine": 769, + "startLine": 646, "startColumn": 9, - "endLine": 769, - "endColumn": 18, + "endLine": 646, + "endColumn": 16, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ConfigRuleName' is create-only; updating it will cause resource replacement", + "message": "Property 'StorageEncrypted' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConfigRuleForEvaluatePolicyPermissions", + "logicalId": "Database", "entityType": "Resource", - "resourceType": "AWS::Config::ConfigRule" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.ConfigRuleName", + "propertyPath": "Properties.StorageEncrypted", "category": "Best Practice", - "startLine": 777, + "startLine": 656, "startColumn": 9, - "endLine": 777, - "endColumn": 23, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-config.git", + "endLine": 656, + "endColumn": 26, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "Fn::If on condition 'IsProduction'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "message": "Property 'MasterUsername' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FunctionForEvaluateUserPolicyAssociationRule", + "logicalId": "Database", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.FunctionName", + "propertyPath": "Properties.MasterUsername", "category": "Best Practice", - "startLine": 799, + "startLine": 663, "startColumn": 9, - "endLine": 799, - "endColumn": 21, + "endLine": 663, + "endColumn": 24, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -21451,64 +16149,67 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "message": "Property 'BackupRetentionPeriod' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConfigPermissionToCallEvaluateUserPolicyAssociationLambda", + "logicalId": "Database", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.FunctionName", + "propertyPath": "Properties.BackupRetentionPeriod", "category": "Best Practice", - "startLine": 857, + "startLine": 672, "startColumn": 9, - "endLine": 857, - "endColumn": 21, + "endLine": 672, + "endColumn": 31, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt FunctionForEvaluateUserPolicyAssociationRule.Arn" + "lifecycle": "conditional-create-only", + "resolutionSource": "Fn::If on condition 'IsProduction'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Action' is create-only; updating it will cause resource replacement", + "message": "Property 'MultiAZ' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConfigPermissionToCallEvaluateUserPolicyAssociationLambda", + "logicalId": "Database", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Action", + "propertyPath": "Properties.MultiAZ", "category": "Best Practice", - "startLine": 858, + "startLine": 679, "startColumn": 9, - "endLine": 858, - "endColumn": 15, + "endLine": 679, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only", + "resolutionSource": "dynamic (condition reference: IsProduction)" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Principal' is create-only; updating it will cause resource replacement", + "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConfigPermissionToCallEvaluateUserPolicyAssociationLambda", + "logicalId": "DatabaseSecurityGroup", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.Principal", + "propertyPath": "Properties.GroupDescription", "category": "Best Practice", - "startLine": 859, + "startLine": 716, "startColumn": 9, - "endLine": 859, - "endColumn": 18, + "endLine": 716, + "endColumn": 26, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -21518,24 +16219,24 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ConfigRuleName' is create-only; updating it will cause resource replacement", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConfigRuleForEvaluateUserPolicyAssociations", + "logicalId": "DatabaseSecurityGroup", "entityType": "Resource", - "resourceType": "AWS::Config::ConfigRule" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.ConfigRuleName", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 867, + "startLine": 717, "startColumn": 9, - "endLine": 867, - "endColumn": 23, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-config.git", + "endLine": 717, + "endColumn": 15, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'VPC'" } }, { @@ -21544,464 +16245,505 @@ "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FunctionForEvaluateCloudTrailRule", + "logicalId": "LambdaFunction", "entityType": "Resource", "resourceType": "AWS::Lambda::Function" }, "propertyPath": "Properties.FunctionName", "category": "Best Practice", - "startLine": 890, + "startLine": 735, "startColumn": 9, - "endLine": 890, - "endColumn": 21, + "endLine": 735, + "endColumn": 22, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "parameter with AllowedValues" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "message": "Property 'RoleName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConfigPermissionToCallEvaluateCloudTrailLambda", + "logicalId": "LambdaRole", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.FunctionName", + "propertyPath": "Properties.RoleName", "category": "Best Practice", - "startLine": 973, + "startLine": 802, "startColumn": 9, - "endLine": 973, - "endColumn": 21, + "endLine": 802, + "endColumn": 18, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "GetAtt FunctionForEvaluateCloudTrailRule.Arn" + "resolutionSource": "parameter with AllowedValues" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Action' is create-only; updating it will cause resource replacement", + "message": "Property 'AlarmName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConfigPermissionToCallEvaluateCloudTrailLambda", + "logicalId": "DatabaseAlarm", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::CloudWatch::Alarm" }, - "propertyPath": "Properties.Action", + "propertyPath": "Properties.AlarmName", "category": "Best Practice", - "startLine": 974, + "startLine": 846, "startColumn": 9, - "endLine": 974, - "endColumn": 15, + "endLine": 846, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-cloudwatch.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "parameter with AllowedValues" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Principal' is create-only; updating it will cause resource replacement", + "message": "Property 'TopicName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConfigPermissionToCallEvaluateCloudTrailLambda", + "logicalId": "SNSTopic", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.Principal", + "propertyPath": "Properties.TopicName", "category": "Best Practice", - "startLine": 975, + "startLine": 877, "startColumn": 9, - "endLine": 975, - "endColumn": 18, + "endLine": 877, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sns", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "parameter with AllowedValues" } }, { - "ruleId": "I9001", + "ruleId": "I9003", + "severity": "INFO", + "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", + "source": "ENGINE", + "category": "Best Practice", + "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", + "phase": "LINT" + }, + { + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'ConfigRuleName' is create-only; updating it will cause resource replacement", + "message": "Resource 'BastionSecurityGroup' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ConfigRuleForEvaluateCloudTrail", + "logicalId": "BastionSecurityGroup", "entityType": "Resource", - "resourceType": "AWS::Config::ConfigRule" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.ConfigRuleName", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 983, - "startColumn": 9, - "endLine": 983, - "endColumn": 23, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-config.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 490, + "startColumn": 7, + "endLine": 490, + "endColumn": 18, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "message": "Resource 'DatabaseSecurityGroup' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "FunctionForEvaluateCloudTrailBucketRule", + "logicalId": "DatabaseSecurityGroup", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.FunctionName", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1003, - "startColumn": 9, - "endLine": 1003, - "endColumn": 21, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 715, + "startColumn": 7, + "endLine": 715, + "endColumn": 18, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "message": "Resource 'LambdaRole' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ConfigPermissionToCallEvaluateCloudTrailBucketLambda", + "logicalId": "LambdaRole", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.FunctionName", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1089, - "startColumn": 9, - "endLine": 1089, - "endColumn": 21, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt FunctionForEvaluateCloudTrailBucketRule.Arn" - } + "startLine": 801, + "startColumn": 7, + "endLine": 801, + "endColumn": 18, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Action' is create-only; updating it will cause resource replacement", + "message": "Resource 'DatabaseAlarm' of type 'AWS::CloudWatch::Alarm' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ConfigPermissionToCallEvaluateCloudTrailBucketLambda", + "logicalId": "DatabaseAlarm", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::CloudWatch::Alarm" }, - "propertyPath": "Properties.Action", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1090, - "startColumn": 9, - "endLine": 1090, + "startLine": 845, + "startColumn": 7, + "endLine": 845, + "endColumn": 18, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "lsp/comprehensive.yaml": { + "filePath": "lsp/comprehensive.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 12, + "counts": { + "fatal": 4, + "errors": 1, + "warnings": 10, + "informational": 29, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "F3003", + "severity": "FATAL", + "message": "'MaxSize' is a required property", + "source": "SCHEMA", + "entity": { + "logicalId": "AutoScalingGroup", + "entityType": "Resource", + "resourceType": "AWS::AutoScaling::AutoScalingGroup" + }, + "propertyPath": "Properties", + "suggestedFix": "Add the required property 'MaxSize'", + "category": "Schema", + "startLine": 236, + "startColumn": 5, + "endLine": 236, + "endColumn": 15, + "ruleDescription": "Required property missing", + "phase": "SCHEMA" + }, + { + "ruleId": "F3003", + "severity": "FATAL", + "message": "'MinSize' is a required property", + "source": "SCHEMA", + "entity": { + "logicalId": "AutoScalingGroup", + "entityType": "Resource", + "resourceType": "AWS::AutoScaling::AutoScalingGroup" + }, + "propertyPath": "Properties", + "suggestedFix": "Add the required property 'MinSize'", + "category": "Schema", + "startLine": 236, + "startColumn": 5, + "endLine": 236, "endColumn": 15, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "ruleDescription": "Required property missing", + "phase": "SCHEMA" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Principal' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "F6101", + "severity": "FATAL", + "message": "Fn::Sub variable '${MaxScaling}' does not reference a valid resource, parameter, or pseudo-parameter", + "source": "SCHEMA", "entity": { - "logicalId": "ConfigPermissionToCallEvaluateCloudTrailBucketLambda", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "logicalId": "ComplexOutput", + "entityType": "Output" }, - "propertyPath": "Properties.Principal", - "category": "Best Practice", - "startLine": 1091, - "startColumn": 9, - "endLine": 1091, - "endColumn": 18, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "propertyPath": "Outputs/ComplexOutput/Value.Fn::Sub", + "category": "Structure", + "startLine": 421, + "startColumn": 3, + "endLine": 421, + "endColumn": 16, + "ruleDescription": "Output value must be a string", + "phase": "SCHEMA" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ConfigRuleName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "F8611", + "severity": "FATAL", + "message": "'Fn::FindInMap' is not supported in the Rules section - allowed: ['Ref', 'Fn::ValueOf', 'Fn::ValueOfAll', 'Fn::RefAll', 'Fn::Contains', 'Fn::EachMemberEquals', 'Fn::EachMemberIn', 'Fn::Equals', 'Fn::And', 'Fn::Or', 'Fn::Not', 'Fn::If', 'Fn::Select']", + "source": "SCHEMA", "entity": { - "logicalId": "ConfigRuleForEvaluateCloudTrailBucket", - "entityType": "Resource", - "resourceType": "AWS::Config::ConfigRule" + "logicalId": "ValidateRegionAndEnvironment", + "entityType": "Rule" }, - "propertyPath": "Properties.ConfigRuleName", - "category": "Best Practice", - "startLine": 1099, - "startColumn": 9, - "endLine": 1099, - "endColumn": 23, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-config.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "propertyPath": "Rules/ValidateRegionAndEnvironment", + "category": "Structure", + "startLine": 110, + "startColumn": 3, + "endLine": 110, + "endColumn": 31, + "ruleDescription": "Disallowed function in Rules section", + "phase": "PARSE" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E9006", + "severity": "ERROR", + "message": "'8.0' is not one of ['5.5.62', '5.6.51', '5.7.33', '5.7.34', '5.7.36', '5.7.37', '5.7.38', '5.7.39', '5.7.40', '5.7.41', '5.7.42', '5.7.43', '5.7.44', '5.7.44-rds.20240408', '5.7.44-rds.20240529', '5.7.44-rds.20240808', '5.7.44-rds.20250103', '5.7.44-rds.20250213', '5.7.44-rds.20250508', '5.7.44-rds.20250818', '5.7.44-rds.20251212', '5.7.44-rds.20260212', '5.7.44-rds.20260521', '5.7.44-rds.20260624', '5.7.44-rds.20260902', '8.0.11', '8.0.13', '8.0.15', '8.0.16', '8.0.17', '8.0.19', '8.0.20', '8.0.21', '8.0.23', '8.0.25', '8.0.26', '8.0.27', '8.0.28', '8.0.29', '8.0.30', '8.0.31', '8.0.32', '8.0.33', '8.0.34', '8.0.35', '8.0.36', '8.0.37', '8.0.39', '8.0.40', '8.0.41', '8.0.42', '8.0.43', '8.0.44', '8.0.45', '8.0.46', '8.0.46-rds.20260624', '8.0.46-rds.20260908', '8.4.10', '8.4.11', '8.4.3', '8.4.4', '8.4.5', '8.4.6', '8.4.7', '8.4.8', '8.4.9']", + "source": "CFN_LINT", "entity": { - "logicalId": "FunctionForEvaluateCloudTrailLogIntegrityRule", + "logicalId": "Database", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.FunctionName", - "category": "Best Practice", - "startLine": 1120, - "startColumn": 9, - "endLine": 1120, - "endColumn": 21, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "propertyPath": "Properties.EngineVersion", + "category": "Schema", + "startLine": 271, + "startColumn": 7, + "endLine": 271, + "endColumn": 20, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Property value not valid for conditional extension enum", + "phase": "SCHEMA" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W1011", + "severity": "WARN", + "message": "Use dynamic references (e.g., SSM SecureString) instead of parameter 'DatabasePassword' for secrets", + "source": "CFN_LINT", "entity": { - "logicalId": "ConfigPermissionToCallEvaluateCloudTrailLogIntegrityLambda", + "logicalId": "Database", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.FunctionName", - "category": "Best Practice", - "startLine": 1186, - "startColumn": 9, - "endLine": 1186, - "endColumn": 21, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt FunctionForEvaluateCloudTrailLogIntegrityRule.Arn" - } + "propertyPath": "Properties.MasterUserPassword", + "category": "Security", + "startLine": 276, + "startColumn": 7, + "endLine": 276, + "endColumn": 25, + "ruleDescription": "Instead of REFing a parameter for a secret use a dynamic reference", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Action' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W1028", + "severity": "WARN", + "message": "['Fn::If', 2] is not reachable. When setting condition 'IsProduction' to False from current status True", + "source": "CFN_LINT", "entity": { - "logicalId": "ConfigPermissionToCallEvaluateCloudTrailLogIntegrityLambda", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "logicalId": "ConditionalOutput", + "entityType": "Output" }, - "propertyPath": "Properties.Action", + "propertyPath": "Outputs/ConditionalOutput/Value.Fn::If.2", "category": "Best Practice", - "startLine": 1187, - "startColumn": 9, - "endLine": 1187, - "endColumn": 15, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 442, + "startColumn": 3, + "endLine": 442, + "endColumn": 20, + "ruleDescription": "Check Fn::If has a path that cannot be reached", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Principal' is create-only; updating it will cause resource replacement", + "ruleId": "W1103", + "severity": "WARN", + "message": "'!Implies' is not a supported function", + "source": "ENGINE", + "category": "Intrinsic Function", + "ruleDescription": "Unknown intrinsic function name", + "phase": "PARSE" + }, + { + "ruleId": "W2508", + "severity": "WARN", + "message": "Security group allows 0.0.0.0/0 access to sensitive port 22 (range 22-22)", "source": "ENGINE", "entity": { - "logicalId": "ConfigPermissionToCallEvaluateCloudTrailLogIntegrityLambda", + "logicalId": "BastionSecurityGroup", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.Principal", - "category": "Best Practice", - "startLine": 1188, - "startColumn": 9, - "endLine": 1188, - "endColumn": 18, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "propertyPath": "Properties.SecurityGroupIngress", + "suggestedFix": "Restrict the CIDR range to specific IP addresses", + "category": "Security", + "startLine": 206, + "startColumn": 7, + "endLine": 206, + "endColumn": 27, + "ruleDescription": "Security group allows open access to sensitive port", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ConfigRuleName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W2531", + "severity": "WARN", + "message": "Runtime 'python3.9' was deprecated on '2025-12-15'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'python3.14'", + "source": "CFN_LINT", "entity": { - "logicalId": "ConfigRuleForEvaluateCloudTrailLogIntegrity", + "logicalId": "LambdaFunction", "entityType": "Resource", - "resourceType": "AWS::Config::ConfigRule" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.ConfigRuleName", - "category": "Best Practice", - "startLine": 1197, - "startColumn": 9, - "endLine": 1197, - "endColumn": 23, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-config.git", - "ruleDescription": "Create-only property updated triggers resource replacement", + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 306, + "startColumn": 7, + "endLine": 306, + "endColumn": 14, + "ruleDescription": "Check if EOL Lambda Function Runtimes are used", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "actualValue": "python3.9", + "lifecycle": "deprecated" } }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W8001", + "severity": "WARN", + "message": "Condition 'IsNotProduction' is not used by any resource or Fn::If", + "source": "CFN_LINT", "entity": { - "logicalId": "FunctionForInstanceRoleUseRule", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "logicalId": "IsNotProduction", + "entityType": "Condition" }, - "propertyPath": "Properties.FunctionName", + "propertyPath": "Conditions/IsNotProduction", "category": "Best Practice", - "startLine": 1217, - "startColumn": 9, - "endLine": 1217, - "endColumn": 21, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 93, + "startColumn": 3, + "endLine": 93, + "endColumn": 18, + "ruleDescription": "Check if Conditions are Used", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W8001", + "severity": "WARN", + "message": "Condition 'ComplexCondition' is not used by any resource or Fn::If", + "source": "CFN_LINT", "entity": { - "logicalId": "ConfigPermissionToCallInstanceRoleUseLambda", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "logicalId": "ComplexCondition", + "entityType": "Condition" }, - "propertyPath": "Properties.FunctionName", + "propertyPath": "Conditions/ComplexCondition", "category": "Best Practice", - "startLine": 1268, - "startColumn": 9, - "endLine": 1268, - "endColumn": 21, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt FunctionForInstanceRoleUseRule.Arn" - } + "startLine": 101, + "startColumn": 3, + "endLine": 101, + "endColumn": 19, + "ruleDescription": "Check if Conditions are Used", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Action' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W9003", + "severity": "WARN", + "message": "-1 is not of type 'string' - automatically coerced (number to string)", + "source": "CFN_LINT", "entity": { - "logicalId": "ConfigPermissionToCallInstanceRoleUseLambda", + "logicalId": "WebSecurityGroup", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.Action", + "propertyPath": "Properties.SecurityGroupEgress.0.IpProtocol", "category": "Best Practice", - "startLine": 1269, - "startColumn": 9, - "endLine": 1269, - "endColumn": 15, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 195, + "startColumn": 11, + "endLine": 195, + "endColumn": 21, + "ruleDescription": "Property type coercion warning", + "phase": "SCHEMA" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Principal' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W9003", + "severity": "WARN", + "message": "100 (from Fn::If on condition 'IsProduction') is not of type 'string' - automatically coerced (number to string)", + "source": "CFN_LINT", "entity": { - "logicalId": "ConfigPermissionToCallInstanceRoleUseLambda", + "logicalId": "Database", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Principal", + "propertyPath": "Properties.AllocatedStorage", "category": "Best Practice", - "startLine": 1270, - "startColumn": 9, - "endLine": 1270, - "endColumn": 18, - "ruleDescription": "Create-only property updated triggers resource replacement", + "startLine": 272, + "startColumn": 7, + "endLine": 272, + "endColumn": 23, + "conditionScenario": { + "IsProduction": true + }, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Property type coercion warning", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "resolutionSource": "Fn::If on condition 'IsProduction'" } }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'ConfigRuleName' is create-only; updating it will cause resource replacement", + "ruleId": "W9008", + "severity": "WARN", + "message": "RDS instance should have StorageEncrypted set to true", "source": "ENGINE", "entity": { - "logicalId": "ConfigRuleForInstanceRoleUses", + "logicalId": "Database", "entityType": "Resource", - "resourceType": "AWS::Config::ConfigRule" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.ConfigRuleName", - "category": "Best Practice", - "startLine": 1279, - "startColumn": 9, - "endLine": 1279, + "propertyPath": "Properties.StorageEncrypted", + "suggestedFix": "Set StorageEncrypted to true", + "category": "Security", + "startLine": 274, + "startColumn": 7, + "endLine": 274, "endColumn": 23, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-config.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "ruleDescription": "RDS instance should have StorageEncrypted", + "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FunctionForEvaluateKeyRotationRule", + "logicalId": "VPC", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::EC2::VPC" }, - "propertyPath": "Properties.FunctionName", + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 1302, - "startColumn": 9, - "endLine": 1302, - "endColumn": 21, + "startLine": 142, + "startColumn": 7, + "endLine": 142, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -22011,42 +16753,42 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConfigPermissionToCallEvaluateKeyRotationLambda", + "logicalId": "PublicSubnet", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.FunctionName", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 1365, - "startColumn": 9, - "endLine": 1365, - "endColumn": 21, + "startLine": 158, + "startColumn": 7, + "endLine": 158, + "endColumn": 12, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "GetAtt FunctionForEvaluateKeyRotationRule.Arn" + "resolutionSource": "Ref to 'VPC'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Action' is create-only; updating it will cause resource replacement", + "message": "Property 'CidrBlock' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConfigPermissionToCallEvaluateKeyRotationLambda", + "logicalId": "PublicSubnet", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.Action", + "propertyPath": "Properties.CidrBlock", "category": "Best Practice", - "startLine": 1366, - "startColumn": 9, - "endLine": 1366, - "endColumn": 15, + "startLine": 159, + "startColumn": 7, + "endLine": 159, + "endColumn": 16, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -22056,42 +16798,42 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Principal' is create-only; updating it will cause resource replacement", + "message": "Property 'AvailabilityZone' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConfigPermissionToCallEvaluateKeyRotationLambda", + "logicalId": "PublicSubnet", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::EC2::Subnet" }, - "propertyPath": "Properties.Principal", + "propertyPath": "Properties.AvailabilityZone", "category": "Best Practice", - "startLine": 1367, - "startColumn": 9, - "endLine": 1367, - "endColumn": 18, + "startLine": 160, + "startColumn": 7, + "endLine": 160, + "endColumn": 23, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "dynamic (Select with unresolvable arguments)" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ConfigRuleName' is create-only; updating it will cause resource replacement", + "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConfigRuleForEvaluateKeyRotations", + "logicalId": "WebSecurityGroup", "entityType": "Resource", - "resourceType": "AWS::Config::ConfigRule" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.ConfigRuleName", + "propertyPath": "Properties.GroupDescription", "category": "Best Practice", - "startLine": 1376, - "startColumn": 9, - "endLine": 1376, + "startLine": 176, + "startColumn": 7, + "endLine": 176, "endColumn": 23, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-config.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -22101,244 +16843,249 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FunctionForEvaluateConfigInAllRegionsRule", + "logicalId": "WebSecurityGroup", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.FunctionName", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 1398, - "startColumn": 9, - "endLine": 1398, - "endColumn": 21, + "startLine": 177, + "startColumn": 7, + "endLine": 177, + "endColumn": 12, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'VPC'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "EvaluateConfigInAllRegionsFunctionPermission", + "logicalId": "BastionSecurityGroup", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.FunctionName", + "propertyPath": "Properties.GroupDescription", "category": "Best Practice", - "startLine": 1472, - "startColumn": 9, - "endLine": 1472, - "endColumn": 21, + "startLine": 204, + "startColumn": 7, + "endLine": 204, + "endColumn": 23, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt FunctionForEvaluateConfigInAllRegionsRule.Arn" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Action' is create-only; updating it will cause resource replacement", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "EvaluateConfigInAllRegionsFunctionPermission", + "logicalId": "BastionSecurityGroup", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.Action", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 1473, - "startColumn": 9, - "endLine": 1473, - "endColumn": 15, + "startLine": 205, + "startColumn": 7, + "endLine": 205, + "endColumn": 12, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "Ref to 'VPC'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Principal' is create-only; updating it will cause resource replacement", + "message": "Property 'LaunchTemplateName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "EvaluateConfigInAllRegionsFunctionPermission", + "logicalId": "LaunchTemplate", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::EC2::LaunchTemplate" }, - "propertyPath": "Properties.Principal", + "propertyPath": "Properties.LaunchTemplateName", "category": "Best Practice", - "startLine": 1474, - "startColumn": 9, - "endLine": 1474, - "endColumn": 18, + "startLine": 216, + "startColumn": 7, + "endLine": 216, + "endColumn": 25, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "parameter with AllowedValues" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ConfigRuleName' is create-only; updating it will cause resource replacement", + "message": "Property 'AutoScalingGroupName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConfigRuleForEvaluateConfigInAllRegions", + "logicalId": "AutoScalingGroup", "entityType": "Resource", - "resourceType": "AWS::Config::ConfigRule" + "resourceType": "AWS::AutoScaling::AutoScalingGroup" }, - "propertyPath": "Properties.ConfigRuleName", + "propertyPath": "Properties.AutoScalingGroupName", "category": "Best Practice", - "startLine": 1481, - "startColumn": 9, - "endLine": 1481, - "endColumn": 23, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-config.git", + "startLine": 237, + "startColumn": 7, + "endLine": 237, + "endColumn": 27, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "parameter with AllowedValues" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "message": "Property 'LaunchTemplate' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FunctionForVpcPeeringRouteTablesRule", + "logicalId": "AutoScalingGroup", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::AutoScaling::AutoScalingGroup" }, - "propertyPath": "Properties.FunctionName", + "propertyPath": "Properties.LaunchTemplate", "category": "Best Practice", - "startLine": 1503, - "startColumn": 9, - "endLine": 1503, + "startLine": 238, + "startColumn": 7, + "endLine": 238, "endColumn": 21, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "message": "Property 'VPCZoneIdentifier' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConfigPermissionToCallVpcPeeringRouteTablesLambda", + "logicalId": "AutoScalingGroup", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::AutoScaling::AutoScalingGroup" }, - "propertyPath": "Properties.FunctionName", + "propertyPath": "Properties.VPCZoneIdentifier", "category": "Best Practice", - "startLine": 1557, - "startColumn": 9, - "endLine": 1557, - "endColumn": 21, + "startLine": 242, + "startColumn": 7, + "endLine": 242, + "endColumn": 24, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt FunctionForVpcPeeringRouteTablesRule.Arn" + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Action' is create-only; updating it will cause resource replacement", + "message": "Property 'DBInstanceIdentifier' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConfigPermissionToCallVpcPeeringRouteTablesLambda", + "logicalId": "Database", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Action", + "propertyPath": "Properties.DBInstanceIdentifier", "category": "Best Practice", - "startLine": 1558, - "startColumn": 9, - "endLine": 1558, - "endColumn": 15, + "startLine": 268, + "startColumn": 7, + "endLine": 268, + "endColumn": 27, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "parameter with AllowedValues" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Principal' is create-only; updating it will cause resource replacement", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConfigPermissionToCallVpcPeeringRouteTablesLambda", + "logicalId": "Database", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Principal", + "propertyPath": "Properties.Engine", "category": "Best Practice", - "startLine": 1559, - "startColumn": 9, - "endLine": 1559, - "endColumn": 18, + "startLine": 270, + "startColumn": 7, + "endLine": 270, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ConfigRuleName' is create-only; updating it will cause resource replacement", + "message": "Property 'StorageEncrypted' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConfigRuleForVpcPeeringRouteTabless", + "logicalId": "Database", "entityType": "Resource", - "resourceType": "AWS::Config::ConfigRule" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.ConfigRuleName", + "propertyPath": "Properties.StorageEncrypted", "category": "Best Practice", - "startLine": 1568, - "startColumn": 9, - "endLine": 1568, + "startLine": 274, + "startColumn": 7, + "endLine": 274, "endColumn": 23, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-config.git", + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "Fn::If on condition 'IsProduction'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'TopicName' is create-only; updating it will cause resource replacement", + "message": "Property 'MasterUsername' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SnsTopicForCloudWatchEvents", + "logicalId": "Database", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.TopicName", + "propertyPath": "Properties.MasterUsername", "category": "Best Practice", - "startLine": 1589, - "startColumn": 9, - "endLine": 1589, - "endColumn": 18, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sns", + "startLine": 275, + "startColumn": 7, + "endLine": 275, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -22348,69 +17095,67 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "message": "Property 'BackupRetentionPeriod' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "GetCloudTrailCloudWatchLog", + "logicalId": "Database", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.FunctionName", + "propertyPath": "Properties.BackupRetentionPeriod", "category": "Best Practice", - "startLine": 1603, - "startColumn": 9, - "endLine": 1603, - "endColumn": 21, + "startLine": 279, + "startColumn": 7, + "endLine": 279, + "endColumn": 28, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "conditional-create-only", + "resolutionSource": "Fn::If on condition 'IsProduction'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'LogGroupName' is create-only; updating it will cause resource replacement", + "message": "Property 'MultiAZ' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "UnauthorizedAttemptsCloudWatchFilter", + "logicalId": "Database", "entityType": "Resource", - "resourceType": "AWS::Logs::MetricFilter" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.LogGroupName", + "propertyPath": "Properties.MultiAZ", "category": "Best Practice", - "startLine": 1651, - "startColumn": 9, - "endLine": 1651, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-logs.git", + "startLine": 280, + "startColumn": 7, + "endLine": 280, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt ResourceForGetCloudTrailCloudWatchLog.LogName", - "extra": { - "replacement_strategy": "delete_then_create" - } + "lifecycle": "conditional-create-only", + "resolutionSource": "dynamic (condition reference: IsProduction)" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'AlarmName' is create-only; updating it will cause resource replacement", + "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "UnauthorizedAttemptCloudWatchAlarm", + "logicalId": "DatabaseSecurityGroup", "entityType": "Resource", - "resourceType": "AWS::CloudWatch::Alarm" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.AlarmName", + "propertyPath": "Properties.GroupDescription", "category": "Best Practice", - "startLine": 1662, - "startColumn": 9, - "endLine": 1662, - "endColumn": 18, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-cloudwatch.git", + "startLine": 293, + "startColumn": 7, + "endLine": 293, + "endColumn": 23, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -22420,78 +17165,71 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'LogGroupName' is create-only; updating it will cause resource replacement", + "message": "Property 'VpcId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "IAMRootActivityCloudWatchMetric", + "logicalId": "DatabaseSecurityGroup", "entityType": "Resource", - "resourceType": "AWS::Logs::MetricFilter" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.LogGroupName", + "propertyPath": "Properties.VpcId", "category": "Best Practice", - "startLine": 1685, - "startColumn": 9, - "endLine": 1685, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-logs.git", + "startLine": 294, + "startColumn": 7, + "endLine": 294, + "endColumn": 12, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "GetAtt ResourceForGetCloudTrailCloudWatchLog.LogName", - "extra": { - "replacement_strategy": "delete_then_create" - } + "resolutionSource": "Ref to 'VPC'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'AlarmName' is create-only; updating it will cause resource replacement", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "IAMRootActivityCloudWatchAlarm", + "logicalId": "LambdaFunction", "entityType": "Resource", - "resourceType": "AWS::CloudWatch::Alarm" + "resourceType": "AWS::Lambda::Function" }, - "propertyPath": "Properties.AlarmName", + "propertyPath": "Properties.FunctionName", "category": "Best Practice", - "startLine": 1700, - "startColumn": 9, - "endLine": 1700, - "endColumn": 18, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-cloudwatch.git", + "startLine": 305, + "startColumn": 7, + "endLine": 305, + "endColumn": 19, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "parameter with AllowedValues" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'LogGroupName' is create-only; updating it will cause resource replacement", + "message": "Property 'RoleName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConsoleSigninWithoutMfaCloudWatchMetric", + "logicalId": "LambdaRole", "entityType": "Resource", - "resourceType": "AWS::Logs::MetricFilter" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.LogGroupName", + "propertyPath": "Properties.RoleName", "category": "Best Practice", - "startLine": 1722, - "startColumn": 9, - "endLine": 1722, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-logs.git", + "startLine": 343, + "startColumn": 7, + "endLine": 343, + "endColumn": 15, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "GetAtt ResourceForGetCloudTrailCloudWatchLog.LogName", - "extra": { - "replacement_strategy": "delete_then_create" - } + "resolutionSource": "parameter with AllowedValues" } }, { @@ -22500,426 +17238,384 @@ "message": "Property 'AlarmName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConsoleSigninWithoutMFACloudWatchAlarm", + "logicalId": "DatabaseAlarm", "entityType": "Resource", "resourceType": "AWS::CloudWatch::Alarm" }, "propertyPath": "Properties.AlarmName", "category": "Best Practice", - "startLine": 1738, - "startColumn": 9, - "endLine": 1738, - "endColumn": 18, + "startLine": 369, + "startColumn": 7, + "endLine": 369, + "endColumn": 16, "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-cloudwatch.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "parameter with AllowedValues" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'LogGroupName' is create-only; updating it will cause resource replacement", + "message": "Property 'TopicName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConsoleLoginFailureCloudWatchMetric", + "logicalId": "SNSTopic", "entityType": "Resource", - "resourceType": "AWS::Logs::MetricFilter" + "resourceType": "AWS::SNS::Topic" }, - "propertyPath": "Properties.LogGroupName", + "propertyPath": "Properties.TopicName", "category": "Best Practice", - "startLine": 1761, - "startColumn": 9, - "endLine": 1761, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-logs.git", + "startLine": 390, + "startColumn": 7, + "endLine": 390, + "endColumn": 16, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sns", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { "lifecycle": "create-only", - "resolutionSource": "GetAtt ResourceForGetCloudTrailCloudWatchLog.LogName", - "extra": { - "replacement_strategy": "delete_then_create" - } + "resolutionSource": "parameter with AllowedValues" } }, { - "ruleId": "I9001", + "ruleId": "I9003", "severity": "INFO", - "message": "Property 'AlarmName' is create-only; updating it will cause resource replacement", + "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", "source": "ENGINE", - "entity": { - "logicalId": "ConsoleLoginFailureCloudWatchAlarm", - "entityType": "Resource", - "resourceType": "AWS::CloudWatch::Alarm" - }, - "propertyPath": "Properties.AlarmName", "category": "Best Practice", - "startLine": 1775, - "startColumn": 9, - "endLine": 1775, - "endColumn": 18, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-cloudwatch.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'LogGroupName' is create-only; updating it will cause resource replacement", + "message": "Resource 'BastionSecurityGroup' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "KMSCustomerKeyDeletionCloudWatchMetric", + "logicalId": "BastionSecurityGroup", "entityType": "Resource", - "resourceType": "AWS::Logs::MetricFilter" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.LogGroupName", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1798, - "startColumn": 9, - "endLine": 1798, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-logs.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt ResourceForGetCloudTrailCloudWatchLog.LogName", - "extra": { - "replacement_strategy": "delete_then_create" - } - } + "startLine": 203, + "startColumn": 5, + "endLine": 203, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'AlarmName' is create-only; updating it will cause resource replacement", + "message": "Resource 'DatabaseSecurityGroup' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "KMSCustomerKeyDeletionCloudWatchAlarm", + "logicalId": "DatabaseSecurityGroup", "entityType": "Resource", - "resourceType": "AWS::CloudWatch::Alarm" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.AlarmName", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1812, - "startColumn": 9, - "endLine": 1812, - "endColumn": 18, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-cloudwatch.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 292, + "startColumn": 5, + "endLine": 292, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "message": "Resource 'LambdaRole' of type 'AWS::IAM::Role' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "FunctionToFormatCloudWatchEvent", + "logicalId": "LambdaRole", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::IAM::Role" }, - "propertyPath": "Properties.FunctionName", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1860, - "startColumn": 9, - "endLine": 1860, - "endColumn": 21, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 342, + "startColumn": 5, + "endLine": 342, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "message": "Resource 'DatabaseAlarm' of type 'AWS::CloudWatch::Alarm' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "LambdaPermissionForCloudTrailCloudWatchEventRules", + "logicalId": "DatabaseAlarm", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::CloudWatch::Alarm" }, - "propertyPath": "Properties.FunctionName", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1897, - "startColumn": 9, - "endLine": 1897, - "endColumn": 21, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt FunctionToFormatCloudWatchEvent.Arn" - } + "startLine": 368, + "startColumn": 5, + "endLine": 368, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "lsp/condition-usage.json": { + "filePath": "lsp/condition-usage.json", + "status": "OK", + "metadata": { + "resourcesScanned": 4, + "counts": { + "fatal": 0, + "errors": 1, + "warnings": 6, + "informational": 13, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Action' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "E3016", + "severity": "ERROR", + "message": "UpdatePolicy is not supported on resource type 'AWS::S3::Bucket'", + "source": "CFN_LINT", "entity": { - "logicalId": "LambdaPermissionForCloudTrailCloudWatchEventRules", + "logicalId": "ProductionBucket", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.Action", - "category": "Best Practice", - "startLine": 1898, - "startColumn": 9, - "endLine": 1898, - "endColumn": 15, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "propertyPath": "UpdatePolicy", + "suggestedFix": "Remove UpdatePolicy or change resource type to one of: AWS::AppStream::Fleet, AWS::AutoScaling::AutoScalingGroup, AWS::ElastiCache::ReplicationGroup, AWS::Elasticsearch::Domain, AWS::Lambda::Alias, AWS::OpenSearchService::Domain", + "category": "Resource", + "startLine": 75, + "startColumn": 7, + "endLine": 75, + "endColumn": 20, + "ruleDescription": "Check UpdatePolicy values for Resources", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Principal' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W1028", + "severity": "WARN", + "message": "['Fn::If', 2] is not reachable. When setting condition 'IsProduction' to False from current status True", + "source": "CFN_LINT", "entity": { - "logicalId": "LambdaPermissionForCloudTrailCloudWatchEventRules", + "logicalId": "ProductionBucket", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.Principal", + "propertyPath": "Properties.BucketName.Fn::If.2", "category": "Best Practice", - "startLine": 1899, - "startColumn": 9, - "endLine": 1899, - "endColumn": 18, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 62, + "startColumn": 13, + "endLine": 62, + "endColumn": 27, + "ruleDescription": "Check Fn::If has a path that cannot be reached", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Name' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W1028", + "severity": "WARN", + "message": "['Fn::If', 2] is not reachable. When setting condition 'IsProduction' to False from current status True", + "source": "CFN_LINT", "entity": { - "logicalId": "DetectS3BucketPolicyChanges", + "logicalId": "ProductionBucket", "entityType": "Resource", - "resourceType": "AWS::Events::Rule" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.Name", + "propertyPath": "Properties.VersioningConfiguration.Status.Fn::If.2", "category": "Best Practice", - "startLine": 1907, - "startColumn": 9, - "endLine": 1907, - "endColumn": 13, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 70, + "startColumn": 15, + "endLine": 70, + "endColumn": 25, + "ruleDescription": "Check Fn::If has a path that cannot be reached", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Name' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W2501", + "severity": "WARN", + "message": "Property 'MasterUserPassword' should not be a hardcoded string - use a parameter with NoEcho or a dynamic reference", + "source": "CFN_LINT", "entity": { - "logicalId": "DetectConfigChanges", + "logicalId": "Database", "entityType": "Resource", - "resourceType": "AWS::Events::Rule" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Name", - "category": "Best Practice", - "startLine": 1938, + "propertyPath": "Properties.MasterUserPassword", + "category": "Security", + "startLine": 97, "startColumn": 9, - "endLine": 1938, - "endColumn": 13, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "endLine": 97, + "endColumn": 28, + "ruleDescription": "Check if Password Properties are correctly configured", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Name' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "ruleId": "W8001", + "severity": "WARN", + "message": "Condition 'NotProduction' is not used by any resource or Fn::If", + "source": "CFN_LINT", "entity": { - "logicalId": "KmsKeyUseCloudWatchEventRule", - "entityType": "Resource", - "resourceType": "AWS::Events::Rule" + "logicalId": "NotProduction", + "entityType": "Condition" }, - "propertyPath": "Properties.Name", + "propertyPath": "Conditions/NotProduction", "category": "Best Practice", - "startLine": 1963, - "startColumn": 9, - "endLine": 1963, - "endColumn": 13, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 47, + "startColumn": 5, + "endLine": 47, + "endColumn": 19, + "ruleDescription": "Check if Conditions are Used", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Name' is create-only; updating it will cause resource replacement", + "ruleId": "W9008", + "severity": "WARN", + "message": "RDS instance should have StorageEncrypted set to true", "source": "ENGINE", "entity": { - "logicalId": "CloudTrailCloudWatchEventRule", + "logicalId": "Database", "entityType": "Resource", - "resourceType": "AWS::Events::Rule" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Name", - "category": "Best Practice", - "startLine": 1985, - "startColumn": 9, - "endLine": 1985, - "endColumn": 13, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "propertyPath": "Properties.StorageEncrypted", + "suggestedFix": "Set StorageEncrypted to true", + "category": "Security", + "startLine": 93, + "startColumn": 7, + "endLine": 93, + "endColumn": 18, + "ruleDescription": "RDS instance should have StorageEncrypted", + "phase": "LINT" }, { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Name' is create-only; updating it will cause resource replacement", + "ruleId": "W9010", + "severity": "WARN", + "message": "Hardcoded AMI ID - use a parameter or mapping for portability", "source": "ENGINE", "entity": { - "logicalId": "IamPolicyChangesCloudWatchEventRule", + "logicalId": "ConditionalResource", "entityType": "Resource", - "resourceType": "AWS::Events::Rule" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Name", - "category": "Best Practice", - "startLine": 2008, + "propertyPath": "Properties.ImageId", + "category": "Security", + "startLine": 104, "startColumn": 9, - "endLine": 2008, - "endColumn": 13, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "endLine": 104, + "endColumn": 17, + "ruleDescription": "Hardcoded AMI ID", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'Name' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "BillingChangeCloudWatchEventRule", + "logicalId": "Database", "entityType": "Resource", - "resourceType": "AWS::Events::Rule" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Name", "category": "Best Practice", - "startLine": 2046, - "startColumn": 9, - "endLine": 2046, - "endColumn": 13, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 90, + "startColumn": 5, + "endLine": 90, + "endColumn": 14, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3011", "severity": "INFO", - "message": "Property 'Name' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "Ec2TerminationCloudWatchEventRule", + "logicalId": "Database", "entityType": "Resource", - "resourceType": "AWS::Events::Rule" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Name", "category": "Best Practice", - "startLine": 2070, - "startColumn": 9, - "endLine": 2070, - "endColumn": 13, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 90, + "startColumn": 5, + "endLine": 90, + "endColumn": 14, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I3013", "severity": "INFO", - "message": "Property 'Name' is create-only; updating it will cause resource replacement", - "source": "ENGINE", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "SecurityGroupChangesCloudWatchEventRule", + "logicalId": "Database", "entityType": "Resource", - "resourceType": "AWS::Events::Rule" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Name", + "propertyPath": "Properties", "category": "Best Practice", - "startLine": 2093, - "startColumn": 9, - "endLine": 2093, - "endColumn": 13, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 93, + "startColumn": 7, + "endLine": 93, + "endColumn": 18, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Name' is create-only; updating it will cause resource replacement", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "NetworkAclChangesCloudWatchEventRule", + "logicalId": "ProductionBucket", "entityType": "Resource", - "resourceType": "AWS::Events::Rule" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.Name", + "propertyPath": "Properties.BucketName", "category": "Best Practice", - "startLine": 2121, + "startLine": 58, "startColumn": 9, - "endLine": 2121, - "endColumn": 13, + "endLine": 58, + "endColumn": 20, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only" + "lifecycle": "create-only", + "resolutionSource": "Fn::If on condition 'IsProduction'" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Name' is create-only; updating it will cause resource replacement", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "NetworkChangeCloudWatchEventRule", + "logicalId": "DevelopmentBucket", "entityType": "Resource", - "resourceType": "AWS::Events::Rule" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.Name", + "propertyPath": "Properties.BucketName", "category": "Best Practice", - "startLine": 2151, + "startLine": 87, "startColumn": 9, - "endLine": 2151, - "endColumn": 13, + "endLine": 87, + "endColumn": 20, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -22929,47 +17625,43 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'LogGroupName' is create-only; updating it will cause resource replacement", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "BillingChangesCloudWatchFilter", + "logicalId": "Database", "entityType": "Resource", - "resourceType": "AWS::Logs::MetricFilter" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.LogGroupName", + "propertyPath": "Properties.Engine", "category": "Best Practice", - "startLine": 2187, + "startLine": 95, "startColumn": 9, - "endLine": 2187, - "endColumn": 21, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-logs.git", + "endLine": 95, + "endColumn": 16, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt ResourceForGetCloudTrailCloudWatchLog.LogName", - "extra": { - "replacement_strategy": "delete_then_create" - } + "lifecycle": "conditional-create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'AlarmName' is create-only; updating it will cause resource replacement", + "message": "Property 'MasterUsername' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "BillingChangesCloudWatchAlarm", + "logicalId": "Database", "entityType": "Resource", - "resourceType": "AWS::CloudWatch::Alarm" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.AlarmName", + "propertyPath": "Properties.MasterUsername", "category": "Best Practice", - "startLine": 2202, + "startLine": 96, "startColumn": 9, - "endLine": 2202, - "endColumn": 18, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-cloudwatch.git", + "endLine": 96, + "endColumn": 24, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -22979,19 +17671,20 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FunctionToDisableUnusedCredentials", + "logicalId": "ConditionalResource", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.FunctionName", + "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 2255, + "startLine": 104, "startColumn": 9, - "endLine": 2255, - "endColumn": 21, + "endLine": 104, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -23001,864 +17694,1186 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "LambdaPermissionForDisableUnusedCredentials", + "logicalId": "ConditionalResource", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.FunctionName", + "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 2342, + "startLine": 105, "startColumn": 9, - "endLine": 2342, - "endColumn": 21, + "endLine": 105, + "endColumn": 22, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt FunctionToDisableUnusedCredentials.Arn" + "lifecycle": "conditional-create-only", + "resolutionSource": "Fn::If on condition 'IsProductionAndCreateDB'" } }, { - "ruleId": "I9001", + "ruleId": "I9003", + "severity": "INFO", + "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", + "source": "ENGINE", + "category": "Best Practice", + "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", + "phase": "LINT" + }, + { + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Action' is create-only; updating it will cause resource replacement", + "message": "Resource 'ProductionBucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "LambdaPermissionForDisableUnusedCredentials", + "logicalId": "ProductionBucket", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.Action", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 2343, - "startColumn": 9, - "endLine": 2343, - "endColumn": 15, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 57, + "startColumn": 7, + "endLine": 57, + "endColumn": 18, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Principal' is create-only; updating it will cause resource replacement", + "message": "Resource 'DevelopmentBucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "LambdaPermissionForDisableUnusedCredentials", + "logicalId": "DevelopmentBucket", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.Principal", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 2344, - "startColumn": 9, - "endLine": 2344, + "startLine": 86, + "startColumn": 7, + "endLine": 86, "endColumn": 18, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Name' is create-only; updating it will cause resource replacement", + "message": "Resource 'Database' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ScheduledRuleForDisableUnusedCredentials", - "entityType": "Resource", - "resourceType": "AWS::Events::Rule" + "logicalId": "Database", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBInstance" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 93, + "startColumn": 7, + "endLine": 93, + "endColumn": 18, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "lsp/condition-usage.yaml": { + "filePath": "lsp/condition-usage.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 8, + "counts": { + "fatal": 0, + "errors": 7, + "warnings": 7, + "informational": 21, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "E1028", + "severity": "ERROR", + "message": "Fn::If first element must be the name of a condition, not an expression", + "source": "SCHEMA", + "entity": { + "logicalId": "LogicalConditionResource", + "entityType": "Resource", + "resourceType": "AWS::CloudWatch::Alarm" + }, + "propertyPath": "Properties.AlarmName.Fn::If.0", + "category": "Intrinsic Function", + "startLine": 172, + "startColumn": 18, + "endLine": 172, + "endColumn": 19, + "ruleDescription": "Fn::If condition must exist in Conditions section", + "phase": "PARSE" + }, + { + "ruleId": "E1028", + "severity": "ERROR", + "message": "Fn::If first element must be the name of a condition, not an expression", + "source": "SCHEMA", + "entity": { + "logicalId": "LogicalConditionResource", + "entityType": "Resource", + "resourceType": "AWS::CloudWatch::Alarm" + }, + "propertyPath": "Properties.Threshold.Fn::If.0", + "category": "Intrinsic Function", + "startLine": 184, + "startColumn": 17, + "endLine": 184, + "endColumn": 18, + "ruleDescription": "Fn::If condition must exist in Conditions section", + "phase": "PARSE" + }, + { + "ruleId": "E1028", + "severity": "ERROR", + "message": "Fn::If first element must be the name of a condition, not an expression", + "source": "SCHEMA", + "entity": { + "logicalId": "LogicalConditionResource", + "entityType": "Resource", + "resourceType": "AWS::CloudWatch::Alarm" + }, + "propertyPath": "Properties.TreatMissingData.Fn::If.0", + "category": "Intrinsic Function", + "startLine": 192, + "startColumn": 18, + "endLine": 192, + "endColumn": 19, + "ruleDescription": "Fn::If condition must exist in Conditions section", + "phase": "PARSE" + }, + { + "ruleId": "E1028", + "severity": "ERROR", + "message": "Fn::If first element must be the name of a condition, not an expression", + "source": "SCHEMA", + "entity": { + "logicalId": "LogicalConditionalOutput", + "entityType": "Output" + }, + "propertyPath": "Outputs/LogicalConditionalOutput/Value/Fn::If/0", + "category": "Intrinsic Function", + "startLine": 236, + "startColumn": 18, + "endLine": 236, + "endColumn": 19, + "ruleDescription": "Fn::If condition must exist in Conditions section", + "phase": "PARSE" + }, + { + "ruleId": "E1028", + "severity": "ERROR", + "message": "Fn::If first element must be the name of a condition, not an expression", + "source": "SCHEMA", + "entity": { + "logicalId": "LogicalConditionalOutput", + "entityType": "Output" + }, + "propertyPath": "Outputs/LogicalConditionalOutput/Value/Fn::If/2/Fn::If/0", + "category": "Intrinsic Function", + "startLine": 241, + "startColumn": 21, + "endLine": 241, + "endColumn": 22, + "ruleDescription": "Fn::If condition must exist in Conditions section", + "phase": "PARSE" + }, + { + "ruleId": "E1028", + "severity": "ERROR", + "message": "Fn::If first element must be the name of a condition, not an expression", + "source": "SCHEMA", + "entity": { + "logicalId": "EdgeCaseOutput", + "entityType": "Output" }, - "propertyPath": "Properties.Name", - "category": "Best Practice", - "startLine": 2349, - "startColumn": 9, - "endLine": 2349, - "endColumn": 13, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "propertyPath": "Outputs/EdgeCaseOutput/Value/Fn::If/0", + "category": "Intrinsic Function", + "startLine": 251, + "startColumn": 19, + "endLine": 251, + "endColumn": 20, + "ruleDescription": "Fn::If condition must exist in Conditions section", + "phase": "PARSE" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'MasterConfigRole' of type 'AWS::IAM::Role' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "E3016", + "severity": "ERROR", + "message": "UpdatePolicy is not supported on resource type 'AWS::S3::Bucket'", + "source": "CFN_LINT", "entity": { - "logicalId": "MasterConfigRole", + "logicalId": "ProductionBucket", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", + "propertyPath": "UpdatePolicy", + "suggestedFix": "Remove UpdatePolicy or change resource type to one of: AWS::AppStream::Fleet, AWS::AutoScaling::AutoScalingGroup, AWS::ElastiCache::ReplicationGroup, AWS::Elasticsearch::Domain, AWS::Lambda::Alias, AWS::OpenSearchService::Domain", + "category": "Resource", "startLine": 78, - "startColumn": 7, + "startColumn": 5, "endLine": 78, "endColumn": 17, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Check UpdatePolicy values for Resources", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'FunctiontForEvaluateCisBenchmarkingPreconditions' of type 'AWS::Lambda::Function' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W1028", + "severity": "WARN", + "message": "['Fn::If', 2] is not reachable. When setting condition 'IsProduction' to False from current status True", + "source": "CFN_LINT", "entity": { - "logicalId": "FunctiontForEvaluateCisBenchmarkingPreconditions", + "logicalId": "ProductionBucket", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.BucketName.Fn::If.2", "category": "Best Practice", - "startLine": 123, - "startColumn": 7, - "endLine": 123, - "endColumn": 17, - "ruleDescription": "Resource should have Tags", + "startLine": 57, + "startColumn": 54, + "endLine": 57, + "endColumn": 55, + "ruleDescription": "Check Fn::If has a path that cannot be reached", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'FunctionForEvaluateRootAccountRule' of type 'AWS::Lambda::Function' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W1028", + "severity": "WARN", + "message": "['Fn::If', 2] is not reachable. When setting condition 'IsProduction' to False from current status True", + "source": "CFN_LINT", "entity": { - "logicalId": "FunctionForEvaluateRootAccountRule", + "logicalId": "ProductionBucket", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.VersioningConfiguration.Status.Fn::If.2", "category": "Best Practice", - "startLine": 230, - "startColumn": 7, - "endLine": 230, - "endColumn": 17, - "ruleDescription": "Resource should have Tags", + "startLine": 62, + "startColumn": 43, + "endLine": 62, + "endColumn": 44, + "ruleDescription": "Check Fn::If has a path that cannot be reached", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'FunctionForVpcFlowLogRule' of type 'AWS::Lambda::Function' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W1028", + "severity": "WARN", + "message": "['Fn::If', 2] is not reachable. When setting condition 'IsProduction' to False from current status True", + "source": "CFN_LINT", "entity": { - "logicalId": "FunctionForVpcFlowLogRule", + "logicalId": "ProductionBucket", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.PublicAccessBlockConfiguration.BlockPublicAcls.Fn::If.2", "category": "Best Practice", - "startLine": 424, - "startColumn": 7, - "endLine": 424, - "endColumn": 17, - "ruleDescription": "Resource should have Tags", + "startLine": 69, + "startColumn": 13, + "endLine": 69, + "endColumn": 14, + "ruleDescription": "Check Fn::If has a path that cannot be reached", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'FunctionForVpcDefaultSecurityGroupsRule' of type 'AWS::Lambda::Function' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W1028", + "severity": "WARN", + "message": "['Fn::If', 2] is not reachable. When setting condition 'IsProduction' to False from current status True", + "source": "CFN_LINT", "entity": { - "logicalId": "FunctionForVpcDefaultSecurityGroupsRule", + "logicalId": "ProductionBucket", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.PublicAccessBlockConfiguration.BlockPublicPolicy.Fn::If.2", "category": "Best Practice", - "startLine": 500, - "startColumn": 7, - "endLine": 500, - "endColumn": 17, - "ruleDescription": "Resource should have Tags", + "startLine": 76, + "startColumn": 15, + "endLine": 76, + "endColumn": 16, + "ruleDescription": "Check Fn::If has a path that cannot be reached", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'FunctionForRoleForMfaOnUsersRule' of type 'AWS::Lambda::Function' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "W2501", + "severity": "WARN", + "message": "Property 'MasterUserPassword' should not be a hardcoded string - use a parameter with NoEcho or a dynamic reference", + "source": "CFN_LINT", "entity": { - "logicalId": "FunctionForRoleForMfaOnUsersRule", + "logicalId": "Database", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 609, + "propertyPath": "Properties.MasterUserPassword", + "category": "Security", + "startLine": 98, "startColumn": 7, - "endLine": 609, - "endColumn": 17, - "ruleDescription": "Resource should have Tags", + "endLine": 98, + "endColumn": 25, + "ruleDescription": "Check if Password Properties are correctly configured", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'FunctionForEvaluatePolicyPermissionsRule' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "ruleId": "W9008", + "severity": "WARN", + "message": "RDS instance should have StorageEncrypted set to true", "source": "ENGINE", "entity": { - "logicalId": "FunctionForEvaluatePolicyPermissionsRule", + "logicalId": "Database", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 702, - "startColumn": 7, - "endLine": 702, - "endColumn": 17, - "ruleDescription": "Resource should have Tags", + "propertyPath": "Properties.StorageEncrypted", + "suggestedFix": "Set StorageEncrypted to true", + "category": "Security", + "startLine": 94, + "startColumn": 5, + "endLine": 94, + "endColumn": 15, + "ruleDescription": "RDS instance should have StorageEncrypted", "phase": "LINT" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'FunctionForEvaluateUserPolicyAssociationRule' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "ruleId": "W9010", + "severity": "WARN", + "message": "Hardcoded AMI ID - use a parameter or mapping for portability", "source": "ENGINE", "entity": { - "logicalId": "FunctionForEvaluateUserPolicyAssociationRule", + "logicalId": "ConditionalResource", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 798, + "propertyPath": "Properties.ImageId", + "category": "Security", + "startLine": 104, "startColumn": 7, - "endLine": 798, - "endColumn": 17, - "ruleDescription": "Resource should have Tags", + "endLine": 104, + "endColumn": 14, + "ruleDescription": "Hardcoded AMI ID", "phase": "LINT" }, { - "ruleId": "I9040", + "ruleId": "I3011", "severity": "INFO", - "message": "Resource 'FunctionForEvaluateCloudTrailRule' of type 'AWS::Lambda::Function' supports Tags but none are configured", - "source": "ENGINE", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "FunctionForEvaluateCloudTrailRule", + "logicalId": "Database", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 889, - "startColumn": 7, - "endLine": 889, - "endColumn": 17, - "ruleDescription": "Resource should have Tags", + "startLine": 91, + "startColumn": 3, + "endLine": 91, + "endColumn": 11, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "I9040", + "ruleId": "I3011", "severity": "INFO", - "message": "Resource 'FunctionForEvaluateCloudTrailBucketRule' of type 'AWS::Lambda::Function' supports Tags but none are configured", - "source": "ENGINE", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "FunctionForEvaluateCloudTrailBucketRule", + "logicalId": "Database", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1002, - "startColumn": 7, - "endLine": 1002, - "endColumn": 17, - "ruleDescription": "Resource should have Tags", + "startLine": 91, + "startColumn": 3, + "endLine": 91, + "endColumn": 11, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", "phase": "LINT" }, { - "ruleId": "I9040", + "ruleId": "I3013", "severity": "INFO", - "message": "Resource 'FunctionForEvaluateCloudTrailLogIntegrityRule' of type 'AWS::Lambda::Function' supports Tags but none are configured", - "source": "ENGINE", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", "entity": { - "logicalId": "FunctionForEvaluateCloudTrailLogIntegrityRule", + "logicalId": "Database", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties", "category": "Best Practice", - "startLine": 1119, - "startColumn": 7, - "endLine": 1119, - "endColumn": 17, - "ruleDescription": "Resource should have Tags", + "startLine": 94, + "startColumn": 5, + "endLine": 94, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", "phase": "LINT" }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'FunctionForInstanceRoleUseRule' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FunctionForInstanceRoleUseRule", + "logicalId": "ProductionBucket", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.BucketName", "category": "Best Practice", - "startLine": 1216, + "startLine": 57, "startColumn": 7, - "endLine": 1216, + "endLine": 57, "endColumn": 17, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Fn::If on condition 'IsProduction'" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'FunctionForEvaluateKeyRotationRule' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FunctionForEvaluateKeyRotationRule", + "logicalId": "DevelopmentBucket", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.BucketName", "category": "Best Practice", - "startLine": 1301, + "startLine": 89, "startColumn": 7, - "endLine": 1301, + "endLine": 89, "endColumn": 17, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'FunctionForEvaluateConfigInAllRegionsRule' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FunctionForEvaluateConfigInAllRegionsRule", + "logicalId": "Database", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.Engine", "category": "Best Practice", - "startLine": 1397, + "startLine": 96, "startColumn": 7, - "endLine": 1397, - "endColumn": 17, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "endLine": 96, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'FunctionForVpcPeeringRouteTablesRule' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "message": "Property 'MasterUsername' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FunctionForVpcPeeringRouteTablesRule", + "logicalId": "Database", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::RDS::DBInstance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.MasterUsername", "category": "Best Practice", - "startLine": 1502, + "startLine": 97, "startColumn": 7, - "endLine": 1502, - "endColumn": 17, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "endLine": 97, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-rpdk.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'SnsTopicForCloudWatchEvents' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "SnsTopicForCloudWatchEvents", + "logicalId": "ConditionalResource", "entityType": "Resource", - "resourceType": "AWS::SNS::Topic" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.ImageId", "category": "Best Practice", - "startLine": 1588, + "startLine": 104, "startColumn": 7, - "endLine": 1588, - "endColumn": 17, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "endLine": 104, + "endColumn": 14, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'GetCloudTrailCloudWatchLog' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "GetCloudTrailCloudWatchLog", + "logicalId": "ConditionalResource", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.InstanceType", "category": "Best Practice", - "startLine": 1602, + "startLine": 107, "startColumn": 7, - "endLine": 1602, - "endColumn": 17, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "endLine": 107, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only", + "resolutionSource": "Fn::If on condition 'IsProductionAndCreateDB'" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'UnauthorizedAttemptCloudWatchAlarm' of type 'AWS::CloudWatch::Alarm' supports Tags but none are configured", + "message": "Property 'SecurityGroups' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "UnauthorizedAttemptCloudWatchAlarm", + "logicalId": "ConditionalResource", "entityType": "Resource", - "resourceType": "AWS::CloudWatch::Alarm" + "resourceType": "AWS::EC2::Instance" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.SecurityGroups", "category": "Best Practice", - "startLine": 1661, + "startLine": 109, "startColumn": 7, - "endLine": 1661, - "endColumn": 17, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "endLine": 109, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'IAMRootActivityCloudWatchAlarm' of type 'AWS::CloudWatch::Alarm' supports Tags but none are configured", + "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "IAMRootActivityCloudWatchAlarm", + "logicalId": "ProductionSecurityGroup", "entityType": "Resource", - "resourceType": "AWS::CloudWatch::Alarm" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.GroupDescription", "category": "Best Practice", - "startLine": 1699, + "startLine": 137, "startColumn": 7, - "endLine": 1699, - "endColumn": 17, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "endLine": 137, + "endColumn": 23, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'ConsoleSigninWithoutMFACloudWatchAlarm' of type 'AWS::CloudWatch::Alarm' supports Tags but none are configured", + "message": "Property 'GroupDescription' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConsoleSigninWithoutMFACloudWatchAlarm", + "logicalId": "DevSecurityGroup", "entityType": "Resource", - "resourceType": "AWS::CloudWatch::Alarm" + "resourceType": "AWS::EC2::SecurityGroup" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.GroupDescription", "category": "Best Practice", - "startLine": 1737, + "startLine": 143, "startColumn": 7, - "endLine": 1737, - "endColumn": 17, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "endLine": 143, + "endColumn": 23, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'ConsoleLoginFailureCloudWatchAlarm' of type 'AWS::CloudWatch::Alarm' supports Tags but none are configured", + "message": "Property 'Bucket' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "ConsoleLoginFailureCloudWatchAlarm", + "logicalId": "NestedConditionResource", "entityType": "Resource", - "resourceType": "AWS::CloudWatch::Alarm" + "resourceType": "AWS::S3::BucketPolicy" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.Bucket", "category": "Best Practice", - "startLine": 1774, + "startLine": 149, "startColumn": 7, - "endLine": 1774, - "endColumn": 17, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "endLine": 149, + "endColumn": 13, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Fn::If on condition 'IsProduction'" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'KMSCustomerKeyDeletionCloudWatchAlarm' of type 'AWS::CloudWatch::Alarm' supports Tags but none are configured", + "message": "Property 'AlarmName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "KMSCustomerKeyDeletionCloudWatchAlarm", + "logicalId": "LogicalConditionResource", "entityType": "Resource", "resourceType": "AWS::CloudWatch::Alarm" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.AlarmName", "category": "Best Practice", - "startLine": 1811, + "startLine": 171, "startColumn": 7, - "endLine": 1811, - "endColumn": 17, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "endLine": 171, + "endColumn": 16, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-cloudwatch.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Fn::If on condition '__inline_cond_131'" + } }, { - "ruleId": "I9040", + "ruleId": "I9003", "severity": "INFO", - "message": "Resource 'RoleForCloudWatchEvents' of type 'AWS::IAM::Role' supports Tags but none are configured", + "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", "source": "ENGINE", - "entity": { - "logicalId": "RoleForCloudWatchEvents", - "entityType": "Resource", - "resourceType": "AWS::IAM::Role" - }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1831, - "startColumn": 7, - "endLine": 1831, - "endColumn": 17, - "ruleDescription": "Resource should have Tags", + "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'FunctionToFormatCloudWatchEvent' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "message": "Resource 'ProductionBucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "FunctionToFormatCloudWatchEvent", + "logicalId": "ProductionBucket", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::S3::Bucket" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1859, - "startColumn": 7, - "endLine": 1859, - "endColumn": 17, + "startLine": 55, + "startColumn": 5, + "endLine": 55, + "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'DetectS3BucketPolicyChanges' of type 'AWS::Events::Rule' supports Tags but none are configured", + "message": "Resource 'DevelopmentBucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "DetectS3BucketPolicyChanges", + "logicalId": "DevelopmentBucket", "entityType": "Resource", - "resourceType": "AWS::Events::Rule" + "resourceType": "AWS::S3::Bucket" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1906, - "startColumn": 7, - "endLine": 1906, - "endColumn": 17, + "startLine": 88, + "startColumn": 5, + "endLine": 88, + "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'DetectConfigChanges' of type 'AWS::Events::Rule' supports Tags but none are configured", + "message": "Resource 'Database' of type 'AWS::RDS::DBInstance' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "DetectConfigChanges", + "logicalId": "Database", "entityType": "Resource", - "resourceType": "AWS::Events::Rule" + "resourceType": "AWS::RDS::DBInstance" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1937, - "startColumn": 7, - "endLine": 1937, - "endColumn": 17, + "startLine": 94, + "startColumn": 5, + "endLine": 94, + "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'KmsKeyUseCloudWatchEventRule' of type 'AWS::Events::Rule' supports Tags but none are configured", + "message": "Resource 'ProductionSecurityGroup' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "KmsKeyUseCloudWatchEventRule", + "logicalId": "ProductionSecurityGroup", "entityType": "Resource", - "resourceType": "AWS::Events::Rule" + "resourceType": "AWS::EC2::SecurityGroup" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1962, - "startColumn": 7, - "endLine": 1962, - "endColumn": 17, + "startLine": 136, + "startColumn": 5, + "endLine": 136, + "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'CloudTrailCloudWatchEventRule' of type 'AWS::Events::Rule' supports Tags but none are configured", + "message": "Resource 'DevSecurityGroup' of type 'AWS::EC2::SecurityGroup' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "CloudTrailCloudWatchEventRule", + "logicalId": "DevSecurityGroup", "entityType": "Resource", - "resourceType": "AWS::Events::Rule" + "resourceType": "AWS::EC2::SecurityGroup" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 1984, - "startColumn": 7, - "endLine": 1984, - "endColumn": 17, + "startLine": 142, + "startColumn": 5, + "endLine": 142, + "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'IamPolicyChangesCloudWatchEventRule' of type 'AWS::Events::Rule' supports Tags but none are configured", + "message": "Resource 'LogicalConditionResource' of type 'AWS::CloudWatch::Alarm' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "IamPolicyChangesCloudWatchEventRule", + "logicalId": "LogicalConditionResource", "entityType": "Resource", - "resourceType": "AWS::Events::Rule" + "resourceType": "AWS::CloudWatch::Alarm" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 2007, - "startColumn": 7, - "endLine": 2007, - "endColumn": 17, + "startLine": 170, + "startColumn": 5, + "endLine": 170, + "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "lsp/constants.json": { + "filePath": "lsp/constants.json", + "status": "OK", + "metadata": { + "resourcesScanned": 2, + "counts": { + "fatal": 5, + "errors": 0, + "warnings": 0, + "informational": 3, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9040", + "ruleId": "F0005", + "severity": "FATAL", + "message": "'Constants' is not a valid top-level template section", + "source": "SCHEMA", + "propertyPath": "Constants", + "category": "Structure", + "startLine": 4, + "startColumn": 3, + "endLine": 4, + "endColumn": 13, + "ruleDescription": "Top-level keys must be valid section names", + "phase": "SCHEMA" + }, + { + "ruleId": "F1018", + "severity": "FATAL", + "message": "Fn::Sub variable '${sub}' does not reference a valid resource, parameter, or pseudo-parameter", + "source": "SCHEMA", + "entity": { + "logicalId": "Bucket", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" + }, + "propertyPath": "Metadata.Test", + "category": "Intrinsic Function", + "startLine": 19, + "startColumn": 9, + "endLine": 19, + "endColumn": 14, + "ruleDescription": "Sub variables must resolve", + "phase": "SCHEMA" + }, + { + "ruleId": "F1018", + "severity": "FATAL", + "message": "Fn::Sub variable '${foo}' does not reference a valid resource, parameter, or pseudo-parameter", + "source": "SCHEMA", + "entity": { + "logicalId": "Bucket", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" + }, + "propertyPath": "Properties.BucketName", + "category": "Intrinsic Function", + "startLine": 27, + "startColumn": 9, + "endLine": 27, + "endColumn": 20, + "ruleDescription": "Sub variables must resolve", + "phase": "SCHEMA", + "context": { + "resolutionSource": "dynamic (Sub:${foo})" + } + }, + { + "ruleId": "F1020", + "severity": "FATAL", + "message": "'obj' is not one of ['AWS::AccountId', 'AWS::NoValue', 'AWS::NotificationARNs', 'AWS::Partition', 'AWS::Region', 'AWS::StackId', 'AWS::StackName', 'AWS::URLSuffix', 'Bucket', 'PersonalS3']", + "source": "SCHEMA", + "entity": { + "logicalId": "Bucket", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" + }, + "propertyPath": "Metadata.TestObj", + "suggestedFix": "Check that the Ref target exists as a resource, parameter, or pseudo-parameter", + "category": "Intrinsic Function", + "startLine": 22, + "startColumn": 9, + "endLine": 22, + "endColumn": 17, + "ruleDescription": "Ref/GetAtt target must exist", + "phase": "SCHEMA" + }, + { + "ruleId": "F1020", + "severity": "FATAL", + "message": "'foo' is not one of ['AWS::AccountId', 'AWS::NoValue', 'AWS::NotificationARNs', 'AWS::Partition', 'AWS::Region', 'AWS::StackId', 'AWS::StackName', 'AWS::URLSuffix', 'Bucket', 'PersonalS3']", + "source": "SCHEMA", + "entity": { + "logicalId": "Bucket", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" + }, + "propertyPath": "Properties.Tags.0.Value", + "suggestedFix": "Check that the Ref target exists as a resource, parameter, or pseudo-parameter", + "category": "Intrinsic Function", + "startLine": 33, + "startColumn": 13, + "endLine": 33, + "endColumn": 19, + "ruleDescription": "Ref/GetAtt target must exist", + "phase": "SCHEMA" + }, + { + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'BillingChangeCloudWatchEventRule' of type 'AWS::Events::Rule' supports Tags but none are configured", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "BillingChangeCloudWatchEventRule", + "logicalId": "Bucket", "entityType": "Resource", - "resourceType": "AWS::Events::Rule" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.BucketName", "category": "Best Practice", - "startLine": 2045, - "startColumn": 7, - "endLine": 2045, - "endColumn": 17, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 27, + "startColumn": 9, + "endLine": 27, + "endColumn": 20, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "dynamic (Sub:${foo})" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'Ec2TerminationCloudWatchEventRule' of type 'AWS::Events::Rule' supports Tags but none are configured", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "Ec2TerminationCloudWatchEventRule", + "logicalId": "PersonalS3", "entityType": "Resource", - "resourceType": "AWS::Events::Rule" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.BucketName", "category": "Best Practice", - "startLine": 2069, - "startColumn": 7, - "endLine": 2069, - "endColumn": 17, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "startLine": 43, + "startColumn": 9, + "endLine": 43, + "endColumn": 20, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'SecurityGroupChangesCloudWatchEventRule' of type 'AWS::Events::Rule' supports Tags but none are configured", + "message": "Resource 'PersonalS3' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "SecurityGroupChangesCloudWatchEventRule", + "logicalId": "PersonalS3", "entityType": "Resource", - "resourceType": "AWS::Events::Rule" + "resourceType": "AWS::S3::Bucket" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 2092, + "startLine": 42, "startColumn": 7, - "endLine": 2092, - "endColumn": 17, + "endLine": 42, + "endColumn": 18, "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "lsp/constants.yaml": { + "filePath": "lsp/constants.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 2, + "counts": { + "fatal": 5, + "errors": 0, + "warnings": 0, + "informational": 3, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'NetworkAclChangesCloudWatchEventRule' of type 'AWS::Events::Rule' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "F0005", + "severity": "FATAL", + "message": "'Constants' is not a valid top-level template section", + "source": "SCHEMA", + "propertyPath": "Constants", + "category": "Structure", + "startLine": 4, + "startColumn": 1, + "endLine": 4, + "endColumn": 10, + "ruleDescription": "Top-level keys must be valid section names", + "phase": "SCHEMA" + }, + { + "ruleId": "F1018", + "severity": "FATAL", + "message": "Fn::Sub variable '${sub}' does not reference a valid resource, parameter, or pseudo-parameter", + "source": "SCHEMA", "entity": { - "logicalId": "NetworkAclChangesCloudWatchEventRule", + "logicalId": "Bucket", "entityType": "Resource", - "resourceType": "AWS::Events::Rule" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 2120, + "propertyPath": "Metadata.Test", + "category": "Intrinsic Function", + "startLine": 15, + "startColumn": 7, + "endLine": 15, + "endColumn": 11, + "ruleDescription": "Sub variables must resolve", + "phase": "SCHEMA" + }, + { + "ruleId": "F1018", + "severity": "FATAL", + "message": "Fn::Sub variable '${foo}' does not reference a valid resource, parameter, or pseudo-parameter", + "source": "SCHEMA", + "entity": { + "logicalId": "Bucket", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" + }, + "propertyPath": "Properties.BucketName", + "category": "Intrinsic Function", + "startLine": 18, "startColumn": 7, - "endLine": 2120, + "endLine": 18, "endColumn": 17, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "ruleDescription": "Sub variables must resolve", + "phase": "SCHEMA", + "context": { + "resolutionSource": "dynamic (Sub:${foo})" + } }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'NetworkChangeCloudWatchEventRule' of type 'AWS::Events::Rule' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "F1020", + "severity": "FATAL", + "message": "'obj' is not one of ['AWS::AccountId', 'AWS::NoValue', 'AWS::NotificationARNs', 'AWS::Partition', 'AWS::Region', 'AWS::StackId', 'AWS::StackName', 'AWS::URLSuffix', 'Bucket', 'PersonalS3']", + "source": "SCHEMA", "entity": { - "logicalId": "NetworkChangeCloudWatchEventRule", + "logicalId": "Bucket", "entityType": "Resource", - "resourceType": "AWS::Events::Rule" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 2150, + "propertyPath": "Metadata.TestObj", + "suggestedFix": "Check that the Ref target exists as a resource, parameter, or pseudo-parameter", + "category": "Intrinsic Function", + "startLine": 16, "startColumn": 7, - "endLine": 2150, - "endColumn": 17, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "endLine": 16, + "endColumn": 14, + "ruleDescription": "Ref/GetAtt target must exist", + "phase": "SCHEMA" }, { - "ruleId": "I9040", - "severity": "INFO", - "message": "Resource 'BillingChangesCloudWatchAlarm' of type 'AWS::CloudWatch::Alarm' supports Tags but none are configured", - "source": "ENGINE", + "ruleId": "F1020", + "severity": "FATAL", + "message": "'foo' is not one of ['AWS::AccountId', 'AWS::NoValue', 'AWS::NotificationARNs', 'AWS::Partition', 'AWS::Region', 'AWS::StackId', 'AWS::StackName', 'AWS::URLSuffix', 'Bucket', 'PersonalS3']", + "source": "SCHEMA", "entity": { - "logicalId": "BillingChangesCloudWatchAlarm", + "logicalId": "Bucket", "entityType": "Resource", - "resourceType": "AWS::CloudWatch::Alarm" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", - "category": "Best Practice", - "startLine": 2201, - "startColumn": 7, - "endLine": 2201, - "endColumn": 17, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "propertyPath": "Properties.Tags.0.Value", + "suggestedFix": "Check that the Ref target exists as a resource, parameter, or pseudo-parameter", + "category": "Intrinsic Function", + "startLine": 21, + "startColumn": 11, + "endLine": 21, + "endColumn": 16, + "ruleDescription": "Ref/GetAtt target must exist", + "phase": "SCHEMA" }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'RoleForDisableUnusedCredentialsFunction' of type 'AWS::IAM::Role' supports Tags but none are configured", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "RoleForDisableUnusedCredentialsFunction", + "logicalId": "Bucket", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.BucketName", "category": "Best Practice", - "startLine": 2221, + "startLine": 18, "startColumn": 7, - "endLine": 2221, + "endLine": 18, "endColumn": 17, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "dynamic (Sub:${foo})" + } }, { - "ruleId": "I9040", + "ruleId": "I9001", "severity": "INFO", - "message": "Resource 'FunctionToDisableUnusedCredentials' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "FunctionToDisableUnusedCredentials", + "logicalId": "PersonalS3", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.Tags", - "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "propertyPath": "Properties.BucketName", "category": "Best Practice", - "startLine": 2254, + "startLine": 26, "startColumn": 7, - "endLine": 2254, + "endLine": 26, "endColumn": 17, - "ruleDescription": "Resource should have Tags", - "phase": "LINT" + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'ScheduledRuleForDisableUnusedCredentials' of type 'AWS::Events::Rule' supports Tags but none are configured", + "message": "Resource 'PersonalS3' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "ScheduledRuleForDisableUnusedCredentials", + "logicalId": "PersonalS3", "entityType": "Resource", - "resourceType": "AWS::Events::Rule" + "resourceType": "AWS::S3::Bucket" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 2348, - "startColumn": 7, - "endLine": 2348, - "endColumn": 17, + "startLine": 25, + "startColumn": 5, + "endLine": 25, + "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" } ] }, - "quickstart/config-rules.json": { - "filePath": "quickstart/config-rules.json", + "lsp/parameter_usage.json": { + "filePath": "lsp/parameter_usage.json", "status": "OK", "metadata": { - "resourcesScanned": 12, + "resourcesScanned": 5, "counts": { "fatal": 0, - "errors": 2, - "warnings": 5, - "informational": 15, + "errors": 1, + "warnings": 3, + "informational": 10, "debug": 0 }, "suppressed": 0, @@ -23867,164 +18882,137 @@ }, "diagnostics": [ { - "ruleId": "E2533", - "severity": "ERROR", - "message": "Runtime 'nodejs' was deprecated on '2016-08-30'. Creation was disabled on '2016-09-30', and updates were disabled on '2016-10-31'. Please consider updating to 'nodejs24.x'", - "source": "CFN_LINT", - "entity": { - "logicalId": "rAMIComplianceFunction", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" - }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 194, - "startColumn": 5, - "endLine": 194, - "endColumn": 13, - "ruleDescription": "Check if Lambda Function Runtimes are updatable", - "phase": "SCHEMA", - "context": { - "actualValue": "nodejs", - "lifecycle": "end-of-life" - } - }, - { - "ruleId": "E2533", + "ruleId": "E3001", "severity": "ERROR", - "message": "Runtime 'nodejs' was deprecated on '2016-08-30'. Creation was disabled on '2016-09-30', and updates were disabled on '2016-10-31'. Please consider updating to 'nodejs24.x'", + "message": "Resource 'Bucket1' has invalid property 'Conditions'. Valid resource attributes: Type, Properties, DependsOn, Condition, Metadata, DeletionPolicy, UpdateReplacePolicy, UpdatePolicy, CreationPolicy, Fn::Transform, Version", "source": "CFN_LINT", "entity": { - "logicalId": "rCloudTrailValidationFunction", + "logicalId": "Bucket1", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.Runtime", - "category": "Deprecation", - "startLine": 291, - "startColumn": 5, - "endLine": 291, - "endColumn": 13, - "ruleDescription": "Check if Lambda Function Runtimes are updatable", - "phase": "SCHEMA", - "context": { - "actualValue": "nodejs", - "lifecycle": "end-of-life" - } + "category": "Resource", + "startLine": 31, + "startColumn": 7, + "endLine": 31, + "endColumn": 18, + "ruleDescription": "Basic CloudFormation Resource Check", + "phase": "PARSE" }, { - "ruleId": "W3005", + "ruleId": "W7001", "severity": "WARN", - "message": "'rConfigRulesLambdaRole' dependency already enforced by a 'GetAtt' at 'Properties.Role'", + "message": "Mapping 'EnvMap' is not referenced by any Fn::FindInMap", "source": "CFN_LINT", "entity": { - "logicalId": "rAMIComplianceFunction", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "logicalId": "EnvMap", + "entityType": "Mapping" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", + "propertyPath": "Mappings/EnvMap", "category": "Best Practice", - "startLine": 141, - "startColumn": 4, - "endLine": 141, - "endColumn": 14, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "startLine": 11, + "startColumn": 5, + "endLine": 11, + "endColumn": 12, + "ruleDescription": "Check if Mappings are Used", "phase": "LINT" }, { - "ruleId": "W3005", + "ruleId": "W8001", "severity": "WARN", - "message": "'rConfigRulesLambdaRole' dependency already enforced by a 'GetAtt' at 'Properties.Role'", + "message": "Condition 'IsProduction' is not used by any resource or Fn::If", "source": "CFN_LINT", "entity": { - "logicalId": "rCloudTrailValidationFunction", - "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "logicalId": "IsProduction", + "entityType": "Condition" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", + "propertyPath": "Conditions/IsProduction", "category": "Best Practice", - "startLine": 239, - "startColumn": 4, - "endLine": 239, - "endColumn": 14, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "startLine": 21, + "startColumn": 5, + "endLine": 21, + "endColumn": 18, + "ruleDescription": "Check if Conditions are Used", "phase": "LINT" }, { - "ruleId": "W8003", + "ruleId": "W8001", "severity": "WARN", - "message": "Fn::Equals in condition 'cApprovedAMIsRule' will always return True", + "message": "Condition 'IsDevEnv' is not used by any resource or Fn::If", "source": "CFN_LINT", "entity": { - "logicalId": "cApprovedAMIsRule", + "logicalId": "IsDevEnv", "entityType": "Condition" }, - "propertyPath": "Conditions/cApprovedAMIsRule", + "propertyPath": "Conditions/IsDevEnv", "category": "Best Practice", - "startLine": 38, - "startColumn": 3, - "endLine": 38, - "endColumn": 21, - "ruleDescription": "Fn::Equals will always return true or false", - "phase": "PARSE" + "startLine": 24, + "startColumn": 5, + "endLine": 24, + "endColumn": 14, + "ruleDescription": "Check if Conditions are Used", + "phase": "LINT" }, { - "ruleId": "W9003", - "severity": "WARN", - "message": "'30' is not of type 'integer' - automatically coerced (string to integer)", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "rAMIComplianceFunction", + "logicalId": "Bucket1", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.Timeout", + "propertyPath": "Properties.BucketName", "category": "Best Practice", - "startLine": 195, - "startColumn": 5, - "endLine": 195, - "endColumn": 13, - "ruleDescription": "Property type coercion warning", - "phase": "SCHEMA" + "startLine": 33, + "startColumn": 9, + "endLine": 33, + "endColumn": 20, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { - "ruleId": "W9003", - "severity": "WARN", - "message": "'30' is not of type 'integer' - automatically coerced (string to integer)", - "source": "CFN_LINT", + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", "entity": { - "logicalId": "rCloudTrailValidationFunction", + "logicalId": "Bucket2", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.Timeout", + "propertyPath": "Properties.BucketName", "category": "Best Practice", - "startLine": 292, - "startColumn": 5, - "endLine": 292, - "endColumn": 13, - "ruleDescription": "Property type coercion warning", - "phase": "SCHEMA" + "startLine": 41, + "startColumn": 9, + "endLine": 41, + "endColumn": 20, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ConfigRuleName' is create-only; updating it will cause resource replacement", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "rConfigRuleForSSH", + "logicalId": "Bucket3", "entityType": "Resource", - "resourceType": "AWS::Config::ConfigRule" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.ConfigRuleName", + "propertyPath": "Properties.BucketName", "category": "Best Practice", - "startLine": 48, - "startColumn": 5, - "endLine": 48, + "startLine": 49, + "startColumn": 9, + "endLine": 49, "endColumn": 20, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-config.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -24034,20 +19022,19 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ConfigRuleName' is create-only; updating it will cause resource replacement", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "rConfigRuleForRequiredTags", + "logicalId": "Bucket4", "entityType": "Resource", - "resourceType": "AWS::Config::ConfigRule" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.ConfigRuleName", + "propertyPath": "Properties.BucketName", "category": "Best Practice", - "startLine": 63, - "startColumn": 5, - "endLine": 63, + "startLine": 57, + "startColumn": 9, + "endLine": 57, "endColumn": 20, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-config.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -24057,20 +19044,19 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ConfigRuleName' is create-only; updating it will cause resource replacement", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "rConfigRuleForUnrestrictedPorts", + "logicalId": "Bucket5", "entityType": "Resource", - "resourceType": "AWS::Config::ConfigRule" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.ConfigRuleName", + "propertyPath": "Properties.BucketName", "category": "Best Practice", - "startLine": 83, - "startColumn": 5, - "endLine": 83, + "startLine": 65, + "startColumn": 9, + "endLine": 65, "endColumn": 20, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-config.git", "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -24078,112 +19064,234 @@ } }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Path' is create-only; updating it will cause resource replacement", + "message": "Resource 'Bucket1' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "rConfigRulesLambdaRole", + "logicalId": "Bucket1", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.Path", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 110, - "startColumn": 5, - "endLine": 110, - "endColumn": 10, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 32, + "startColumn": 7, + "endLine": 32, + "endColumn": 18, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Path' is create-only; updating it will cause resource replacement", + "message": "Resource 'Bucket2' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "rConfigRulesLambdaProfile", + "logicalId": "Bucket2", "entityType": "Resource", - "resourceType": "AWS::IAM::InstanceProfile" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.Path", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 133, - "startColumn": 5, - "endLine": 133, - "endColumn": 10, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "startLine": 40, + "startColumn": 7, + "endLine": 40, + "endColumn": 18, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'ConfigRuleName' is create-only; updating it will cause resource replacement", + "message": "Resource 'Bucket3' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "rConfigRuleForAMICompliance", + "logicalId": "Bucket3", "entityType": "Resource", - "resourceType": "AWS::Config::ConfigRule" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.ConfigRuleName", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 205, + "startLine": 48, + "startColumn": 7, + "endLine": 48, + "endColumn": 18, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Bucket4' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "Bucket4", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 56, + "startColumn": 7, + "endLine": 56, + "endColumn": 18, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Bucket5' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "Bucket5", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 64, + "startColumn": 7, + "endLine": 64, + "endColumn": 18, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "lsp/parameter_usage.yaml": { + "filePath": "lsp/parameter_usage.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 7, + "counts": { + "fatal": 0, + "errors": 1, + "warnings": 3, + "informational": 14, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "E3001", + "severity": "ERROR", + "message": "Resource 'Bucket1' has invalid property 'Conditions'. Valid resource attributes: Type, Properties, DependsOn, Condition, Metadata, DeletionPolicy, UpdateReplacePolicy, UpdatePolicy, CreationPolicy, Fn::Transform, Version", + "source": "CFN_LINT", + "entity": { + "logicalId": "Bucket1", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" + }, + "category": "Resource", + "startLine": 27, "startColumn": 5, - "endLine": 205, - "endColumn": 20, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-config.git", - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "endLine": 27, + "endColumn": 15, + "ruleDescription": "Basic CloudFormation Resource Check", + "phase": "PARSE" + }, + { + "ruleId": "W7001", + "severity": "WARN", + "message": "Mapping 'EnvMap' is not referenced by any Fn::FindInMap", + "source": "CFN_LINT", + "entity": { + "logicalId": "EnvMap", + "entityType": "Mapping" + }, + "propertyPath": "Mappings/EnvMap", + "category": "Best Practice", + "startLine": 12, + "startColumn": 3, + "endLine": 12, + "endColumn": 9, + "ruleDescription": "Check if Mappings are Used", + "phase": "LINT" + }, + { + "ruleId": "W8001", + "severity": "WARN", + "message": "Condition 'IsProduction' is not used by any resource or Fn::If", + "source": "CFN_LINT", + "entity": { + "logicalId": "IsProduction", + "entityType": "Condition" + }, + "propertyPath": "Conditions/IsProduction", + "category": "Best Practice", + "startLine": 20, + "startColumn": 3, + "endLine": 20, + "endColumn": 15, + "ruleDescription": "Check if Conditions are Used", + "phase": "LINT" + }, + { + "ruleId": "W8001", + "severity": "WARN", + "message": "Condition 'IsDevEnv' is not used by any resource or Fn::If", + "source": "CFN_LINT", + "entity": { + "logicalId": "IsDevEnv", + "entityType": "Condition" + }, + "propertyPath": "Conditions/IsDevEnv", + "category": "Best Practice", + "startLine": 21, + "startColumn": 3, + "endLine": 21, + "endColumn": 11, + "ruleDescription": "Check if Conditions are Used", + "phase": "LINT" }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "rConfigPermissionToCallLambdaAMICompliance", + "logicalId": "Bucket1", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.FunctionName", + "propertyPath": "Properties.BucketName", "category": "Best Practice", - "startLine": 230, - "startColumn": 5, - "endLine": 230, - "endColumn": 18, + "startLine": 29, + "startColumn": 7, + "endLine": 29, + "endColumn": 17, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt rAMIComplianceFunction.Arn" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Action' is create-only; updating it will cause resource replacement", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "rConfigPermissionToCallLambdaAMICompliance", + "logicalId": "Bucket2", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.Action", + "propertyPath": "Properties.BucketName", "category": "Best Practice", - "startLine": 233, - "startColumn": 5, - "endLine": 233, - "endColumn": 12, + "startLine": 35, + "startColumn": 7, + "endLine": 35, + "endColumn": 17, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -24193,19 +19301,19 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Principal' is create-only; updating it will cause resource replacement", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "rConfigPermissionToCallLambdaAMICompliance", + "logicalId": "Bucket3", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.Principal", + "propertyPath": "Properties.BucketName", "category": "Best Practice", - "startLine": 234, - "startColumn": 5, - "endLine": 234, - "endColumn": 15, + "startLine": 42, + "startColumn": 7, + "endLine": 42, + "endColumn": 17, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -24215,20 +19323,19 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'ConfigRuleName' is create-only; updating it will cause resource replacement", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "rConfigRuleForCloudTrail", + "logicalId": "Bucket4", "entityType": "Resource", - "resourceType": "AWS::Config::ConfigRule" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.ConfigRuleName", + "propertyPath": "Properties.BucketName", "category": "Best Practice", - "startLine": 301, - "startColumn": 5, - "endLine": 301, - "endColumn": 20, - "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-config.git", + "startLine": 48, + "startColumn": 7, + "endLine": 48, + "endColumn": 17, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -24238,42 +19345,41 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "rConfigPermissionToCallLambdaCloudTrail", + "logicalId": "Bucket5", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.FunctionName", + "propertyPath": "Properties.BucketName", "category": "Best Practice", - "startLine": 322, - "startColumn": 5, - "endLine": 322, - "endColumn": 18, + "startLine": 53, + "startColumn": 7, + "endLine": 53, + "endColumn": 17, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { - "lifecycle": "create-only", - "resolutionSource": "GetAtt rCloudTrailValidationFunction.Arn" + "lifecycle": "create-only" } }, { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Action' is create-only; updating it will cause resource replacement", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "rConfigPermissionToCallLambdaCloudTrail", + "logicalId": "Bucket6", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.Action", + "propertyPath": "Properties.BucketName", "category": "Best Practice", - "startLine": 325, - "startColumn": 5, - "endLine": 325, - "endColumn": 12, + "startLine": 58, + "startColumn": 7, + "endLine": 58, + "endColumn": 17, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -24283,19 +19389,19 @@ { "ruleId": "I9001", "severity": "INFO", - "message": "Property 'Principal' is create-only; updating it will cause resource replacement", + "message": "Property 'BucketName' is create-only; updating it will cause resource replacement", "source": "ENGINE", "entity": { - "logicalId": "rConfigPermissionToCallLambdaCloudTrail", + "logicalId": "Bucket7", "entityType": "Resource", - "resourceType": "AWS::Lambda::Permission" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.Principal", + "propertyPath": "Properties.BucketName", "category": "Best Practice", - "startLine": 326, - "startColumn": 5, - "endLine": 326, - "endColumn": 15, + "startLine": 64, + "startColumn": 7, + "endLine": 64, + "endColumn": 17, "ruleDescription": "Create-only property updated triggers resource replacement", "phase": "SCHEMA", "context": { @@ -24305,19 +19411,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'rConfigRulesLambdaRole' of type 'AWS::IAM::Role' supports Tags but none are configured", + "message": "Resource 'Bucket1' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "rConfigRulesLambdaRole", + "logicalId": "Bucket1", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::S3::Bucket" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 99, - "startColumn": 4, - "endLine": 99, + "startLine": 28, + "startColumn": 5, + "endLine": 28, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -24325,244 +19431,79 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'rCloudTrailValidationFunction' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "message": "Resource 'Bucket2' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "rCloudTrailValidationFunction", + "logicalId": "Bucket2", "entityType": "Resource", - "resourceType": "AWS::Lambda::Function" + "resourceType": "AWS::S3::Bucket" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 240, - "startColumn": 4, - "endLine": 240, + "startLine": 34, + "startColumn": 5, + "endLine": 34, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" - } - ] - }, - "quickstart/iam.json": { - "filePath": "quickstart/iam.json", - "status": "OK", - "metadata": { - "resourcesScanned": 18, - "counts": { - "fatal": 0, - "errors": 0, - "warnings": 5, - "informational": 8, - "debug": 0 }, - "suppressed": 0, - "strict": false, - "severityLevel": "DEBUG" - }, - "diagnostics": [ { - "ruleId": "W2512", - "severity": "WARN", - "message": "IAM policy uses NotAction which grants all actions except those listed - consider using Action instead", + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Bucket3' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "rSysAdminPolicy", - "entityType": "Resource", - "resourceType": "AWS::IAM::ManagedPolicy" - }, - "category": "Security", - "startLine": 61, - "startColumn": 3, - "endLine": 61, - "endColumn": 19, - "ruleDescription": "IAM policy with NotAction", - "phase": "LINT" - }, - { - "ruleId": "W3005", - "severity": "WARN", - "message": "'rSysAdminRole' dependency already enforced by a 'Ref' at 'Properties.Roles.0'", - "source": "CFN_LINT", - "entity": { - "logicalId": "rSysAdminProfile", - "entityType": "Resource", - "resourceType": "AWS::IAM::InstanceProfile" - }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", - "category": "Best Practice", - "startLine": 45, - "startColumn": 4, - "endLine": 45, - "endColumn": 14, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", - "phase": "LINT" - }, - { - "ruleId": "W3005", - "severity": "WARN", - "message": "'rIAMAdminRole' dependency already enforced by a 'Ref' at 'Properties.Roles.0'", - "source": "CFN_LINT", - "entity": { - "logicalId": "rIAMAdminProfile", - "entityType": "Resource", - "resourceType": "AWS::IAM::InstanceProfile" - }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", - "category": "Best Practice", - "startLine": 139, - "startColumn": 4, - "endLine": 139, - "endColumn": 14, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", - "phase": "LINT" - }, - { - "ruleId": "W3005", - "severity": "WARN", - "message": "'rInstanceOpsRole' dependency already enforced by a 'Ref' at 'Properties.Roles.0'", - "source": "CFN_LINT", - "entity": { - "logicalId": "rInstanceOpsProfile", - "entityType": "Resource", - "resourceType": "AWS::IAM::InstanceProfile" - }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", - "category": "Best Practice", - "startLine": 211, - "startColumn": 4, - "endLine": 211, - "endColumn": 14, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", - "phase": "LINT" - }, - { - "ruleId": "W3005", - "severity": "WARN", - "message": "'rReadOnlyAdminRole' dependency already enforced by a 'Ref' at 'Properties.Roles.0'", - "source": "CFN_LINT", - "entity": { - "logicalId": "rReadOnlyAdminProfile", + "logicalId": "Bucket3", "entityType": "Resource", - "resourceType": "AWS::IAM::InstanceProfile" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "DependsOn", - "suggestedFix": "Remove the DependsOn entry", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 324, - "startColumn": 4, - "endLine": 324, - "endColumn": 14, - "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "startLine": 41, + "startColumn": 5, + "endLine": 41, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", "phase": "LINT" }, { - "ruleId": "I9001", + "ruleId": "I9040", "severity": "INFO", - "message": "Property 'Path' is create-only; updating it will cause resource replacement", + "message": "Resource 'Bucket4' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "rSysAdminProfile", + "logicalId": "Bucket4", "entityType": "Resource", - "resourceType": "AWS::IAM::InstanceProfile" + "resourceType": "AWS::S3::Bucket" }, - "propertyPath": "Properties.Path", + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", "startLine": 47, "startColumn": 5, "endLine": 47, - "endColumn": 10, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Path' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "rIAMAdminProfile", - "entityType": "Resource", - "resourceType": "AWS::IAM::InstanceProfile" - }, - "propertyPath": "Properties.Path", - "category": "Best Practice", - "startLine": 141, - "startColumn": 5, - "endLine": 141, - "endColumn": 10, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Path' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "rInstanceOpsProfile", - "entityType": "Resource", - "resourceType": "AWS::IAM::InstanceProfile" - }, - "propertyPath": "Properties.Path", - "category": "Best Practice", - "startLine": 213, - "startColumn": 5, - "endLine": 213, - "endColumn": 10, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } - }, - { - "ruleId": "I9001", - "severity": "INFO", - "message": "Property 'Path' is create-only; updating it will cause resource replacement", - "source": "ENGINE", - "entity": { - "logicalId": "rReadOnlyAdminProfile", - "entityType": "Resource", - "resourceType": "AWS::IAM::InstanceProfile" - }, - "propertyPath": "Properties.Path", - "category": "Best Practice", - "startLine": 326, - "startColumn": 5, - "endLine": 326, - "endColumn": 10, - "ruleDescription": "Create-only property updated triggers resource replacement", - "phase": "SCHEMA", - "context": { - "lifecycle": "create-only" - } + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" }, { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'rSysAdminRole' of type 'AWS::IAM::Role' supports Tags but none are configured", + "message": "Resource 'Bucket5' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "rSysAdminRole", + "logicalId": "Bucket5", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::S3::Bucket" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 24, - "startColumn": 4, - "endLine": 24, + "startLine": 52, + "startColumn": 5, + "endLine": 52, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -24570,19 +19511,19 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'rIAMAdminRole' of type 'AWS::IAM::Role' supports Tags but none are configured", + "message": "Resource 'Bucket6' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "rIAMAdminRole", + "logicalId": "Bucket6", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::S3::Bucket" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 119, - "startColumn": 4, - "endLine": 119, + "startLine": 57, + "startColumn": 5, + "endLine": 57, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" @@ -24590,40 +19531,59 @@ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'rInstanceOpsRole' of type 'AWS::IAM::Role' supports Tags but none are configured", + "message": "Resource 'Bucket7' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "rInstanceOpsRole", + "logicalId": "Bucket7", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::S3::Bucket" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 191, - "startColumn": 4, - "endLine": 191, + "startLine": 63, + "startColumn": 5, + "endLine": 63, "endColumn": 15, "ruleDescription": "Resource should have Tags", "phase": "LINT" + } + ] + }, + "lsp/simple.json": { + "filePath": "lsp/simple.json", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 1, + "debug": 0 }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ { "ruleId": "I9040", "severity": "INFO", - "message": "Resource 'rReadOnlyAdminRole' of type 'AWS::IAM::Role' supports Tags but none are configured", + "message": "Resource 'MyS3Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", "source": "ENGINE", "entity": { - "logicalId": "rReadOnlyAdminRole", + "logicalId": "MyS3Bucket", "entityType": "Resource", - "resourceType": "AWS::IAM::Role" + "resourceType": "AWS::S3::Bucket" }, "propertyPath": "Properties.Tags", "suggestedFix": "Add Tags to improve resource organization and cost tracking", "category": "Best Practice", - "startLine": 304, - "startColumn": 4, - "endLine": 304, - "endColumn": 15, + "startLine": 4, + "startColumn": 5, + "endLine": 4, + "endColumn": 16, "ruleDescription": "Resource should have Tags", "phase": "LINT" } diff --git a/src/resources/expected/validation_reports8.json b/src/resources/expected/validation_reports8.json index 25b0a08a..b01f97c9 100644 --- a/src/resources/expected/validation_reports8.json +++ b/src/resources/expected/validation_reports8.json @@ -1,4 +1,7140 @@ { + "lsp/simple.yaml": { + "filePath": "lsp/simple.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 1, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'MyS3Bucket' of type 'AWS::S3::Bucket' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "MyS3Bucket", + "entityType": "Resource", + "resourceType": "AWS::S3::Bucket" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 3, + "startColumn": 3, + "endLine": 3, + "endColumn": 13, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "lsp/test-template.yaml": { + "filePath": "lsp/test-template.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 2, + "counts": { + "fatal": 0, + "errors": 2, + "warnings": 0, + "informational": 2, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "E3038", + "severity": "ERROR", + "message": "Resource type 'AWS::Serverless::Function' requires the AWS::Serverless-2016-10-31 transform", + "source": "CFN_LINT", + "entity": { + "logicalId": "MyFunction", + "entityType": "Resource", + "resourceType": "AWS::Serverless::Function" + }, + "category": "Structure", + "startLine": 2, + "startColumn": 3, + "endLine": 2, + "endColumn": 13, + "ruleDescription": "Check if Serverless Resources have Serverless Transform", + "phase": "LINT" + }, + { + "ruleId": "E3038", + "severity": "ERROR", + "message": "Resource type 'AWS::Serverless::Api' requires the AWS::Serverless-2016-10-31 transform", + "source": "CFN_LINT", + "entity": { + "logicalId": "MyApi", + "entityType": "Resource", + "resourceType": "AWS::Serverless::Api" + }, + "category": "Structure", + "startLine": 6, + "startColumn": 3, + "endLine": 6, + "endColumn": 8, + "ruleDescription": "Check if Serverless Resources have Serverless Transform", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'MyFunction' of type 'AWS::Serverless::Function' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "MyFunction", + "entityType": "Resource", + "resourceType": "AWS::Serverless::Function" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 4, + "startColumn": 5, + "endLine": 4, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'MyApi' of type 'AWS::Serverless::Api' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "MyApi", + "entityType": "Resource", + "resourceType": "AWS::Serverless::Api" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 8, + "startColumn": 5, + "endLine": 8, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "malformed.yaml": { + "filePath": "malformed.yaml", + "status": "ERROR", + "metadata": { + "resourcesScanned": 0, + "counts": { + "fatal": 1, + "errors": 0, + "warnings": 0, + "informational": 0, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "F1101", + "severity": "FATAL", + "message": "YAML parse error: mapping values are not allowed in this context at byte 10 line 1 column 11", + "source": "SCHEMA", + "category": "Structure", + "startLine": 1, + "startColumn": 11, + "endLine": 1, + "endColumn": 11, + "ruleDescription": "Invalid YAML/JSON syntax", + "phase": "PARSE" + } + ] + }, + "public/lambda-poller.json": { + "filePath": "public/lambda-poller.json", + "status": "OK", + "metadata": { + "resourcesScanned": 5, + "counts": { + "fatal": 0, + "errors": 1, + "warnings": 0, + "informational": 9, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "E2533", + "severity": "ERROR", + "message": "Runtime 'nodejs6.10' was deprecated on '2019-08-12'. Creation was disabled on '2019-07-12', and updates were disabled on '2019-08-12'. Please consider updating to 'nodejs24.x'", + "source": "CFN_LINT", + "entity": { + "logicalId": "PollerFunction", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 92, + "startColumn": 17, + "endLine": 92, + "endColumn": 25, + "ruleDescription": "Check if Lambda Function Runtimes are updatable", + "phase": "SCHEMA", + "context": { + "actualValue": "nodejs6.10", + "lifecycle": "end-of-life" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Path' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "PollerFunctionIamRole", + "entityType": "Resource", + "resourceType": "AWS::IAM::Role" + }, + "propertyPath": "Properties.Path", + "category": "Best Practice", + "startLine": 37, + "startColumn": 17, + "endLine": 37, + "endColumn": 22, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Path' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "PollerEventRuleIamRole", + "entityType": "Resource", + "resourceType": "AWS::IAM::Role" + }, + "propertyPath": "Properties.Path", + "category": "Best Practice", + "startLine": 133, + "startColumn": 17, + "endLine": 133, + "endColumn": 22, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Action' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "PollerFunctionEventInvokePermission", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties.Action", + "category": "Best Practice", + "startLine": 192, + "startColumn": 17, + "endLine": 192, + "endColumn": 24, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "PollerFunctionEventInvokePermission", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties.FunctionName", + "category": "Best Practice", + "startLine": 193, + "startColumn": 17, + "endLine": 193, + "endColumn": 30, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'PollerFunction'" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Principal' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "PollerFunctionEventInvokePermission", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties.Principal", + "category": "Best Practice", + "startLine": 196, + "startColumn": 17, + "endLine": 196, + "endColumn": 27, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'SourceArn' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "PollerFunctionEventInvokePermission", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties.SourceArn", + "category": "Best Practice", + "startLine": 197, + "startColumn": 17, + "endLine": 197, + "endColumn": 27, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "GetAtt PollerEventRule.Arn" + } + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'PollerFunctionIamRole' of type 'AWS::IAM::Role' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "PollerFunctionIamRole", + "entityType": "Resource", + "resourceType": "AWS::IAM::Role" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 20, + "startColumn": 13, + "endLine": 20, + "endColumn": 24, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'PollerEventRuleIamRole' of type 'AWS::IAM::Role' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "PollerEventRuleIamRole", + "entityType": "Resource", + "resourceType": "AWS::IAM::Role" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 116, + "startColumn": 13, + "endLine": 116, + "endColumn": 24, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'PollerEventRule' of type 'AWS::Events::Rule' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "PollerEventRule", + "entityType": "Resource", + "resourceType": "AWS::Events::Rule" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 162, + "startColumn": 13, + "endLine": 162, + "endColumn": 24, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "public/lambda-poller.yaml": { + "filePath": "public/lambda-poller.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 5, + "counts": { + "fatal": 0, + "errors": 1, + "warnings": 0, + "informational": 9, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "E2533", + "severity": "ERROR", + "message": "Runtime 'nodejs6.10' was deprecated on '2019-08-12'. Creation was disabled on '2019-07-12', and updates were disabled on '2019-08-12'. Please consider updating to 'nodejs24.x'", + "source": "CFN_LINT", + "entity": { + "logicalId": "PollerFunction", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 151, + "startColumn": 7, + "endLine": 151, + "endColumn": 14, + "ruleDescription": "Check if Lambda Function Runtimes are updatable", + "phase": "SCHEMA", + "context": { + "actualValue": "nodejs6.10", + "lifecycle": "end-of-life" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Path' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "PollerFunctionIamRole", + "entityType": "Resource", + "resourceType": "AWS::IAM::Role" + }, + "propertyPath": "Properties.Path", + "category": "Best Practice", + "startLine": 27, + "startColumn": 7, + "endLine": 27, + "endColumn": 11, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Path' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "PollerEventRuleIamRole", + "entityType": "Resource", + "resourceType": "AWS::IAM::Role" + }, + "propertyPath": "Properties.Path", + "category": "Best Practice", + "startLine": 172, + "startColumn": 7, + "endLine": 172, + "endColumn": 11, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Action' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "PollerFunctionEventInvokePermission", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties.Action", + "category": "Best Practice", + "startLine": 197, + "startColumn": 7, + "endLine": 197, + "endColumn": 13, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "PollerFunctionEventInvokePermission", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties.FunctionName", + "category": "Best Practice", + "startLine": 198, + "startColumn": 7, + "endLine": 198, + "endColumn": 19, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Ref to 'PollerFunction'" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Principal' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "PollerFunctionEventInvokePermission", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties.Principal", + "category": "Best Practice", + "startLine": 199, + "startColumn": 7, + "endLine": 199, + "endColumn": 16, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'SourceArn' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "PollerFunctionEventInvokePermission", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties.SourceArn", + "category": "Best Practice", + "startLine": 200, + "startColumn": 7, + "endLine": 200, + "endColumn": 16, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "GetAtt PollerEventRule.Arn" + } + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'PollerFunctionIamRole' of type 'AWS::IAM::Role' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "PollerFunctionIamRole", + "entityType": "Resource", + "resourceType": "AWS::IAM::Role" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 17, + "startColumn": 5, + "endLine": 17, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'PollerEventRuleIamRole' of type 'AWS::IAM::Role' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "PollerEventRuleIamRole", + "entityType": "Resource", + "resourceType": "AWS::IAM::Role" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 162, + "startColumn": 5, + "endLine": 162, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'PollerEventRule' of type 'AWS::Events::Rule' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "PollerEventRule", + "entityType": "Resource", + "resourceType": "AWS::Events::Rule" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 185, + "startColumn": 5, + "endLine": 185, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "public/rds-cluster.yaml": { + "filePath": "public/rds-cluster.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 1, + "warnings": 1, + "informational": 7, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "E9006", + "severity": "ERROR", + "message": "'aurora' is not one of ['aurora-mysql', 'aurora-postgresql', 'mysql', 'postgres']", + "source": "CFN_LINT", + "entity": { + "logicalId": "DBCluster", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBCluster" + }, + "propertyPath": "Properties.Engine", + "category": "Schema", + "startLine": 24, + "startColumn": 7, + "endLine": 24, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", + "ruleDescription": "Property value not valid for conditional extension enum", + "phase": "SCHEMA" + }, + { + "ruleId": "W1011", + "severity": "WARN", + "message": "Use dynamic references (e.g., SSM SecureString) instead of parameter 'DatabaseMasterPassword' for secrets", + "source": "CFN_LINT", + "entity": { + "logicalId": "DBCluster", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBCluster" + }, + "propertyPath": "Properties.MasterUserPassword", + "category": "Security", + "startLine": 22, + "startColumn": 7, + "endLine": 22, + "endColumn": 25, + "ruleDescription": "Instead of REFing a parameter for a secret use a dynamic reference", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "DBCluster", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBCluster" + }, + "category": "Best Practice", + "startLine": 18, + "startColumn": 3, + "endLine": 18, + "endColumn": 12, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "DBCluster", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBCluster" + }, + "category": "Best Practice", + "startLine": 18, + "startColumn": 3, + "endLine": 18, + "endColumn": 12, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3013", + "severity": "INFO", + "message": "'BackupRetentionPeriod' is a required property (The default retention period will delete the data after a pre-defined time. Set an explicit values to avoid data loss on resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "DBCluster", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBCluster" + }, + "propertyPath": "Properties", + "category": "Best Practice", + "startLine": 20, + "startColumn": 5, + "endLine": 20, + "endColumn": 15, + "ruleDescription": "Check resources with auto expiring content have explicit retention period", + "phase": "LINT" + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'MasterUsername' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "DBCluster", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBCluster" + }, + "propertyPath": "Properties.MasterUsername", + "category": "Best Practice", + "startLine": 21, + "startColumn": 7, + "endLine": 21, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only", + "resolutionSource": "parameter 'DatabaseMasterUsername' (type String)" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'DatabaseName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "DBCluster", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBCluster" + }, + "propertyPath": "Properties.DatabaseName", + "category": "Best Practice", + "startLine": 23, + "startColumn": 7, + "endLine": 23, + "endColumn": 19, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "parameter 'DatabaseName' (type String)" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Engine' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "DBCluster", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBCluster" + }, + "propertyPath": "Properties.Engine", + "category": "Best Practice", + "startLine": 24, + "startColumn": 7, + "endLine": 24, + "endColumn": 13, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'EngineMode' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "DBCluster", + "entityType": "Resource", + "resourceType": "AWS::RDS::DBCluster" + }, + "propertyPath": "Properties.EngineMode", + "category": "Best Practice", + "startLine": 25, + "startColumn": 7, + "endLine": 25, + "endColumn": 17, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-rds", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + } + ] + }, + "public/watchmaker.json": { + "filePath": "public/watchmaker.json", + "status": "OK", + "metadata": { + "resourcesScanned": 2, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 41, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "I1022", + "severity": "INFO", + "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", + "source": "CFN_LINT", + "entity": { + "logicalId": "WatchmakerInstance", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Metadata.AWS::CloudFormation::Init.cw-agent-install.commands.01-get-cloudwatch-agent.command.Fn::Join", + "category": "Intrinsic Function", + "startLine": 647, + "startColumn": 37, + "endLine": 647, + "endColumn": 46, + "ruleDescription": "Use Sub instead of Join", + "phase": "LINT" + }, + { + "ruleId": "I1022", + "severity": "INFO", + "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", + "source": "CFN_LINT", + "entity": { + "logicalId": "WatchmakerInstance", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Metadata.AWS::CloudFormation::Init.cw-agent-install.commands.02-extract-cloudwatch-agent.command.Fn::Join", + "category": "Intrinsic Function", + "startLine": 662, + "startColumn": 37, + "endLine": 662, + "endColumn": 46, + "ruleDescription": "Use Sub instead of Join", + "phase": "LINT" + }, + { + "ruleId": "I1022", + "severity": "INFO", + "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", + "source": "CFN_LINT", + "entity": { + "logicalId": "WatchmakerInstance", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Metadata.AWS::CloudFormation::Init.cw-agent-install.commands.10-install-cloudwatch-agent.command.Fn::Join", + "category": "Intrinsic Function", + "startLine": 673, + "startColumn": 37, + "endLine": 673, + "endColumn": 46, + "ruleDescription": "Use Sub instead of Join", + "phase": "LINT" + }, + { + "ruleId": "I1022", + "severity": "INFO", + "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", + "source": "CFN_LINT", + "entity": { + "logicalId": "WatchmakerInstance", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Metadata.AWS::CloudFormation::Init.finalize.commands.10-signal-success.command.Fn::Join.1.4.Fn::If.1.Fn::Join", + "category": "Intrinsic Function", + "startLine": 816, + "startColumn": 57, + "endLine": 816, + "endColumn": 66, + "ruleDescription": "Use Sub instead of Join", + "phase": "LINT" + }, + { + "ruleId": "I1022", + "severity": "INFO", + "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", + "source": "CFN_LINT", + "entity": { + "logicalId": "WatchmakerInstance", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Metadata.AWS::CloudFormation::Init.finalize.commands.10-signal-success.command.Fn::Join.1.5.Fn::If.1.Fn::Join", + "category": "Intrinsic Function", + "startLine": 833, + "startColumn": 57, + "endLine": 833, + "endColumn": 66, + "ruleDescription": "Use Sub instead of Join", + "phase": "LINT" + }, + { + "ruleId": "I1022", + "severity": "INFO", + "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", + "source": "CFN_LINT", + "entity": { + "logicalId": "WatchmakerInstance", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Metadata.AWS::CloudFormation::Init.make-app.commands.05-get-appscript.command.Fn::Join", + "category": "Intrinsic Function", + "startLine": 869, + "startColumn": 37, + "endLine": 869, + "endColumn": 46, + "ruleDescription": "Use Sub instead of Join", + "phase": "LINT" + }, + { + "ruleId": "I1022", + "severity": "INFO", + "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", + "source": "CFN_LINT", + "entity": { + "logicalId": "WatchmakerInstance", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Metadata.AWS::CloudFormation::Init.make-app.commands.10-make-app.command.Fn::Join", + "category": "Intrinsic Function", + "startLine": 887, + "startColumn": 37, + "endLine": 887, + "endColumn": 46, + "ruleDescription": "Use Sub instead of Join", + "phase": "LINT" + }, + { + "ruleId": "I1022", + "severity": "INFO", + "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", + "source": "CFN_LINT", + "entity": { + "logicalId": "WatchmakerInstance", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Metadata.AWS::CloudFormation::Init.setup.files./etc/cfn/cfn-hup.conf.content.Fn::Join.1.7.Fn::If.1.Fn::Join", + "category": "Intrinsic Function", + "startLine": 932, + "startColumn": 57, + "endLine": 932, + "endColumn": 66, + "ruleDescription": "Use Sub instead of Join", + "phase": "LINT" + }, + { + "ruleId": "I1022", + "severity": "INFO", + "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", + "source": "CFN_LINT", + "entity": { + "logicalId": "WatchmakerInstance", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Metadata.AWS::CloudFormation::Init.setup.files./etc/cfn/cfn-hup.conf.content.Fn::Join.1.8.Fn::If.1.Fn::Join", + "category": "Intrinsic Function", + "startLine": 950, + "startColumn": 57, + "endLine": 950, + "endColumn": 66, + "ruleDescription": "Use Sub instead of Join", + "phase": "LINT" + }, + { + "ruleId": "I1022", + "severity": "INFO", + "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", + "source": "CFN_LINT", + "entity": { + "logicalId": "WatchmakerInstance", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Metadata.AWS::CloudFormation::Init.setup.files./etc/cfn/hooks.d/cfn-auto-reloader.conf.content.Fn::Join.1.7.Fn::If.1.Fn::Join", + "category": "Intrinsic Function", + "startLine": 993, + "startColumn": 57, + "endLine": 993, + "endColumn": 66, + "ruleDescription": "Use Sub instead of Join", + "phase": "LINT" + }, + { + "ruleId": "I1022", + "severity": "INFO", + "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", + "source": "CFN_LINT", + "entity": { + "logicalId": "WatchmakerInstance", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Metadata.AWS::CloudFormation::Init.setup.files./etc/cfn/hooks.d/cfn-auto-reloader.conf.content.Fn::Join.1.8.Fn::If.1.Fn::Join", + "category": "Intrinsic Function", + "startLine": 1010, + "startColumn": 57, + "endLine": 1010, + "endColumn": 66, + "ruleDescription": "Use Sub instead of Join", + "phase": "LINT" + }, + { + "ruleId": "I1022", + "severity": "INFO", + "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", + "source": "CFN_LINT", + "entity": { + "logicalId": "WatchmakerInstance", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Metadata.AWS::CloudFormation::Init.setup.files./etc/cfn/scripts/watchmaker-install.sh.content.Fn::Join", + "category": "Intrinsic Function", + "startLine": 1038, + "startColumn": 37, + "endLine": 1038, + "endColumn": 46, + "ruleDescription": "Use Sub instead of Join", + "phase": "LINT" + }, + { + "ruleId": "I1022", + "severity": "INFO", + "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", + "source": "CFN_LINT", + "entity": { + "logicalId": "WatchmakerInstance", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Metadata.AWS::CloudFormation::Init.watchmaker-launch.commands.10-watchmaker-launch.command.Fn::Join.1.3.Fn::If.1.Fn::Join", + "category": "Intrinsic Function", + "startLine": 1101, + "startColumn": 57, + "endLine": 1101, + "endColumn": 66, + "ruleDescription": "Use Sub instead of Join", + "phase": "LINT" + }, + { + "ruleId": "I1022", + "severity": "INFO", + "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", + "source": "CFN_LINT", + "entity": { + "logicalId": "WatchmakerInstance", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Metadata.AWS::CloudFormation::Init.watchmaker-launch.commands.10-watchmaker-launch.command.Fn::Join.1.4.Fn::If.1.Fn::Join", + "category": "Intrinsic Function", + "startLine": 1119, + "startColumn": 57, + "endLine": 1119, + "endColumn": 66, + "ruleDescription": "Use Sub instead of Join", + "phase": "LINT" + }, + { + "ruleId": "I1022", + "severity": "INFO", + "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", + "source": "CFN_LINT", + "entity": { + "logicalId": "WatchmakerInstance", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Metadata.AWS::CloudFormation::Init.watchmaker-launch.commands.10-watchmaker-launch.command.Fn::Join.1.5.Fn::If.1.Fn::Join", + "category": "Intrinsic Function", + "startLine": 1137, + "startColumn": 57, + "endLine": 1137, + "endColumn": 66, + "ruleDescription": "Use Sub instead of Join", + "phase": "LINT" + }, + { + "ruleId": "I1022", + "severity": "INFO", + "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", + "source": "CFN_LINT", + "entity": { + "logicalId": "WatchmakerInstance", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Metadata.AWS::CloudFormation::Init.watchmaker-launch.commands.10-watchmaker-launch.command.Fn::Join.1.6.Fn::If.1.Fn::Join", + "category": "Intrinsic Function", + "startLine": 1155, + "startColumn": 57, + "endLine": 1155, + "endColumn": 66, + "ruleDescription": "Use Sub instead of Join", + "phase": "LINT" + }, + { + "ruleId": "I1022", + "severity": "INFO", + "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", + "source": "CFN_LINT", + "entity": { + "logicalId": "WatchmakerInstance", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Metadata.AWS::CloudFormation::Init.watchmaker-launch.commands.10-watchmaker-launch.command.Fn::Join.1.7.Fn::If.1.Fn::Join", + "category": "Intrinsic Function", + "startLine": 1173, + "startColumn": 57, + "endLine": 1173, + "endColumn": 66, + "ruleDescription": "Use Sub instead of Join", + "phase": "LINT" + }, + { + "ruleId": "I1022", + "severity": "INFO", + "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", + "source": "CFN_LINT", + "entity": { + "logicalId": "WatchmakerInstance", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Metadata.AWS::CloudFormation::Init.watchmaker-launch.commands.10-watchmaker-launch.command.Fn::Join.1.8.Fn::If.1.Fn::Join", + "category": "Intrinsic Function", + "startLine": 1191, + "startColumn": 57, + "endLine": 1191, + "endColumn": 66, + "ruleDescription": "Use Sub instead of Join", + "phase": "LINT" + }, + { + "ruleId": "I1022", + "severity": "INFO", + "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", + "source": "CFN_LINT", + "entity": { + "logicalId": "WatchmakerInstance", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Metadata.AWS::CloudFormation::Init.watchmaker-update.commands.10-watchmaker-update.command.Fn::Join.1.4.Fn::If.1.Fn::Join", + "category": "Intrinsic Function", + "startLine": 1226, + "startColumn": 57, + "endLine": 1226, + "endColumn": 66, + "ruleDescription": "Use Sub instead of Join", + "phase": "LINT" + }, + { + "ruleId": "I1022", + "severity": "INFO", + "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", + "source": "CFN_LINT", + "entity": { + "logicalId": "WatchmakerInstance", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Metadata.AWS::CloudFormation::Init.watchmaker-update.commands.10-watchmaker-update.command.Fn::Join.1.5.Fn::If.1.Fn::Join", + "category": "Intrinsic Function", + "startLine": 1244, + "startColumn": 57, + "endLine": 1244, + "endColumn": 66, + "ruleDescription": "Use Sub instead of Join", + "phase": "LINT" + }, + { + "ruleId": "I1022", + "severity": "INFO", + "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", + "source": "CFN_LINT", + "entity": { + "logicalId": "WatchmakerInstance", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Metadata.AWS::CloudFormation::Init.watchmaker-update.commands.10-watchmaker-update.command.Fn::Join.1.6.Fn::If.1.Fn::Join", + "category": "Intrinsic Function", + "startLine": 1262, + "startColumn": 57, + "endLine": 1262, + "endColumn": 66, + "ruleDescription": "Use Sub instead of Join", + "phase": "LINT" + }, + { + "ruleId": "I1022", + "severity": "INFO", + "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", + "source": "CFN_LINT", + "entity": { + "logicalId": "WatchmakerInstance", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Metadata.AWS::CloudFormation::Init.watchmaker-update.commands.10-watchmaker-update.command.Fn::Join.1.7.Fn::If.1.Fn::Join", + "category": "Intrinsic Function", + "startLine": 1280, + "startColumn": 57, + "endLine": 1280, + "endColumn": 66, + "ruleDescription": "Use Sub instead of Join", + "phase": "LINT" + }, + { + "ruleId": "I1022", + "severity": "INFO", + "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", + "source": "CFN_LINT", + "entity": { + "logicalId": "WatchmakerInstance", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Metadata.AWS::CloudFormation::Init.watchmaker-update.commands.10-watchmaker-update.command.Fn::Join.1.8.Fn::If.1.Fn::Join", + "category": "Intrinsic Function", + "startLine": 1298, + "startColumn": 57, + "endLine": 1298, + "endColumn": 66, + "ruleDescription": "Use Sub instead of Join", + "phase": "LINT" + }, + { + "ruleId": "I1022", + "severity": "INFO", + "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", + "source": "CFN_LINT", + "entity": { + "logicalId": "WatchmakerInstance", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Metadata.AWS::CloudFormation::Init.watchmaker-update.commands.10-watchmaker-update.command.Fn::Join.1.9.Fn::If.1.Fn::Join", + "category": "Intrinsic Function", + "startLine": 1316, + "startColumn": 57, + "endLine": 1316, + "endColumn": 66, + "ruleDescription": "Use Sub instead of Join", + "phase": "LINT" + }, + { + "ruleId": "I1022", + "severity": "INFO", + "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", + "source": "CFN_LINT", + "entity": { + "logicalId": "WatchmakerInstance", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Properties.Tags.0.Value.Fn::Join", + "category": "Intrinsic Function", + "startLine": 1440, + "startColumn": 29, + "endLine": 1440, + "endColumn": 38, + "ruleDescription": "Use Sub instead of Join", + "phase": "LINT" + }, + { + "ruleId": "I1022", + "severity": "INFO", + "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", + "source": "CFN_LINT", + "entity": { + "logicalId": "WatchmakerInstance", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Properties.UserData.Fn::Base64.Fn::Join.1.88.Fn::If.1.Fn::Join", + "category": "Intrinsic Function", + "startLine": 1596, + "startColumn": 45, + "endLine": 1596, + "endColumn": 54, + "ruleDescription": "Use Sub instead of Join", + "phase": "LINT" + }, + { + "ruleId": "I1022", + "severity": "INFO", + "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", + "source": "CFN_LINT", + "entity": { + "logicalId": "WatchmakerInstance", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Properties.UserData.Fn::Base64.Fn::Join.1.89.Fn::If.1.Fn::Join", + "category": "Intrinsic Function", + "startLine": 1613, + "startColumn": 45, + "endLine": 1613, + "endColumn": 54, + "ruleDescription": "Use Sub instead of Join", + "phase": "LINT" + }, + { + "ruleId": "I1022", + "severity": "INFO", + "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", + "source": "CFN_LINT", + "entity": { + "logicalId": "WatchmakerInstance", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Properties.UserData.Fn::Base64.Fn::Join.1.98.Fn::If.1.Fn::Join", + "category": "Intrinsic Function", + "startLine": 1642, + "startColumn": 45, + "endLine": 1642, + "endColumn": 54, + "ruleDescription": "Use Sub instead of Join", + "phase": "LINT" + }, + { + "ruleId": "I1022", + "severity": "INFO", + "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", + "source": "CFN_LINT", + "entity": { + "logicalId": "WatchmakerInstance", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Properties.UserData.Fn::Base64.Fn::Join.1.99.Fn::If.1.Fn::Join", + "category": "Intrinsic Function", + "startLine": 1659, + "startColumn": 45, + "endLine": 1659, + "endColumn": 54, + "ruleDescription": "Use Sub instead of Join", + "phase": "LINT" + }, + { + "ruleId": "I1022", + "severity": "INFO", + "message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter", + "source": "CFN_LINT", + "entity": { + "logicalId": "WatchmakerInstanceLogGroup", + "entityType": "Resource", + "resourceType": "AWS::Logs::LogGroup" + }, + "propertyPath": "Properties.LogGroupName.Fn::Join", + "category": "Intrinsic Function", + "startLine": 1691, + "startColumn": 21, + "endLine": 1691, + "endColumn": 30, + "ruleDescription": "Use Sub instead of Join", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'DeletionPolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "WatchmakerInstanceLogGroup", + "entityType": "Resource", + "resourceType": "AWS::Logs::LogGroup" + }, + "category": "Best Practice", + "startLine": 1687, + "startColumn": 9, + "endLine": 1687, + "endColumn": 36, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I3011", + "severity": "INFO", + "message": "'UpdateReplacePolicy' is a required property (The default action when replacing/removing a resource is to delete it. Set explicit values for stateful resource)", + "source": "CFN_LINT", + "entity": { + "logicalId": "WatchmakerInstanceLogGroup", + "entityType": "Resource", + "resourceType": "AWS::Logs::LogGroup" + }, + "category": "Best Practice", + "startLine": 1687, + "startColumn": 9, + "endLine": 1687, + "endColumn": 36, + "ruleDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy", + "phase": "LINT" + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'BlockDeviceMappings' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "WatchmakerInstance", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Properties.BlockDeviceMappings", + "category": "Best Practice", + "startLine": 1342, + "startColumn": 17, + "endLine": 1342, + "endColumn": 37, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ImageId' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "WatchmakerInstance", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Properties.ImageId", + "category": "Best Practice", + "startLine": 1398, + "startColumn": 17, + "endLine": 1398, + "endColumn": 25, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "parameter 'AmiId' (type AWS::EC2::Image::Id)" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'InstanceType' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "WatchmakerInstance", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Properties.InstanceType", + "category": "Best Practice", + "startLine": 1401, + "startColumn": 17, + "endLine": 1401, + "endColumn": 30, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only", + "resolutionSource": "parameter with AllowedValues" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'KeyName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "WatchmakerInstance", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Properties.KeyName", + "category": "Best Practice", + "startLine": 1404, + "startColumn": 17, + "endLine": 1404, + "endColumn": 25, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "parameter 'KeyPairName' (type AWS::EC2::KeyPair::KeyName)" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'NetworkInterfaces' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "WatchmakerInstance", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Properties.NetworkInterfaces", + "category": "Best Practice", + "startLine": 1407, + "startColumn": 17, + "endLine": 1407, + "endColumn": 35, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'UserData' is conditionally create-only; updating it may cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "WatchmakerInstance", + "entityType": "Resource", + "resourceType": "AWS::EC2::Instance" + }, + "propertyPath": "Properties.UserData", + "category": "Best Practice", + "startLine": 1451, + "startColumn": 17, + "endLine": 1451, + "endColumn": 26, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-ec2.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "conditional-create-only", + "resolutionSource": "dynamic (Base64 with unresolvable argument)" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'LogGroupName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "WatchmakerInstanceLogGroup", + "entityType": "Resource", + "resourceType": "AWS::Logs::LogGroup" + }, + "propertyPath": "Properties.LogGroupName", + "category": "Best Practice", + "startLine": 1690, + "startColumn": 17, + "endLine": 1690, + "endColumn": 30, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-logs.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9003", + "severity": "INFO", + "message": "No region supplied; region-scoped instance/node types were validated against all regions. A value reported valid here may still be unavailable in your target region - pass a region to validate against it specifically.", + "source": "ENGINE", + "category": "Best Practice", + "ruleDescription": "Region-scoped values validated against all regions because no region was supplied", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'WatchmakerInstanceLogGroup' of type 'AWS::Logs::LogGroup' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "WatchmakerInstanceLogGroup", + "entityType": "Resource", + "resourceType": "AWS::Logs::LogGroup" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1689, + "startColumn": 13, + "endLine": 1689, + "endColumn": 24, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "quickstart/cis_benchmark.yaml": { + "filePath": "quickstart/cis_benchmark.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 79, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 75, + "informational": 142, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "W2531", + "severity": "WARN", + "message": "Runtime 'python3.8' was deprecated on '2024-10-14'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'python3.14'", + "source": "CFN_LINT", + "entity": { + "logicalId": "FunctiontForEvaluateCisBenchmarkingPreconditions", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 176, + "startColumn": 9, + "endLine": 176, + "endColumn": 16, + "ruleDescription": "Check if EOL Lambda Function Runtimes are used", + "phase": "SCHEMA", + "context": { + "actualValue": "python3.8", + "lifecycle": "deprecated" + } + }, + { + "ruleId": "W2531", + "severity": "WARN", + "message": "Runtime 'python3.8' was deprecated on '2024-10-14'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'python3.14'", + "source": "CFN_LINT", + "entity": { + "logicalId": "FunctionForEvaluateRootAccountRule", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 309, + "startColumn": 9, + "endLine": 309, + "endColumn": 16, + "ruleDescription": "Check if EOL Lambda Function Runtimes are used", + "phase": "SCHEMA", + "context": { + "actualValue": "python3.8", + "lifecycle": "deprecated" + } + }, + { + "ruleId": "W2531", + "severity": "WARN", + "message": "Runtime 'python3.8' was deprecated on '2024-10-14'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'python3.14'", + "source": "CFN_LINT", + "entity": { + "logicalId": "FunctionForVpcFlowLogRule", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 481, + "startColumn": 9, + "endLine": 481, + "endColumn": 16, + "ruleDescription": "Check if EOL Lambda Function Runtimes are used", + "phase": "SCHEMA", + "context": { + "actualValue": "python3.8", + "lifecycle": "deprecated" + } + }, + { + "ruleId": "W2531", + "severity": "WARN", + "message": "Runtime 'python3.8' was deprecated on '2024-10-14'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'python3.14'", + "source": "CFN_LINT", + "entity": { + "logicalId": "FunctionForVpcDefaultSecurityGroupsRule", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 551, + "startColumn": 9, + "endLine": 551, + "endColumn": 16, + "ruleDescription": "Check if EOL Lambda Function Runtimes are used", + "phase": "SCHEMA", + "context": { + "actualValue": "python3.8", + "lifecycle": "deprecated" + } + }, + { + "ruleId": "W2531", + "severity": "WARN", + "message": "Runtime 'python3.8' was deprecated on '2024-10-14'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'python3.14'", + "source": "CFN_LINT", + "entity": { + "logicalId": "FunctionForRoleForMfaOnUsersRule", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 666, + "startColumn": 9, + "endLine": 666, + "endColumn": 16, + "ruleDescription": "Check if EOL Lambda Function Runtimes are used", + "phase": "SCHEMA", + "context": { + "actualValue": "python3.8", + "lifecycle": "deprecated" + } + }, + { + "ruleId": "W2531", + "severity": "WARN", + "message": "Runtime 'python3.8' was deprecated on '2024-10-14'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'python3.14'", + "source": "CFN_LINT", + "entity": { + "logicalId": "FunctionForEvaluatePolicyPermissionsRule", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 760, + "startColumn": 9, + "endLine": 760, + "endColumn": 16, + "ruleDescription": "Check if EOL Lambda Function Runtimes are used", + "phase": "SCHEMA", + "context": { + "actualValue": "python3.8", + "lifecycle": "deprecated" + } + }, + { + "ruleId": "W2531", + "severity": "WARN", + "message": "Runtime 'python3.8' was deprecated on '2024-10-14'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'python3.14'", + "source": "CFN_LINT", + "entity": { + "logicalId": "FunctionForEvaluateUserPolicyAssociationRule", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 850, + "startColumn": 9, + "endLine": 850, + "endColumn": 16, + "ruleDescription": "Check if EOL Lambda Function Runtimes are used", + "phase": "SCHEMA", + "context": { + "actualValue": "python3.8", + "lifecycle": "deprecated" + } + }, + { + "ruleId": "W2531", + "severity": "WARN", + "message": "Runtime 'python3.8' was deprecated on '2024-10-14'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'python3.14'", + "source": "CFN_LINT", + "entity": { + "logicalId": "FunctionForEvaluateCloudTrailRule", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 966, + "startColumn": 9, + "endLine": 966, + "endColumn": 16, + "ruleDescription": "Check if EOL Lambda Function Runtimes are used", + "phase": "SCHEMA", + "context": { + "actualValue": "python3.8", + "lifecycle": "deprecated" + } + }, + { + "ruleId": "W2531", + "severity": "WARN", + "message": "Runtime 'python3.8' was deprecated on '2024-10-14'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'python3.14'", + "source": "CFN_LINT", + "entity": { + "logicalId": "FunctionForEvaluateCloudTrailBucketRule", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 1082, + "startColumn": 9, + "endLine": 1082, + "endColumn": 16, + "ruleDescription": "Check if EOL Lambda Function Runtimes are used", + "phase": "SCHEMA", + "context": { + "actualValue": "python3.8", + "lifecycle": "deprecated" + } + }, + { + "ruleId": "W2531", + "severity": "WARN", + "message": "Runtime 'python3.8' was deprecated on '2024-10-14'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'python3.14'", + "source": "CFN_LINT", + "entity": { + "logicalId": "FunctionForEvaluateCloudTrailLogIntegrityRule", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 1178, + "startColumn": 9, + "endLine": 1178, + "endColumn": 16, + "ruleDescription": "Check if EOL Lambda Function Runtimes are used", + "phase": "SCHEMA", + "context": { + "actualValue": "python3.8", + "lifecycle": "deprecated" + } + }, + { + "ruleId": "W2531", + "severity": "WARN", + "message": "Runtime 'python3.8' was deprecated on '2024-10-14'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'python3.14'", + "source": "CFN_LINT", + "entity": { + "logicalId": "FunctionForInstanceRoleUseRule", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 1260, + "startColumn": 9, + "endLine": 1260, + "endColumn": 16, + "ruleDescription": "Check if EOL Lambda Function Runtimes are used", + "phase": "SCHEMA", + "context": { + "actualValue": "python3.8", + "lifecycle": "deprecated" + } + }, + { + "ruleId": "W2531", + "severity": "WARN", + "message": "Runtime 'python3.8' was deprecated on '2024-10-14'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'python3.14'", + "source": "CFN_LINT", + "entity": { + "logicalId": "FunctionForEvaluateKeyRotationRule", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 1357, + "startColumn": 9, + "endLine": 1357, + "endColumn": 16, + "ruleDescription": "Check if EOL Lambda Function Runtimes are used", + "phase": "SCHEMA", + "context": { + "actualValue": "python3.8", + "lifecycle": "deprecated" + } + }, + { + "ruleId": "W2531", + "severity": "WARN", + "message": "Runtime 'python3.8' was deprecated on '2024-10-14'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'python3.14'", + "source": "CFN_LINT", + "entity": { + "logicalId": "FunctionForEvaluateConfigInAllRegionsRule", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 1465, + "startColumn": 9, + "endLine": 1465, + "endColumn": 16, + "ruleDescription": "Check if EOL Lambda Function Runtimes are used", + "phase": "SCHEMA", + "context": { + "actualValue": "python3.8", + "lifecycle": "deprecated" + } + }, + { + "ruleId": "W2531", + "severity": "WARN", + "message": "Runtime 'python3.8' was deprecated on '2024-10-14'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'python3.14'", + "source": "CFN_LINT", + "entity": { + "logicalId": "FunctionForVpcPeeringRouteTablesRule", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 1550, + "startColumn": 9, + "endLine": 1550, + "endColumn": 16, + "ruleDescription": "Check if EOL Lambda Function Runtimes are used", + "phase": "SCHEMA", + "context": { + "actualValue": "python3.8", + "lifecycle": "deprecated" + } + }, + { + "ruleId": "W2531", + "severity": "WARN", + "message": "Runtime 'python3.8' was deprecated on '2024-10-14'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'python3.14'", + "source": "CFN_LINT", + "entity": { + "logicalId": "GetCloudTrailCloudWatchLog", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 1633, + "startColumn": 9, + "endLine": 1633, + "endColumn": 16, + "ruleDescription": "Check if EOL Lambda Function Runtimes are used", + "phase": "SCHEMA", + "context": { + "actualValue": "python3.8", + "lifecycle": "deprecated" + } + }, + { + "ruleId": "W2531", + "severity": "WARN", + "message": "Runtime 'python3.8' was deprecated on '2024-10-14'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'python3.14'", + "source": "CFN_LINT", + "entity": { + "logicalId": "FunctionToFormatCloudWatchEvent", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 1889, + "startColumn": 9, + "endLine": 1889, + "endColumn": 16, + "ruleDescription": "Check if EOL Lambda Function Runtimes are used", + "phase": "SCHEMA", + "context": { + "actualValue": "python3.8", + "lifecycle": "deprecated" + } + }, + { + "ruleId": "W2531", + "severity": "WARN", + "message": "Runtime 'python3.8' was deprecated on '2024-10-14'. Creation will be disabled on '2027-02-01', and updates will be disabled on '2027-03-03'. Please consider updating to 'python3.14'", + "source": "CFN_LINT", + "entity": { + "logicalId": "FunctionToDisableUnusedCredentials", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 2334, + "startColumn": 9, + "endLine": 2334, + "endColumn": 16, + "ruleDescription": "Check if EOL Lambda Function Runtimes are used", + "phase": "SCHEMA", + "context": { + "actualValue": "python3.8", + "lifecycle": "deprecated" + } + }, + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'MasterConfigRole' dependency already enforced by a 'GetAtt' at 'Properties.Role'", + "source": "CFN_LINT", + "entity": { + "logicalId": "FunctiontForEvaluateCisBenchmarkingPreconditions", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 121, + "startColumn": 7, + "endLine": 121, + "endColumn": 16, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" + }, + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'FunctiontForEvaluateCisBenchmarkingPreconditions' dependency already enforced by a 'GetAtt' at 'Properties.ServiceToken'", + "source": "CFN_LINT", + "entity": { + "logicalId": "ResourceForEvaluateCisBenchmarkingPreconditions", + "entityType": "Resource", + "resourceType": "Custom::ResourceForEvaluateCisBenchmarkingPreconditions" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 181, + "startColumn": 7, + "endLine": 181, + "endColumn": 16, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" + }, + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'MasterConfigRole' dependency already enforced by a 'GetAtt' at 'Properties.Role'", + "source": "CFN_LINT", + "entity": { + "logicalId": "FunctionForEvaluateRootAccountRule", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 227, + "startColumn": 7, + "endLine": 227, + "endColumn": 16, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" + }, + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'FunctionForEvaluateRootAccountRule' dependency already enforced by a 'GetAtt' at 'Properties.FunctionName'", + "source": "CFN_LINT", + "entity": { + "logicalId": "EvaluateRootAccountFunctionPermission", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 315, + "startColumn": 7, + "endLine": 315, + "endColumn": 16, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" + }, + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'MasterConfigRole' dependency already enforced by a 'GetAtt' at 'Properties.Role'", + "source": "CFN_LINT", + "entity": { + "logicalId": "FunctionForVpcFlowLogRule", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 421, + "startColumn": 7, + "endLine": 421, + "endColumn": 16, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" + }, + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'FunctionForVpcFlowLogRule' dependency already enforced by a 'GetAtt' at 'Properties.FunctionName'", + "source": "CFN_LINT", + "entity": { + "logicalId": "ConfigPermissionToCallVpcFlowLogLambda", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 486, + "startColumn": 7, + "endLine": 486, + "endColumn": 16, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" + }, + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'MasterConfigRole' dependency already enforced by a 'GetAtt' at 'Properties.Role'", + "source": "CFN_LINT", + "entity": { + "logicalId": "FunctionForVpcDefaultSecurityGroupsRule", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 497, + "startColumn": 7, + "endLine": 497, + "endColumn": 16, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" + }, + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'FunctionForVpcDefaultSecurityGroupsRule' dependency already enforced by a 'GetAtt' at 'Properties.FunctionName'", + "source": "CFN_LINT", + "entity": { + "logicalId": "ConfigPermissionToCallVpcDefaultSecurityGroupsLambda", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 556, + "startColumn": 7, + "endLine": 556, + "endColumn": 16, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" + }, + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'FunctionForVpcDefaultSecurityGroupsRule' dependency already enforced by a 'GetAtt' at 'Properties.Source.SourceIdentifier'", + "source": "CFN_LINT", + "entity": { + "logicalId": "ConfigRuleForVpcDefaultSecurityGroupss", + "entityType": "Resource", + "resourceType": "AWS::Config::ConfigRule" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 565, + "startColumn": 7, + "endLine": 565, + "endColumn": 16, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" + }, + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'FunctionForVpcFlowLogRule' dependency already enforced by a 'GetAtt' at 'Properties.Source.SourceIdentifier'", + "source": "CFN_LINT", + "entity": { + "logicalId": "ConfigRuleForVpcFlowLogs", + "entityType": "Resource", + "resourceType": "AWS::Config::ConfigRule" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 584, + "startColumn": 7, + "endLine": 584, + "endColumn": 16, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" + }, + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'MasterConfigRole' dependency already enforced by a 'GetAtt' at 'Properties.Role'", + "source": "CFN_LINT", + "entity": { + "logicalId": "FunctionForRoleForMfaOnUsersRule", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 606, + "startColumn": 7, + "endLine": 606, + "endColumn": 16, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" + }, + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'FunctionForRoleForMfaOnUsersRule' dependency already enforced by a 'GetAtt' at 'Properties.FunctionName'", + "source": "CFN_LINT", + "entity": { + "logicalId": "ConfigPermissionToCallMfaForUsersLambda", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 671, + "startColumn": 7, + "endLine": 671, + "endColumn": 16, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" + }, + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'MasterConfigRole' dependency already enforced by a 'GetAtt' at 'Properties.Role'", + "source": "CFN_LINT", + "entity": { + "logicalId": "FunctionForEvaluatePolicyPermissionsRule", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 699, + "startColumn": 7, + "endLine": 699, + "endColumn": 16, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" + }, + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'FunctionForEvaluatePolicyPermissionsRule' dependency already enforced by a 'GetAtt' at 'Properties.FunctionName'", + "source": "CFN_LINT", + "entity": { + "logicalId": "ConfigPermissionToCallEvaluatePolicyPermissionsLambda", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 765, + "startColumn": 7, + "endLine": 765, + "endColumn": 16, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" + }, + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'FunctionForEvaluatePolicyPermissionsRule' dependency already enforced by a 'GetAtt' at 'Properties.Source.SourceIdentifier'", + "source": "CFN_LINT", + "entity": { + "logicalId": "ConfigRuleForEvaluatePolicyPermissions", + "entityType": "Resource", + "resourceType": "AWS::Config::ConfigRule" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 773, + "startColumn": 7, + "endLine": 773, + "endColumn": 16, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" + }, + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'MasterConfigRole' dependency already enforced by a 'GetAtt' at 'Properties.Role'", + "source": "CFN_LINT", + "entity": { + "logicalId": "FunctionForEvaluateUserPolicyAssociationRule", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 795, + "startColumn": 7, + "endLine": 795, + "endColumn": 16, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" + }, + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'FunctionForEvaluateUserPolicyAssociationRule' dependency already enforced by a 'GetAtt' at 'Properties.FunctionName'", + "source": "CFN_LINT", + "entity": { + "logicalId": "ConfigPermissionToCallEvaluateUserPolicyAssociationLambda", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 855, + "startColumn": 7, + "endLine": 855, + "endColumn": 16, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" + }, + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'FunctionForEvaluateUserPolicyAssociationRule' dependency already enforced by a 'GetAtt' at 'Properties.Source.SourceIdentifier'", + "source": "CFN_LINT", + "entity": { + "logicalId": "ConfigRuleForEvaluateUserPolicyAssociations", + "entityType": "Resource", + "resourceType": "AWS::Config::ConfigRule" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 863, + "startColumn": 7, + "endLine": 863, + "endColumn": 16, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" + }, + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'MasterConfigRole' dependency already enforced by a 'GetAtt' at 'Properties.Role'", + "source": "CFN_LINT", + "entity": { + "logicalId": "FunctionForEvaluateCloudTrailRule", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 886, + "startColumn": 7, + "endLine": 886, + "endColumn": 16, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" + }, + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'FunctionForEvaluateCloudTrailRule' dependency already enforced by a 'GetAtt' at 'Properties.FunctionName'", + "source": "CFN_LINT", + "entity": { + "logicalId": "ConfigPermissionToCallEvaluateCloudTrailLambda", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 971, + "startColumn": 7, + "endLine": 971, + "endColumn": 16, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" + }, + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'FunctionForEvaluateCloudTrailRule' dependency already enforced by a 'GetAtt' at 'Properties.Source.SourceIdentifier'", + "source": "CFN_LINT", + "entity": { + "logicalId": "ConfigRuleForEvaluateCloudTrail", + "entityType": "Resource", + "resourceType": "AWS::Config::ConfigRule" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 979, + "startColumn": 7, + "endLine": 979, + "endColumn": 16, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" + }, + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'MasterConfigRole' dependency already enforced by a 'GetAtt' at 'Properties.Role'", + "source": "CFN_LINT", + "entity": { + "logicalId": "FunctionForEvaluateCloudTrailBucketRule", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 999, + "startColumn": 7, + "endLine": 999, + "endColumn": 16, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" + }, + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'FunctionForEvaluateCloudTrailBucketRule' dependency already enforced by a 'GetAtt' at 'Properties.FunctionName'", + "source": "CFN_LINT", + "entity": { + "logicalId": "ConfigPermissionToCallEvaluateCloudTrailBucketLambda", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 1087, + "startColumn": 7, + "endLine": 1087, + "endColumn": 16, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" + }, + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'FunctionForEvaluateCloudTrailBucketRule' dependency already enforced by a 'GetAtt' at 'Properties.Source.SourceIdentifier'", + "source": "CFN_LINT", + "entity": { + "logicalId": "ConfigRuleForEvaluateCloudTrailBucket", + "entityType": "Resource", + "resourceType": "AWS::Config::ConfigRule" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 1095, + "startColumn": 7, + "endLine": 1095, + "endColumn": 16, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" + }, + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'MasterConfigRole' dependency already enforced by a 'GetAtt' at 'Properties.Role'", + "source": "CFN_LINT", + "entity": { + "logicalId": "FunctionForEvaluateCloudTrailLogIntegrityRule", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 1116, + "startColumn": 7, + "endLine": 1116, + "endColumn": 16, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" + }, + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'FunctionForEvaluateCloudTrailLogIntegrityRule' dependency already enforced by a 'GetAtt' at 'Properties.FunctionName'", + "source": "CFN_LINT", + "entity": { + "logicalId": "ConfigPermissionToCallEvaluateCloudTrailLogIntegrityLambda", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 1184, + "startColumn": 7, + "endLine": 1184, + "endColumn": 16, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" + }, + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'FunctionForEvaluateCloudTrailLogIntegrityRule' dependency already enforced by a 'GetAtt' at 'Properties.Source.SourceIdentifier'", + "source": "CFN_LINT", + "entity": { + "logicalId": "ConfigRuleForEvaluateCloudTrailLogIntegrity", + "entityType": "Resource", + "resourceType": "AWS::Config::ConfigRule" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 1193, + "startColumn": 7, + "endLine": 1193, + "endColumn": 16, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" + }, + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'MasterConfigRole' dependency already enforced by a 'GetAtt' at 'Properties.Role'", + "source": "CFN_LINT", + "entity": { + "logicalId": "FunctionForInstanceRoleUseRule", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 1213, + "startColumn": 7, + "endLine": 1213, + "endColumn": 16, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" + }, + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'FunctionForInstanceRoleUseRule' dependency already enforced by a 'GetAtt' at 'Properties.FunctionName'", + "source": "CFN_LINT", + "entity": { + "logicalId": "ConfigPermissionToCallInstanceRoleUseLambda", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 1266, + "startColumn": 7, + "endLine": 1266, + "endColumn": 16, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" + }, + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'FunctionForInstanceRoleUseRule' dependency already enforced by a 'GetAtt' at 'Properties.Source.SourceIdentifier'", + "source": "CFN_LINT", + "entity": { + "logicalId": "ConfigRuleForInstanceRoleUses", + "entityType": "Resource", + "resourceType": "AWS::Config::ConfigRule" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 1275, + "startColumn": 7, + "endLine": 1275, + "endColumn": 16, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" + }, + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'MasterConfigRole' dependency already enforced by a 'GetAtt' at 'Properties.Role'", + "source": "CFN_LINT", + "entity": { + "logicalId": "FunctionForEvaluateKeyRotationRule", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 1298, + "startColumn": 7, + "endLine": 1298, + "endColumn": 16, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" + }, + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'FunctionForEvaluateKeyRotationRule' dependency already enforced by a 'GetAtt' at 'Properties.FunctionName'", + "source": "CFN_LINT", + "entity": { + "logicalId": "ConfigPermissionToCallEvaluateKeyRotationLambda", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 1363, + "startColumn": 7, + "endLine": 1363, + "endColumn": 16, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" + }, + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'FunctionForEvaluateKeyRotationRule' dependency already enforced by a 'GetAtt' at 'Properties.Source.SourceIdentifier'", + "source": "CFN_LINT", + "entity": { + "logicalId": "ConfigRuleForEvaluateKeyRotations", + "entityType": "Resource", + "resourceType": "AWS::Config::ConfigRule" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 1372, + "startColumn": 7, + "endLine": 1372, + "endColumn": 16, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" + }, + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'MasterConfigRole' dependency already enforced by a 'GetAtt' at 'Properties.Role'", + "source": "CFN_LINT", + "entity": { + "logicalId": "FunctionForEvaluateConfigInAllRegionsRule", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 1394, + "startColumn": 7, + "endLine": 1394, + "endColumn": 16, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" + }, + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'FunctionForEvaluateConfigInAllRegionsRule' dependency already enforced by a 'GetAtt' at 'Properties.FunctionName'", + "source": "CFN_LINT", + "entity": { + "logicalId": "EvaluateConfigInAllRegionsFunctionPermission", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 1470, + "startColumn": 7, + "endLine": 1470, + "endColumn": 16, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" + }, + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'MasterConfigRole' dependency already enforced by a 'GetAtt' at 'Properties.Role'", + "source": "CFN_LINT", + "entity": { + "logicalId": "FunctionForVpcPeeringRouteTablesRule", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 1499, + "startColumn": 7, + "endLine": 1499, + "endColumn": 16, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" + }, + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'FunctionForVpcPeeringRouteTablesRule' dependency already enforced by a 'GetAtt' at 'Properties.FunctionName'", + "source": "CFN_LINT", + "entity": { + "logicalId": "ConfigPermissionToCallVpcPeeringRouteTablesLambda", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 1555, + "startColumn": 7, + "endLine": 1555, + "endColumn": 16, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" + }, + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'FunctionForVpcPeeringRouteTablesRule' dependency already enforced by a 'GetAtt' at 'Properties.Source.SourceIdentifier'", + "source": "CFN_LINT", + "entity": { + "logicalId": "ConfigRuleForVpcPeeringRouteTabless", + "entityType": "Resource", + "resourceType": "AWS::Config::ConfigRule" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 1564, + "startColumn": 7, + "endLine": 1564, + "endColumn": 16, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" + }, + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'MasterConfigRole' dependency already enforced by a 'GetAtt' at 'Properties.Role'", + "source": "CFN_LINT", + "entity": { + "logicalId": "GetCloudTrailCloudWatchLog", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 1601, + "startColumn": 7, + "endLine": 1601, + "endColumn": 16, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" + }, + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'GetCloudTrailCloudWatchLog' dependency already enforced by a 'GetAtt' at 'Properties.ServiceToken'", + "source": "CFN_LINT", + "entity": { + "logicalId": "ResourceForGetCloudTrailCloudWatchLog", + "entityType": "Resource", + "resourceType": "Custom::ResourceForGetCloudTrailCloudWatchLog" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 1638, + "startColumn": 7, + "endLine": 1638, + "endColumn": 16, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" + }, + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'ResourceForGetCloudTrailCloudWatchLog' dependency already enforced by a 'GetAtt' at 'Properties.LogGroupName'", + "source": "CFN_LINT", + "entity": { + "logicalId": "UnauthorizedAttemptsCloudWatchFilter", + "entityType": "Resource", + "resourceType": "AWS::Logs::MetricFilter" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 1647, + "startColumn": 7, + "endLine": 1647, + "endColumn": 16, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" + }, + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'ResourceForGetCloudTrailCloudWatchLog' dependency already enforced by a 'GetAtt' at 'Properties.LogGroupName'", + "source": "CFN_LINT", + "entity": { + "logicalId": "IAMRootActivityCloudWatchMetric", + "entityType": "Resource", + "resourceType": "AWS::Logs::MetricFilter" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 1681, + "startColumn": 7, + "endLine": 1681, + "endColumn": 16, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" + }, + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'ResourceForGetCloudTrailCloudWatchLog' dependency already enforced by a 'GetAtt' at 'Properties.LogGroupName'", + "source": "CFN_LINT", + "entity": { + "logicalId": "ConsoleSigninWithoutMfaCloudWatchMetric", + "entityType": "Resource", + "resourceType": "AWS::Logs::MetricFilter" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 1718, + "startColumn": 7, + "endLine": 1718, + "endColumn": 16, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" + }, + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'ResourceForGetCloudTrailCloudWatchLog' dependency already enforced by a 'GetAtt' at 'Properties.LogGroupName'", + "source": "CFN_LINT", + "entity": { + "logicalId": "ConsoleLoginFailureCloudWatchMetric", + "entityType": "Resource", + "resourceType": "AWS::Logs::MetricFilter" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 1757, + "startColumn": 7, + "endLine": 1757, + "endColumn": 16, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" + }, + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'ResourceForGetCloudTrailCloudWatchLog' dependency already enforced by a 'GetAtt' at 'Properties.LogGroupName'", + "source": "CFN_LINT", + "entity": { + "logicalId": "KMSCustomerKeyDeletionCloudWatchMetric", + "entityType": "Resource", + "resourceType": "AWS::Logs::MetricFilter" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 1794, + "startColumn": 7, + "endLine": 1794, + "endColumn": 16, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" + }, + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'SnsTopicForCloudWatchEvents' dependency already enforced by a 'Ref' at 'Properties.Policies.0.PolicyDocument.Statement.0.Resource'", + "source": "CFN_LINT", + "entity": { + "logicalId": "RoleForCloudWatchEvents", + "entityType": "Resource", + "resourceType": "AWS::IAM::Role" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 1830, + "startColumn": 7, + "endLine": 1830, + "endColumn": 16, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" + }, + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'RoleForCloudWatchEvents' dependency already enforced by a 'GetAtt' at 'Properties.Role'", + "source": "CFN_LINT", + "entity": { + "logicalId": "FunctionToFormatCloudWatchEvent", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 1856, + "startColumn": 7, + "endLine": 1856, + "endColumn": 16, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" + }, + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'SnsTopicForCloudWatchEvents' dependency already enforced by a 'Ref' at 'Properties.Code.ZipFile'", + "source": "CFN_LINT", + "entity": { + "logicalId": "FunctionToFormatCloudWatchEvent", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 1856, + "startColumn": 7, + "endLine": 1856, + "endColumn": 16, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" + }, + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'FunctionToFormatCloudWatchEvent' dependency already enforced by a 'GetAtt' at 'Properties.FunctionName'", + "source": "CFN_LINT", + "entity": { + "logicalId": "LambdaPermissionForCloudTrailCloudWatchEventRules", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 1894, + "startColumn": 7, + "endLine": 1894, + "endColumn": 16, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" + }, + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'ResourceForGetCloudTrailCloudWatchLog' dependency already enforced by a 'GetAtt' at 'Properties.LogGroupName'", + "source": "CFN_LINT", + "entity": { + "logicalId": "BillingChangesCloudWatchFilter", + "entityType": "Resource", + "resourceType": "AWS::Logs::MetricFilter" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 2183, + "startColumn": 7, + "endLine": 2183, + "endColumn": 16, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" + }, + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'RoleForDisableUnusedCredentialsFunction' dependency already enforced by a 'GetAtt' at 'Properties.Role'", + "source": "CFN_LINT", + "entity": { + "logicalId": "FunctionToDisableUnusedCredentials", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 2253, + "startColumn": 7, + "endLine": 2253, + "endColumn": 16, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" + }, + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'FunctionToDisableUnusedCredentials' dependency already enforced by a 'GetAtt' at 'Properties.FunctionName'", + "source": "CFN_LINT", + "entity": { + "logicalId": "LambdaPermissionForDisableUnusedCredentials", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 2339, + "startColumn": 7, + "endLine": 2339, + "endColumn": 16, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" + }, + { + "ruleId": "W9003", + "severity": "WARN", + "message": "1 is not of type 'string' - automatically coerced (number to string)", + "source": "CFN_LINT", + "entity": { + "logicalId": "UnauthorizedAttemptsCloudWatchFilter", + "entityType": "Resource", + "resourceType": "AWS::Logs::MetricFilter" + }, + "propertyPath": "Properties.MetricTransformations.0.MetricValue", + "category": "Best Practice", + "startLine": 1657, + "startColumn": 13, + "endLine": 1657, + "endColumn": 24, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-logs.git", + "ruleDescription": "Property type coercion warning", + "phase": "SCHEMA" + }, + { + "ruleId": "W9003", + "severity": "WARN", + "message": "1 is not of type 'string' - automatically coerced (number to string)", + "source": "CFN_LINT", + "entity": { + "logicalId": "IAMRootActivityCloudWatchMetric", + "entityType": "Resource", + "resourceType": "AWS::Logs::MetricFilter" + }, + "propertyPath": "Properties.MetricTransformations.0.MetricValue", + "category": "Best Practice", + "startLine": 1695, + "startColumn": 13, + "endLine": 1695, + "endColumn": 24, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-logs.git", + "ruleDescription": "Property type coercion warning", + "phase": "SCHEMA" + }, + { + "ruleId": "W9003", + "severity": "WARN", + "message": "1 is not of type 'string' - automatically coerced (number to string)", + "source": "CFN_LINT", + "entity": { + "logicalId": "ConsoleSigninWithoutMfaCloudWatchMetric", + "entityType": "Resource", + "resourceType": "AWS::Logs::MetricFilter" + }, + "propertyPath": "Properties.MetricTransformations.0.MetricValue", + "category": "Best Practice", + "startLine": 1733, + "startColumn": 13, + "endLine": 1733, + "endColumn": 24, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-logs.git", + "ruleDescription": "Property type coercion warning", + "phase": "SCHEMA" + }, + { + "ruleId": "W9003", + "severity": "WARN", + "message": "1 is not of type 'string' - automatically coerced (number to string)", + "source": "CFN_LINT", + "entity": { + "logicalId": "ConsoleLoginFailureCloudWatchMetric", + "entityType": "Resource", + "resourceType": "AWS::Logs::MetricFilter" + }, + "propertyPath": "Properties.MetricTransformations.0.MetricValue", + "category": "Best Practice", + "startLine": 1770, + "startColumn": 13, + "endLine": 1770, + "endColumn": 24, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-logs.git", + "ruleDescription": "Property type coercion warning", + "phase": "SCHEMA" + }, + { + "ruleId": "W9003", + "severity": "WARN", + "message": "1 is not of type 'string' - automatically coerced (number to string)", + "source": "CFN_LINT", + "entity": { + "logicalId": "KMSCustomerKeyDeletionCloudWatchMetric", + "entityType": "Resource", + "resourceType": "AWS::Logs::MetricFilter" + }, + "propertyPath": "Properties.MetricTransformations.0.MetricValue", + "category": "Best Practice", + "startLine": 1807, + "startColumn": 13, + "endLine": 1807, + "endColumn": 24, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-logs.git", + "ruleDescription": "Property type coercion warning", + "phase": "SCHEMA" + }, + { + "ruleId": "W9003", + "severity": "WARN", + "message": "1 is not of type 'string' - automatically coerced (number to string)", + "source": "CFN_LINT", + "entity": { + "logicalId": "BillingChangesCloudWatchFilter", + "entityType": "Resource", + "resourceType": "AWS::Logs::MetricFilter" + }, + "propertyPath": "Properties.MetricTransformations.0.MetricValue", + "category": "Best Practice", + "startLine": 2197, + "startColumn": 13, + "endLine": 2197, + "endColumn": 24, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-logs.git", + "ruleDescription": "Property type coercion warning", + "phase": "SCHEMA" + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "FunctiontForEvaluateCisBenchmarkingPreconditions", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.FunctionName", + "category": "Best Practice", + "startLine": 124, + "startColumn": 9, + "endLine": 124, + "endColumn": 21, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ConfigRuleName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConfigRuleForIamPasswordPolicy", + "entityType": "Resource", + "resourceType": "AWS::Config::ConfigRule" + }, + "propertyPath": "Properties.ConfigRuleName", + "category": "Best Practice", + "startLine": 202, + "startColumn": 9, + "endLine": 202, + "endColumn": 23, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-config.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "FunctionForEvaluateRootAccountRule", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.FunctionName", + "category": "Best Practice", + "startLine": 231, + "startColumn": 9, + "endLine": 231, + "endColumn": 21, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "EvaluateRootAccountFunctionPermission", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties.FunctionName", + "category": "Best Practice", + "startLine": 317, + "startColumn": 9, + "endLine": 317, + "endColumn": 21, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "GetAtt FunctionForEvaluateRootAccountRule.Arn" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Action' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "EvaluateRootAccountFunctionPermission", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties.Action", + "category": "Best Practice", + "startLine": 318, + "startColumn": 9, + "endLine": 318, + "endColumn": 15, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Principal' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "EvaluateRootAccountFunctionPermission", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties.Principal", + "category": "Best Practice", + "startLine": 319, + "startColumn": 9, + "endLine": 319, + "endColumn": 18, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ConfigRuleName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConfigRuleForEvaluateRootAccount", + "entityType": "Resource", + "resourceType": "AWS::Config::ConfigRule" + }, + "propertyPath": "Properties.ConfigRuleName", + "category": "Best Practice", + "startLine": 328, + "startColumn": 9, + "endLine": 328, + "endColumn": 23, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-config.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ConfigRuleName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConfigRuleForRequiredTags", + "entityType": "Resource", + "resourceType": "AWS::Config::ConfigRule" + }, + "propertyPath": "Properties.ConfigRuleName", + "category": "Best Practice", + "startLine": 342, + "startColumn": 9, + "endLine": 342, + "endColumn": 23, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-config.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ConfigRuleName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConfigRuleForEncryptedVolumes", + "entityType": "Resource", + "resourceType": "AWS::Config::ConfigRule" + }, + "propertyPath": "Properties.ConfigRuleName", + "category": "Best Practice", + "startLine": 373, + "startColumn": 9, + "endLine": 373, + "endColumn": 23, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-config.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ConfigRuleName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConfigRuleForRestrictedSsh", + "entityType": "Resource", + "resourceType": "AWS::Config::ConfigRule" + }, + "propertyPath": "Properties.ConfigRuleName", + "category": "Best Practice", + "startLine": 389, + "startColumn": 9, + "endLine": 389, + "endColumn": 23, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-config.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ConfigRuleName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConfigRuleForUnrestrictedPorts", + "entityType": "Resource", + "resourceType": "AWS::Config::ConfigRule" + }, + "propertyPath": "Properties.ConfigRuleName", + "category": "Best Practice", + "startLine": 405, + "startColumn": 9, + "endLine": 405, + "endColumn": 23, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-config.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "FunctionForVpcFlowLogRule", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.FunctionName", + "category": "Best Practice", + "startLine": 425, + "startColumn": 9, + "endLine": 425, + "endColumn": 21, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConfigPermissionToCallVpcFlowLogLambda", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties.FunctionName", + "category": "Best Practice", + "startLine": 488, + "startColumn": 9, + "endLine": 488, + "endColumn": 21, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "GetAtt FunctionForVpcFlowLogRule.Arn" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Action' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConfigPermissionToCallVpcFlowLogLambda", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties.Action", + "category": "Best Practice", + "startLine": 489, + "startColumn": 9, + "endLine": 489, + "endColumn": 15, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Principal' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConfigPermissionToCallVpcFlowLogLambda", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties.Principal", + "category": "Best Practice", + "startLine": 490, + "startColumn": 9, + "endLine": 490, + "endColumn": 18, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "FunctionForVpcDefaultSecurityGroupsRule", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.FunctionName", + "category": "Best Practice", + "startLine": 501, + "startColumn": 9, + "endLine": 501, + "endColumn": 21, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConfigPermissionToCallVpcDefaultSecurityGroupsLambda", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties.FunctionName", + "category": "Best Practice", + "startLine": 558, + "startColumn": 9, + "endLine": 558, + "endColumn": 21, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "GetAtt FunctionForVpcDefaultSecurityGroupsRule.Arn" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Action' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConfigPermissionToCallVpcDefaultSecurityGroupsLambda", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties.Action", + "category": "Best Practice", + "startLine": 559, + "startColumn": 9, + "endLine": 559, + "endColumn": 15, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Principal' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConfigPermissionToCallVpcDefaultSecurityGroupsLambda", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties.Principal", + "category": "Best Practice", + "startLine": 560, + "startColumn": 9, + "endLine": 560, + "endColumn": 18, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ConfigRuleName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConfigRuleForVpcDefaultSecurityGroupss", + "entityType": "Resource", + "resourceType": "AWS::Config::ConfigRule" + }, + "propertyPath": "Properties.ConfigRuleName", + "category": "Best Practice", + "startLine": 569, + "startColumn": 9, + "endLine": 569, + "endColumn": 23, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-config.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ConfigRuleName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConfigRuleForVpcFlowLogs", + "entityType": "Resource", + "resourceType": "AWS::Config::ConfigRule" + }, + "propertyPath": "Properties.ConfigRuleName", + "category": "Best Practice", + "startLine": 588, + "startColumn": 9, + "endLine": 588, + "endColumn": 23, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-config.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "FunctionForRoleForMfaOnUsersRule", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.FunctionName", + "category": "Best Practice", + "startLine": 610, + "startColumn": 9, + "endLine": 610, + "endColumn": 21, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConfigPermissionToCallMfaForUsersLambda", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties.FunctionName", + "category": "Best Practice", + "startLine": 673, + "startColumn": 9, + "endLine": 673, + "endColumn": 21, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "GetAtt FunctionForRoleForMfaOnUsersRule.Arn" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Action' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConfigPermissionToCallMfaForUsersLambda", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties.Action", + "category": "Best Practice", + "startLine": 674, + "startColumn": 9, + "endLine": 674, + "endColumn": 15, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Principal' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConfigPermissionToCallMfaForUsersLambda", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties.Principal", + "category": "Best Practice", + "startLine": 675, + "startColumn": 9, + "endLine": 675, + "endColumn": 18, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ConfigRuleName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConfigRuleForMfaForUsers", + "entityType": "Resource", + "resourceType": "AWS::Config::ConfigRule" + }, + "propertyPath": "Properties.ConfigRuleName", + "category": "Best Practice", + "startLine": 681, + "startColumn": 9, + "endLine": 681, + "endColumn": 23, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-config.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "FunctionForEvaluatePolicyPermissionsRule", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.FunctionName", + "category": "Best Practice", + "startLine": 703, + "startColumn": 9, + "endLine": 703, + "endColumn": 21, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConfigPermissionToCallEvaluatePolicyPermissionsLambda", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties.FunctionName", + "category": "Best Practice", + "startLine": 767, + "startColumn": 9, + "endLine": 767, + "endColumn": 21, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "GetAtt FunctionForEvaluatePolicyPermissionsRule.Arn" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Action' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConfigPermissionToCallEvaluatePolicyPermissionsLambda", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties.Action", + "category": "Best Practice", + "startLine": 768, + "startColumn": 9, + "endLine": 768, + "endColumn": 15, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Principal' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConfigPermissionToCallEvaluatePolicyPermissionsLambda", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties.Principal", + "category": "Best Practice", + "startLine": 769, + "startColumn": 9, + "endLine": 769, + "endColumn": 18, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ConfigRuleName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConfigRuleForEvaluatePolicyPermissions", + "entityType": "Resource", + "resourceType": "AWS::Config::ConfigRule" + }, + "propertyPath": "Properties.ConfigRuleName", + "category": "Best Practice", + "startLine": 777, + "startColumn": 9, + "endLine": 777, + "endColumn": 23, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-config.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "FunctionForEvaluateUserPolicyAssociationRule", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.FunctionName", + "category": "Best Practice", + "startLine": 799, + "startColumn": 9, + "endLine": 799, + "endColumn": 21, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConfigPermissionToCallEvaluateUserPolicyAssociationLambda", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties.FunctionName", + "category": "Best Practice", + "startLine": 857, + "startColumn": 9, + "endLine": 857, + "endColumn": 21, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "GetAtt FunctionForEvaluateUserPolicyAssociationRule.Arn" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Action' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConfigPermissionToCallEvaluateUserPolicyAssociationLambda", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties.Action", + "category": "Best Practice", + "startLine": 858, + "startColumn": 9, + "endLine": 858, + "endColumn": 15, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Principal' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConfigPermissionToCallEvaluateUserPolicyAssociationLambda", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties.Principal", + "category": "Best Practice", + "startLine": 859, + "startColumn": 9, + "endLine": 859, + "endColumn": 18, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ConfigRuleName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConfigRuleForEvaluateUserPolicyAssociations", + "entityType": "Resource", + "resourceType": "AWS::Config::ConfigRule" + }, + "propertyPath": "Properties.ConfigRuleName", + "category": "Best Practice", + "startLine": 867, + "startColumn": 9, + "endLine": 867, + "endColumn": 23, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-config.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "FunctionForEvaluateCloudTrailRule", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.FunctionName", + "category": "Best Practice", + "startLine": 890, + "startColumn": 9, + "endLine": 890, + "endColumn": 21, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConfigPermissionToCallEvaluateCloudTrailLambda", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties.FunctionName", + "category": "Best Practice", + "startLine": 973, + "startColumn": 9, + "endLine": 973, + "endColumn": 21, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "GetAtt FunctionForEvaluateCloudTrailRule.Arn" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Action' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConfigPermissionToCallEvaluateCloudTrailLambda", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties.Action", + "category": "Best Practice", + "startLine": 974, + "startColumn": 9, + "endLine": 974, + "endColumn": 15, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Principal' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConfigPermissionToCallEvaluateCloudTrailLambda", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties.Principal", + "category": "Best Practice", + "startLine": 975, + "startColumn": 9, + "endLine": 975, + "endColumn": 18, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ConfigRuleName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConfigRuleForEvaluateCloudTrail", + "entityType": "Resource", + "resourceType": "AWS::Config::ConfigRule" + }, + "propertyPath": "Properties.ConfigRuleName", + "category": "Best Practice", + "startLine": 983, + "startColumn": 9, + "endLine": 983, + "endColumn": 23, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-config.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "FunctionForEvaluateCloudTrailBucketRule", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.FunctionName", + "category": "Best Practice", + "startLine": 1003, + "startColumn": 9, + "endLine": 1003, + "endColumn": 21, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConfigPermissionToCallEvaluateCloudTrailBucketLambda", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties.FunctionName", + "category": "Best Practice", + "startLine": 1089, + "startColumn": 9, + "endLine": 1089, + "endColumn": 21, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "GetAtt FunctionForEvaluateCloudTrailBucketRule.Arn" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Action' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConfigPermissionToCallEvaluateCloudTrailBucketLambda", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties.Action", + "category": "Best Practice", + "startLine": 1090, + "startColumn": 9, + "endLine": 1090, + "endColumn": 15, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Principal' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConfigPermissionToCallEvaluateCloudTrailBucketLambda", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties.Principal", + "category": "Best Practice", + "startLine": 1091, + "startColumn": 9, + "endLine": 1091, + "endColumn": 18, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ConfigRuleName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConfigRuleForEvaluateCloudTrailBucket", + "entityType": "Resource", + "resourceType": "AWS::Config::ConfigRule" + }, + "propertyPath": "Properties.ConfigRuleName", + "category": "Best Practice", + "startLine": 1099, + "startColumn": 9, + "endLine": 1099, + "endColumn": 23, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-config.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "FunctionForEvaluateCloudTrailLogIntegrityRule", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.FunctionName", + "category": "Best Practice", + "startLine": 1120, + "startColumn": 9, + "endLine": 1120, + "endColumn": 21, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConfigPermissionToCallEvaluateCloudTrailLogIntegrityLambda", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties.FunctionName", + "category": "Best Practice", + "startLine": 1186, + "startColumn": 9, + "endLine": 1186, + "endColumn": 21, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "GetAtt FunctionForEvaluateCloudTrailLogIntegrityRule.Arn" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Action' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConfigPermissionToCallEvaluateCloudTrailLogIntegrityLambda", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties.Action", + "category": "Best Practice", + "startLine": 1187, + "startColumn": 9, + "endLine": 1187, + "endColumn": 15, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Principal' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConfigPermissionToCallEvaluateCloudTrailLogIntegrityLambda", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties.Principal", + "category": "Best Practice", + "startLine": 1188, + "startColumn": 9, + "endLine": 1188, + "endColumn": 18, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ConfigRuleName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConfigRuleForEvaluateCloudTrailLogIntegrity", + "entityType": "Resource", + "resourceType": "AWS::Config::ConfigRule" + }, + "propertyPath": "Properties.ConfigRuleName", + "category": "Best Practice", + "startLine": 1197, + "startColumn": 9, + "endLine": 1197, + "endColumn": 23, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-config.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "FunctionForInstanceRoleUseRule", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.FunctionName", + "category": "Best Practice", + "startLine": 1217, + "startColumn": 9, + "endLine": 1217, + "endColumn": 21, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConfigPermissionToCallInstanceRoleUseLambda", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties.FunctionName", + "category": "Best Practice", + "startLine": 1268, + "startColumn": 9, + "endLine": 1268, + "endColumn": 21, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "GetAtt FunctionForInstanceRoleUseRule.Arn" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Action' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConfigPermissionToCallInstanceRoleUseLambda", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties.Action", + "category": "Best Practice", + "startLine": 1269, + "startColumn": 9, + "endLine": 1269, + "endColumn": 15, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Principal' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConfigPermissionToCallInstanceRoleUseLambda", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties.Principal", + "category": "Best Practice", + "startLine": 1270, + "startColumn": 9, + "endLine": 1270, + "endColumn": 18, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ConfigRuleName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConfigRuleForInstanceRoleUses", + "entityType": "Resource", + "resourceType": "AWS::Config::ConfigRule" + }, + "propertyPath": "Properties.ConfigRuleName", + "category": "Best Practice", + "startLine": 1279, + "startColumn": 9, + "endLine": 1279, + "endColumn": 23, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-config.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "FunctionForEvaluateKeyRotationRule", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.FunctionName", + "category": "Best Practice", + "startLine": 1302, + "startColumn": 9, + "endLine": 1302, + "endColumn": 21, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConfigPermissionToCallEvaluateKeyRotationLambda", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties.FunctionName", + "category": "Best Practice", + "startLine": 1365, + "startColumn": 9, + "endLine": 1365, + "endColumn": 21, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "GetAtt FunctionForEvaluateKeyRotationRule.Arn" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Action' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConfigPermissionToCallEvaluateKeyRotationLambda", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties.Action", + "category": "Best Practice", + "startLine": 1366, + "startColumn": 9, + "endLine": 1366, + "endColumn": 15, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Principal' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConfigPermissionToCallEvaluateKeyRotationLambda", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties.Principal", + "category": "Best Practice", + "startLine": 1367, + "startColumn": 9, + "endLine": 1367, + "endColumn": 18, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ConfigRuleName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConfigRuleForEvaluateKeyRotations", + "entityType": "Resource", + "resourceType": "AWS::Config::ConfigRule" + }, + "propertyPath": "Properties.ConfigRuleName", + "category": "Best Practice", + "startLine": 1376, + "startColumn": 9, + "endLine": 1376, + "endColumn": 23, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-config.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "FunctionForEvaluateConfigInAllRegionsRule", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.FunctionName", + "category": "Best Practice", + "startLine": 1398, + "startColumn": 9, + "endLine": 1398, + "endColumn": 21, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "EvaluateConfigInAllRegionsFunctionPermission", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties.FunctionName", + "category": "Best Practice", + "startLine": 1472, + "startColumn": 9, + "endLine": 1472, + "endColumn": 21, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "GetAtt FunctionForEvaluateConfigInAllRegionsRule.Arn" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Action' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "EvaluateConfigInAllRegionsFunctionPermission", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties.Action", + "category": "Best Practice", + "startLine": 1473, + "startColumn": 9, + "endLine": 1473, + "endColumn": 15, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Principal' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "EvaluateConfigInAllRegionsFunctionPermission", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties.Principal", + "category": "Best Practice", + "startLine": 1474, + "startColumn": 9, + "endLine": 1474, + "endColumn": 18, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ConfigRuleName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConfigRuleForEvaluateConfigInAllRegions", + "entityType": "Resource", + "resourceType": "AWS::Config::ConfigRule" + }, + "propertyPath": "Properties.ConfigRuleName", + "category": "Best Practice", + "startLine": 1481, + "startColumn": 9, + "endLine": 1481, + "endColumn": 23, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-config.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "FunctionForVpcPeeringRouteTablesRule", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.FunctionName", + "category": "Best Practice", + "startLine": 1503, + "startColumn": 9, + "endLine": 1503, + "endColumn": 21, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConfigPermissionToCallVpcPeeringRouteTablesLambda", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties.FunctionName", + "category": "Best Practice", + "startLine": 1557, + "startColumn": 9, + "endLine": 1557, + "endColumn": 21, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "GetAtt FunctionForVpcPeeringRouteTablesRule.Arn" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Action' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConfigPermissionToCallVpcPeeringRouteTablesLambda", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties.Action", + "category": "Best Practice", + "startLine": 1558, + "startColumn": 9, + "endLine": 1558, + "endColumn": 15, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Principal' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConfigPermissionToCallVpcPeeringRouteTablesLambda", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties.Principal", + "category": "Best Practice", + "startLine": 1559, + "startColumn": 9, + "endLine": 1559, + "endColumn": 18, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ConfigRuleName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConfigRuleForVpcPeeringRouteTabless", + "entityType": "Resource", + "resourceType": "AWS::Config::ConfigRule" + }, + "propertyPath": "Properties.ConfigRuleName", + "category": "Best Practice", + "startLine": 1568, + "startColumn": 9, + "endLine": 1568, + "endColumn": 23, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-config.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'TopicName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "SnsTopicForCloudWatchEvents", + "entityType": "Resource", + "resourceType": "AWS::SNS::Topic" + }, + "propertyPath": "Properties.TopicName", + "category": "Best Practice", + "startLine": 1589, + "startColumn": 9, + "endLine": 1589, + "endColumn": 18, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-sns", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "GetCloudTrailCloudWatchLog", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.FunctionName", + "category": "Best Practice", + "startLine": 1603, + "startColumn": 9, + "endLine": 1603, + "endColumn": 21, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'LogGroupName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "UnauthorizedAttemptsCloudWatchFilter", + "entityType": "Resource", + "resourceType": "AWS::Logs::MetricFilter" + }, + "propertyPath": "Properties.LogGroupName", + "category": "Best Practice", + "startLine": 1651, + "startColumn": 9, + "endLine": 1651, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-logs.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "GetAtt ResourceForGetCloudTrailCloudWatchLog.LogName", + "extra": { + "replacement_strategy": "delete_then_create" + } + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'AlarmName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "UnauthorizedAttemptCloudWatchAlarm", + "entityType": "Resource", + "resourceType": "AWS::CloudWatch::Alarm" + }, + "propertyPath": "Properties.AlarmName", + "category": "Best Practice", + "startLine": 1662, + "startColumn": 9, + "endLine": 1662, + "endColumn": 18, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-cloudwatch.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'LogGroupName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "IAMRootActivityCloudWatchMetric", + "entityType": "Resource", + "resourceType": "AWS::Logs::MetricFilter" + }, + "propertyPath": "Properties.LogGroupName", + "category": "Best Practice", + "startLine": 1685, + "startColumn": 9, + "endLine": 1685, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-logs.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "GetAtt ResourceForGetCloudTrailCloudWatchLog.LogName", + "extra": { + "replacement_strategy": "delete_then_create" + } + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'AlarmName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "IAMRootActivityCloudWatchAlarm", + "entityType": "Resource", + "resourceType": "AWS::CloudWatch::Alarm" + }, + "propertyPath": "Properties.AlarmName", + "category": "Best Practice", + "startLine": 1700, + "startColumn": 9, + "endLine": 1700, + "endColumn": 18, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-cloudwatch.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'LogGroupName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConsoleSigninWithoutMfaCloudWatchMetric", + "entityType": "Resource", + "resourceType": "AWS::Logs::MetricFilter" + }, + "propertyPath": "Properties.LogGroupName", + "category": "Best Practice", + "startLine": 1722, + "startColumn": 9, + "endLine": 1722, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-logs.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "GetAtt ResourceForGetCloudTrailCloudWatchLog.LogName", + "extra": { + "replacement_strategy": "delete_then_create" + } + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'AlarmName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConsoleSigninWithoutMFACloudWatchAlarm", + "entityType": "Resource", + "resourceType": "AWS::CloudWatch::Alarm" + }, + "propertyPath": "Properties.AlarmName", + "category": "Best Practice", + "startLine": 1738, + "startColumn": 9, + "endLine": 1738, + "endColumn": 18, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-cloudwatch.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'LogGroupName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConsoleLoginFailureCloudWatchMetric", + "entityType": "Resource", + "resourceType": "AWS::Logs::MetricFilter" + }, + "propertyPath": "Properties.LogGroupName", + "category": "Best Practice", + "startLine": 1761, + "startColumn": 9, + "endLine": 1761, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-logs.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "GetAtt ResourceForGetCloudTrailCloudWatchLog.LogName", + "extra": { + "replacement_strategy": "delete_then_create" + } + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'AlarmName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ConsoleLoginFailureCloudWatchAlarm", + "entityType": "Resource", + "resourceType": "AWS::CloudWatch::Alarm" + }, + "propertyPath": "Properties.AlarmName", + "category": "Best Practice", + "startLine": 1775, + "startColumn": 9, + "endLine": 1775, + "endColumn": 18, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-cloudwatch.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'LogGroupName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "KMSCustomerKeyDeletionCloudWatchMetric", + "entityType": "Resource", + "resourceType": "AWS::Logs::MetricFilter" + }, + "propertyPath": "Properties.LogGroupName", + "category": "Best Practice", + "startLine": 1798, + "startColumn": 9, + "endLine": 1798, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-logs.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "GetAtt ResourceForGetCloudTrailCloudWatchLog.LogName", + "extra": { + "replacement_strategy": "delete_then_create" + } + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'AlarmName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "KMSCustomerKeyDeletionCloudWatchAlarm", + "entityType": "Resource", + "resourceType": "AWS::CloudWatch::Alarm" + }, + "propertyPath": "Properties.AlarmName", + "category": "Best Practice", + "startLine": 1812, + "startColumn": 9, + "endLine": 1812, + "endColumn": 18, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-cloudwatch.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "FunctionToFormatCloudWatchEvent", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.FunctionName", + "category": "Best Practice", + "startLine": 1860, + "startColumn": 9, + "endLine": 1860, + "endColumn": 21, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "LambdaPermissionForCloudTrailCloudWatchEventRules", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties.FunctionName", + "category": "Best Practice", + "startLine": 1897, + "startColumn": 9, + "endLine": 1897, + "endColumn": 21, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "GetAtt FunctionToFormatCloudWatchEvent.Arn" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Action' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "LambdaPermissionForCloudTrailCloudWatchEventRules", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties.Action", + "category": "Best Practice", + "startLine": 1898, + "startColumn": 9, + "endLine": 1898, + "endColumn": 15, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Principal' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "LambdaPermissionForCloudTrailCloudWatchEventRules", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties.Principal", + "category": "Best Practice", + "startLine": 1899, + "startColumn": 9, + "endLine": 1899, + "endColumn": 18, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Name' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "DetectS3BucketPolicyChanges", + "entityType": "Resource", + "resourceType": "AWS::Events::Rule" + }, + "propertyPath": "Properties.Name", + "category": "Best Practice", + "startLine": 1907, + "startColumn": 9, + "endLine": 1907, + "endColumn": 13, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Name' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "DetectConfigChanges", + "entityType": "Resource", + "resourceType": "AWS::Events::Rule" + }, + "propertyPath": "Properties.Name", + "category": "Best Practice", + "startLine": 1938, + "startColumn": 9, + "endLine": 1938, + "endColumn": 13, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Name' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "KmsKeyUseCloudWatchEventRule", + "entityType": "Resource", + "resourceType": "AWS::Events::Rule" + }, + "propertyPath": "Properties.Name", + "category": "Best Practice", + "startLine": 1963, + "startColumn": 9, + "endLine": 1963, + "endColumn": 13, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Name' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "CloudTrailCloudWatchEventRule", + "entityType": "Resource", + "resourceType": "AWS::Events::Rule" + }, + "propertyPath": "Properties.Name", + "category": "Best Practice", + "startLine": 1985, + "startColumn": 9, + "endLine": 1985, + "endColumn": 13, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Name' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "IamPolicyChangesCloudWatchEventRule", + "entityType": "Resource", + "resourceType": "AWS::Events::Rule" + }, + "propertyPath": "Properties.Name", + "category": "Best Practice", + "startLine": 2008, + "startColumn": 9, + "endLine": 2008, + "endColumn": 13, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Name' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "BillingChangeCloudWatchEventRule", + "entityType": "Resource", + "resourceType": "AWS::Events::Rule" + }, + "propertyPath": "Properties.Name", + "category": "Best Practice", + "startLine": 2046, + "startColumn": 9, + "endLine": 2046, + "endColumn": 13, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Name' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "Ec2TerminationCloudWatchEventRule", + "entityType": "Resource", + "resourceType": "AWS::Events::Rule" + }, + "propertyPath": "Properties.Name", + "category": "Best Practice", + "startLine": 2070, + "startColumn": 9, + "endLine": 2070, + "endColumn": 13, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Name' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "SecurityGroupChangesCloudWatchEventRule", + "entityType": "Resource", + "resourceType": "AWS::Events::Rule" + }, + "propertyPath": "Properties.Name", + "category": "Best Practice", + "startLine": 2093, + "startColumn": 9, + "endLine": 2093, + "endColumn": 13, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Name' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "NetworkAclChangesCloudWatchEventRule", + "entityType": "Resource", + "resourceType": "AWS::Events::Rule" + }, + "propertyPath": "Properties.Name", + "category": "Best Practice", + "startLine": 2121, + "startColumn": 9, + "endLine": 2121, + "endColumn": 13, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Name' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "NetworkChangeCloudWatchEventRule", + "entityType": "Resource", + "resourceType": "AWS::Events::Rule" + }, + "propertyPath": "Properties.Name", + "category": "Best Practice", + "startLine": 2151, + "startColumn": 9, + "endLine": 2151, + "endColumn": 13, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'LogGroupName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "BillingChangesCloudWatchFilter", + "entityType": "Resource", + "resourceType": "AWS::Logs::MetricFilter" + }, + "propertyPath": "Properties.LogGroupName", + "category": "Best Practice", + "startLine": 2187, + "startColumn": 9, + "endLine": 2187, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-logs.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "GetAtt ResourceForGetCloudTrailCloudWatchLog.LogName", + "extra": { + "replacement_strategy": "delete_then_create" + } + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'AlarmName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "BillingChangesCloudWatchAlarm", + "entityType": "Resource", + "resourceType": "AWS::CloudWatch::Alarm" + }, + "propertyPath": "Properties.AlarmName", + "category": "Best Practice", + "startLine": 2202, + "startColumn": 9, + "endLine": 2202, + "endColumn": 18, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-cloudwatch.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "FunctionToDisableUnusedCredentials", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.FunctionName", + "category": "Best Practice", + "startLine": 2255, + "startColumn": 9, + "endLine": 2255, + "endColumn": 21, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "LambdaPermissionForDisableUnusedCredentials", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties.FunctionName", + "category": "Best Practice", + "startLine": 2342, + "startColumn": 9, + "endLine": 2342, + "endColumn": 21, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "GetAtt FunctionToDisableUnusedCredentials.Arn" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Action' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "LambdaPermissionForDisableUnusedCredentials", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties.Action", + "category": "Best Practice", + "startLine": 2343, + "startColumn": 9, + "endLine": 2343, + "endColumn": 15, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Principal' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "LambdaPermissionForDisableUnusedCredentials", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties.Principal", + "category": "Best Practice", + "startLine": 2344, + "startColumn": 9, + "endLine": 2344, + "endColumn": 18, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Name' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "ScheduledRuleForDisableUnusedCredentials", + "entityType": "Resource", + "resourceType": "AWS::Events::Rule" + }, + "propertyPath": "Properties.Name", + "category": "Best Practice", + "startLine": 2349, + "startColumn": 9, + "endLine": 2349, + "endColumn": 13, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'MasterConfigRole' of type 'AWS::IAM::Role' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "MasterConfigRole", + "entityType": "Resource", + "resourceType": "AWS::IAM::Role" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 78, + "startColumn": 7, + "endLine": 78, + "endColumn": 17, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'FunctiontForEvaluateCisBenchmarkingPreconditions' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "FunctiontForEvaluateCisBenchmarkingPreconditions", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 123, + "startColumn": 7, + "endLine": 123, + "endColumn": 17, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'FunctionForEvaluateRootAccountRule' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "FunctionForEvaluateRootAccountRule", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 230, + "startColumn": 7, + "endLine": 230, + "endColumn": 17, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'FunctionForVpcFlowLogRule' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "FunctionForVpcFlowLogRule", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 424, + "startColumn": 7, + "endLine": 424, + "endColumn": 17, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'FunctionForVpcDefaultSecurityGroupsRule' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "FunctionForVpcDefaultSecurityGroupsRule", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 500, + "startColumn": 7, + "endLine": 500, + "endColumn": 17, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'FunctionForRoleForMfaOnUsersRule' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "FunctionForRoleForMfaOnUsersRule", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 609, + "startColumn": 7, + "endLine": 609, + "endColumn": 17, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'FunctionForEvaluatePolicyPermissionsRule' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "FunctionForEvaluatePolicyPermissionsRule", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 702, + "startColumn": 7, + "endLine": 702, + "endColumn": 17, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'FunctionForEvaluateUserPolicyAssociationRule' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "FunctionForEvaluateUserPolicyAssociationRule", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 798, + "startColumn": 7, + "endLine": 798, + "endColumn": 17, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'FunctionForEvaluateCloudTrailRule' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "FunctionForEvaluateCloudTrailRule", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 889, + "startColumn": 7, + "endLine": 889, + "endColumn": 17, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'FunctionForEvaluateCloudTrailBucketRule' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "FunctionForEvaluateCloudTrailBucketRule", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1002, + "startColumn": 7, + "endLine": 1002, + "endColumn": 17, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'FunctionForEvaluateCloudTrailLogIntegrityRule' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "FunctionForEvaluateCloudTrailLogIntegrityRule", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1119, + "startColumn": 7, + "endLine": 1119, + "endColumn": 17, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'FunctionForInstanceRoleUseRule' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "FunctionForInstanceRoleUseRule", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1216, + "startColumn": 7, + "endLine": 1216, + "endColumn": 17, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'FunctionForEvaluateKeyRotationRule' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "FunctionForEvaluateKeyRotationRule", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1301, + "startColumn": 7, + "endLine": 1301, + "endColumn": 17, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'FunctionForEvaluateConfigInAllRegionsRule' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "FunctionForEvaluateConfigInAllRegionsRule", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1397, + "startColumn": 7, + "endLine": 1397, + "endColumn": 17, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'FunctionForVpcPeeringRouteTablesRule' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "FunctionForVpcPeeringRouteTablesRule", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1502, + "startColumn": 7, + "endLine": 1502, + "endColumn": 17, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'SnsTopicForCloudWatchEvents' of type 'AWS::SNS::Topic' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "SnsTopicForCloudWatchEvents", + "entityType": "Resource", + "resourceType": "AWS::SNS::Topic" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1588, + "startColumn": 7, + "endLine": 1588, + "endColumn": 17, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'GetCloudTrailCloudWatchLog' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "GetCloudTrailCloudWatchLog", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1602, + "startColumn": 7, + "endLine": 1602, + "endColumn": 17, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'UnauthorizedAttemptCloudWatchAlarm' of type 'AWS::CloudWatch::Alarm' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "UnauthorizedAttemptCloudWatchAlarm", + "entityType": "Resource", + "resourceType": "AWS::CloudWatch::Alarm" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1661, + "startColumn": 7, + "endLine": 1661, + "endColumn": 17, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'IAMRootActivityCloudWatchAlarm' of type 'AWS::CloudWatch::Alarm' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "IAMRootActivityCloudWatchAlarm", + "entityType": "Resource", + "resourceType": "AWS::CloudWatch::Alarm" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1699, + "startColumn": 7, + "endLine": 1699, + "endColumn": 17, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'ConsoleSigninWithoutMFACloudWatchAlarm' of type 'AWS::CloudWatch::Alarm' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "ConsoleSigninWithoutMFACloudWatchAlarm", + "entityType": "Resource", + "resourceType": "AWS::CloudWatch::Alarm" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1737, + "startColumn": 7, + "endLine": 1737, + "endColumn": 17, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'ConsoleLoginFailureCloudWatchAlarm' of type 'AWS::CloudWatch::Alarm' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "ConsoleLoginFailureCloudWatchAlarm", + "entityType": "Resource", + "resourceType": "AWS::CloudWatch::Alarm" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1774, + "startColumn": 7, + "endLine": 1774, + "endColumn": 17, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'KMSCustomerKeyDeletionCloudWatchAlarm' of type 'AWS::CloudWatch::Alarm' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "KMSCustomerKeyDeletionCloudWatchAlarm", + "entityType": "Resource", + "resourceType": "AWS::CloudWatch::Alarm" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1811, + "startColumn": 7, + "endLine": 1811, + "endColumn": 17, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'RoleForCloudWatchEvents' of type 'AWS::IAM::Role' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "RoleForCloudWatchEvents", + "entityType": "Resource", + "resourceType": "AWS::IAM::Role" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1831, + "startColumn": 7, + "endLine": 1831, + "endColumn": 17, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'FunctionToFormatCloudWatchEvent' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "FunctionToFormatCloudWatchEvent", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1859, + "startColumn": 7, + "endLine": 1859, + "endColumn": 17, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'DetectS3BucketPolicyChanges' of type 'AWS::Events::Rule' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "DetectS3BucketPolicyChanges", + "entityType": "Resource", + "resourceType": "AWS::Events::Rule" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1906, + "startColumn": 7, + "endLine": 1906, + "endColumn": 17, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'DetectConfigChanges' of type 'AWS::Events::Rule' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "DetectConfigChanges", + "entityType": "Resource", + "resourceType": "AWS::Events::Rule" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1937, + "startColumn": 7, + "endLine": 1937, + "endColumn": 17, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'KmsKeyUseCloudWatchEventRule' of type 'AWS::Events::Rule' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "KmsKeyUseCloudWatchEventRule", + "entityType": "Resource", + "resourceType": "AWS::Events::Rule" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1962, + "startColumn": 7, + "endLine": 1962, + "endColumn": 17, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'CloudTrailCloudWatchEventRule' of type 'AWS::Events::Rule' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "CloudTrailCloudWatchEventRule", + "entityType": "Resource", + "resourceType": "AWS::Events::Rule" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 1984, + "startColumn": 7, + "endLine": 1984, + "endColumn": 17, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'IamPolicyChangesCloudWatchEventRule' of type 'AWS::Events::Rule' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "IamPolicyChangesCloudWatchEventRule", + "entityType": "Resource", + "resourceType": "AWS::Events::Rule" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 2007, + "startColumn": 7, + "endLine": 2007, + "endColumn": 17, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'BillingChangeCloudWatchEventRule' of type 'AWS::Events::Rule' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "BillingChangeCloudWatchEventRule", + "entityType": "Resource", + "resourceType": "AWS::Events::Rule" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 2045, + "startColumn": 7, + "endLine": 2045, + "endColumn": 17, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Ec2TerminationCloudWatchEventRule' of type 'AWS::Events::Rule' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "Ec2TerminationCloudWatchEventRule", + "entityType": "Resource", + "resourceType": "AWS::Events::Rule" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 2069, + "startColumn": 7, + "endLine": 2069, + "endColumn": 17, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'SecurityGroupChangesCloudWatchEventRule' of type 'AWS::Events::Rule' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "SecurityGroupChangesCloudWatchEventRule", + "entityType": "Resource", + "resourceType": "AWS::Events::Rule" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 2092, + "startColumn": 7, + "endLine": 2092, + "endColumn": 17, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'NetworkAclChangesCloudWatchEventRule' of type 'AWS::Events::Rule' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "NetworkAclChangesCloudWatchEventRule", + "entityType": "Resource", + "resourceType": "AWS::Events::Rule" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 2120, + "startColumn": 7, + "endLine": 2120, + "endColumn": 17, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'NetworkChangeCloudWatchEventRule' of type 'AWS::Events::Rule' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "NetworkChangeCloudWatchEventRule", + "entityType": "Resource", + "resourceType": "AWS::Events::Rule" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 2150, + "startColumn": 7, + "endLine": 2150, + "endColumn": 17, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'BillingChangesCloudWatchAlarm' of type 'AWS::CloudWatch::Alarm' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "BillingChangesCloudWatchAlarm", + "entityType": "Resource", + "resourceType": "AWS::CloudWatch::Alarm" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 2201, + "startColumn": 7, + "endLine": 2201, + "endColumn": 17, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'RoleForDisableUnusedCredentialsFunction' of type 'AWS::IAM::Role' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "RoleForDisableUnusedCredentialsFunction", + "entityType": "Resource", + "resourceType": "AWS::IAM::Role" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 2221, + "startColumn": 7, + "endLine": 2221, + "endColumn": 17, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'FunctionToDisableUnusedCredentials' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "FunctionToDisableUnusedCredentials", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 2254, + "startColumn": 7, + "endLine": 2254, + "endColumn": 17, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'ScheduledRuleForDisableUnusedCredentials' of type 'AWS::Events::Rule' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "ScheduledRuleForDisableUnusedCredentials", + "entityType": "Resource", + "resourceType": "AWS::Events::Rule" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 2348, + "startColumn": 7, + "endLine": 2348, + "endColumn": 17, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "quickstart/config-rules.json": { + "filePath": "quickstart/config-rules.json", + "status": "OK", + "metadata": { + "resourcesScanned": 12, + "counts": { + "fatal": 0, + "errors": 2, + "warnings": 5, + "informational": 15, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "E2533", + "severity": "ERROR", + "message": "Runtime 'nodejs' was deprecated on '2016-08-30'. Creation was disabled on '2016-09-30', and updates were disabled on '2016-10-31'. Please consider updating to 'nodejs24.x'", + "source": "CFN_LINT", + "entity": { + "logicalId": "rAMIComplianceFunction", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 194, + "startColumn": 5, + "endLine": 194, + "endColumn": 13, + "ruleDescription": "Check if Lambda Function Runtimes are updatable", + "phase": "SCHEMA", + "context": { + "actualValue": "nodejs", + "lifecycle": "end-of-life" + } + }, + { + "ruleId": "E2533", + "severity": "ERROR", + "message": "Runtime 'nodejs' was deprecated on '2016-08-30'. Creation was disabled on '2016-09-30', and updates were disabled on '2016-10-31'. Please consider updating to 'nodejs24.x'", + "source": "CFN_LINT", + "entity": { + "logicalId": "rCloudTrailValidationFunction", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.Runtime", + "category": "Deprecation", + "startLine": 291, + "startColumn": 5, + "endLine": 291, + "endColumn": 13, + "ruleDescription": "Check if Lambda Function Runtimes are updatable", + "phase": "SCHEMA", + "context": { + "actualValue": "nodejs", + "lifecycle": "end-of-life" + } + }, + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'rConfigRulesLambdaRole' dependency already enforced by a 'GetAtt' at 'Properties.Role'", + "source": "CFN_LINT", + "entity": { + "logicalId": "rAMIComplianceFunction", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 141, + "startColumn": 4, + "endLine": 141, + "endColumn": 14, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" + }, + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'rConfigRulesLambdaRole' dependency already enforced by a 'GetAtt' at 'Properties.Role'", + "source": "CFN_LINT", + "entity": { + "logicalId": "rCloudTrailValidationFunction", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 239, + "startColumn": 4, + "endLine": 239, + "endColumn": 14, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" + }, + { + "ruleId": "W8003", + "severity": "WARN", + "message": "Fn::Equals in condition 'cApprovedAMIsRule' will always return True", + "source": "CFN_LINT", + "entity": { + "logicalId": "cApprovedAMIsRule", + "entityType": "Condition" + }, + "propertyPath": "Conditions/cApprovedAMIsRule", + "category": "Best Practice", + "startLine": 38, + "startColumn": 3, + "endLine": 38, + "endColumn": 21, + "ruleDescription": "Fn::Equals will always return true or false", + "phase": "PARSE" + }, + { + "ruleId": "W9003", + "severity": "WARN", + "message": "'30' is not of type 'integer' - automatically coerced (string to integer)", + "source": "CFN_LINT", + "entity": { + "logicalId": "rAMIComplianceFunction", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.Timeout", + "category": "Best Practice", + "startLine": 195, + "startColumn": 5, + "endLine": 195, + "endColumn": 13, + "ruleDescription": "Property type coercion warning", + "phase": "SCHEMA" + }, + { + "ruleId": "W9003", + "severity": "WARN", + "message": "'30' is not of type 'integer' - automatically coerced (string to integer)", + "source": "CFN_LINT", + "entity": { + "logicalId": "rCloudTrailValidationFunction", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.Timeout", + "category": "Best Practice", + "startLine": 292, + "startColumn": 5, + "endLine": 292, + "endColumn": 13, + "ruleDescription": "Property type coercion warning", + "phase": "SCHEMA" + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ConfigRuleName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "rConfigRuleForSSH", + "entityType": "Resource", + "resourceType": "AWS::Config::ConfigRule" + }, + "propertyPath": "Properties.ConfigRuleName", + "category": "Best Practice", + "startLine": 48, + "startColumn": 5, + "endLine": 48, + "endColumn": 20, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-config.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ConfigRuleName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "rConfigRuleForRequiredTags", + "entityType": "Resource", + "resourceType": "AWS::Config::ConfigRule" + }, + "propertyPath": "Properties.ConfigRuleName", + "category": "Best Practice", + "startLine": 63, + "startColumn": 5, + "endLine": 63, + "endColumn": 20, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-config.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ConfigRuleName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "rConfigRuleForUnrestrictedPorts", + "entityType": "Resource", + "resourceType": "AWS::Config::ConfigRule" + }, + "propertyPath": "Properties.ConfigRuleName", + "category": "Best Practice", + "startLine": 83, + "startColumn": 5, + "endLine": 83, + "endColumn": 20, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-config.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Path' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "rConfigRulesLambdaRole", + "entityType": "Resource", + "resourceType": "AWS::IAM::Role" + }, + "propertyPath": "Properties.Path", + "category": "Best Practice", + "startLine": 110, + "startColumn": 5, + "endLine": 110, + "endColumn": 10, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-iam.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Path' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "rConfigRulesLambdaProfile", + "entityType": "Resource", + "resourceType": "AWS::IAM::InstanceProfile" + }, + "propertyPath": "Properties.Path", + "category": "Best Practice", + "startLine": 133, + "startColumn": 5, + "endLine": 133, + "endColumn": 10, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ConfigRuleName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "rConfigRuleForAMICompliance", + "entityType": "Resource", + "resourceType": "AWS::Config::ConfigRule" + }, + "propertyPath": "Properties.ConfigRuleName", + "category": "Best Practice", + "startLine": 205, + "startColumn": 5, + "endLine": 205, + "endColumn": 20, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-config.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "rConfigPermissionToCallLambdaAMICompliance", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties.FunctionName", + "category": "Best Practice", + "startLine": 230, + "startColumn": 5, + "endLine": 230, + "endColumn": 18, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "GetAtt rAMIComplianceFunction.Arn" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Action' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "rConfigPermissionToCallLambdaAMICompliance", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties.Action", + "category": "Best Practice", + "startLine": 233, + "startColumn": 5, + "endLine": 233, + "endColumn": 12, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Principal' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "rConfigPermissionToCallLambdaAMICompliance", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties.Principal", + "category": "Best Practice", + "startLine": 234, + "startColumn": 5, + "endLine": 234, + "endColumn": 15, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'ConfigRuleName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "rConfigRuleForCloudTrail", + "entityType": "Resource", + "resourceType": "AWS::Config::ConfigRule" + }, + "propertyPath": "Properties.ConfigRuleName", + "category": "Best Practice", + "startLine": 301, + "startColumn": 5, + "endLine": 301, + "endColumn": 20, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-config.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "rConfigPermissionToCallLambdaCloudTrail", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties.FunctionName", + "category": "Best Practice", + "startLine": 322, + "startColumn": 5, + "endLine": 322, + "endColumn": 18, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "GetAtt rCloudTrailValidationFunction.Arn" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Action' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "rConfigPermissionToCallLambdaCloudTrail", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties.Action", + "category": "Best Practice", + "startLine": 325, + "startColumn": 5, + "endLine": 325, + "endColumn": 12, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Principal' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "rConfigPermissionToCallLambdaCloudTrail", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Permission" + }, + "propertyPath": "Properties.Principal", + "category": "Best Practice", + "startLine": 326, + "startColumn": 5, + "endLine": 326, + "endColumn": 15, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'rConfigRulesLambdaRole' of type 'AWS::IAM::Role' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "rConfigRulesLambdaRole", + "entityType": "Resource", + "resourceType": "AWS::IAM::Role" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 99, + "startColumn": 4, + "endLine": 99, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'rCloudTrailValidationFunction' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "rCloudTrailValidationFunction", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 240, + "startColumn": 4, + "endLine": 240, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "quickstart/iam.json": { + "filePath": "quickstart/iam.json", + "status": "OK", + "metadata": { + "resourcesScanned": 18, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 5, + "informational": 8, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "W2512", + "severity": "WARN", + "message": "IAM policy uses NotAction which grants all actions except those listed - consider using Action instead", + "source": "ENGINE", + "entity": { + "logicalId": "rSysAdminPolicy", + "entityType": "Resource", + "resourceType": "AWS::IAM::ManagedPolicy" + }, + "category": "Security", + "startLine": 61, + "startColumn": 3, + "endLine": 61, + "endColumn": 19, + "ruleDescription": "IAM policy with NotAction", + "phase": "LINT" + }, + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'rSysAdminRole' dependency already enforced by a 'Ref' at 'Properties.Roles.0'", + "source": "CFN_LINT", + "entity": { + "logicalId": "rSysAdminProfile", + "entityType": "Resource", + "resourceType": "AWS::IAM::InstanceProfile" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 45, + "startColumn": 4, + "endLine": 45, + "endColumn": 14, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" + }, + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'rIAMAdminRole' dependency already enforced by a 'Ref' at 'Properties.Roles.0'", + "source": "CFN_LINT", + "entity": { + "logicalId": "rIAMAdminProfile", + "entityType": "Resource", + "resourceType": "AWS::IAM::InstanceProfile" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 139, + "startColumn": 4, + "endLine": 139, + "endColumn": 14, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" + }, + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'rInstanceOpsRole' dependency already enforced by a 'Ref' at 'Properties.Roles.0'", + "source": "CFN_LINT", + "entity": { + "logicalId": "rInstanceOpsProfile", + "entityType": "Resource", + "resourceType": "AWS::IAM::InstanceProfile" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 211, + "startColumn": 4, + "endLine": 211, + "endColumn": 14, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" + }, + { + "ruleId": "W3005", + "severity": "WARN", + "message": "'rReadOnlyAdminRole' dependency already enforced by a 'Ref' at 'Properties.Roles.0'", + "source": "CFN_LINT", + "entity": { + "logicalId": "rReadOnlyAdminProfile", + "entityType": "Resource", + "resourceType": "AWS::IAM::InstanceProfile" + }, + "propertyPath": "DependsOn", + "suggestedFix": "Remove the DependsOn entry", + "category": "Best Practice", + "startLine": 324, + "startColumn": 4, + "endLine": 324, + "endColumn": 14, + "ruleDescription": "Check obsolete DependsOn configuration for Resources", + "phase": "LINT" + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Path' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "rSysAdminProfile", + "entityType": "Resource", + "resourceType": "AWS::IAM::InstanceProfile" + }, + "propertyPath": "Properties.Path", + "category": "Best Practice", + "startLine": 47, + "startColumn": 5, + "endLine": 47, + "endColumn": 10, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Path' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "rIAMAdminProfile", + "entityType": "Resource", + "resourceType": "AWS::IAM::InstanceProfile" + }, + "propertyPath": "Properties.Path", + "category": "Best Practice", + "startLine": 141, + "startColumn": 5, + "endLine": 141, + "endColumn": 10, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Path' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "rInstanceOpsProfile", + "entityType": "Resource", + "resourceType": "AWS::IAM::InstanceProfile" + }, + "propertyPath": "Properties.Path", + "category": "Best Practice", + "startLine": 213, + "startColumn": 5, + "endLine": 213, + "endColumn": 10, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Path' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "rReadOnlyAdminProfile", + "entityType": "Resource", + "resourceType": "AWS::IAM::InstanceProfile" + }, + "propertyPath": "Properties.Path", + "category": "Best Practice", + "startLine": 326, + "startColumn": 5, + "endLine": 326, + "endColumn": 10, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'rSysAdminRole' of type 'AWS::IAM::Role' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "rSysAdminRole", + "entityType": "Resource", + "resourceType": "AWS::IAM::Role" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 24, + "startColumn": 4, + "endLine": 24, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'rIAMAdminRole' of type 'AWS::IAM::Role' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "rIAMAdminRole", + "entityType": "Resource", + "resourceType": "AWS::IAM::Role" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 119, + "startColumn": 4, + "endLine": 119, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'rInstanceOpsRole' of type 'AWS::IAM::Role' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "rInstanceOpsRole", + "entityType": "Resource", + "resourceType": "AWS::IAM::Role" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 191, + "startColumn": 4, + "endLine": 191, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'rReadOnlyAdminRole' of type 'AWS::IAM::Role' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "rReadOnlyAdminRole", + "entityType": "Resource", + "resourceType": "AWS::IAM::Role" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 304, + "startColumn": 4, + "endLine": 304, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, "quickstart/nat-instance.json": { "filePath": "quickstart/nat-instance.json", "status": "OK", @@ -30286,6 +37422,260 @@ } ] }, + "security/conditional_scenario_correctness.yaml": { + "filePath": "security/conditional_scenario_correctness.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 7, + "counts": { + "fatal": 1, + "errors": 1, + "warnings": 3, + "informational": 6, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "F3037", + "severity": "FATAL", + "message": "Array items are not unique", + "source": "SCHEMA", + "entity": { + "logicalId": "NestedUniqueFunction", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.Tags", + "category": "Schema", + "startLine": 128, + "startColumn": 7, + "endLine": 128, + "endColumn": 11, + "conditionScenario": { + "Enabled02": false + }, + "ruleDescription": "Array items not unique", + "phase": "SCHEMA", + "context": { + "actualValue": [ + { + "Key": "Stage", + "Value": "prod" + }, + { + "Key": "Stage", + "Value": "dev" + } + ] + } + }, + { + "ruleId": "E3023", + "severity": "ERROR", + "message": "'not-an-address' is not a valid IPv4 address for record type 'A'", + "source": "CFN_LINT", + "entity": { + "logicalId": "Record", + "entityType": "Resource", + "resourceType": "AWS::Route53::RecordSet" + }, + "propertyPath": "Properties.ResourceRecords.0", + "category": "Resource", + "startLine": 159, + "startColumn": 81, + "endLine": 159, + "endColumn": 82, + "ruleDescription": "Validate Route53 RecordSets", + "phase": "LINT" + }, + { + "ruleId": "W1028", + "severity": "WARN", + "message": "['Fn::If', 2] is not reachable. When setting condition 'Enabled01' to False from current status True", + "source": "CFN_LINT", + "entity": { + "logicalId": "RepeatedConditionFunction", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.Architectures.1.Fn::If.1.Fn::If.2", + "category": "Best Practice", + "startLine": 120, + "startColumn": 62, + "endLine": 120, + "endColumn": 63, + "ruleDescription": "Check Fn::If has a path that cannot be reached", + "phase": "LINT" + }, + { + "ruleId": "W1028", + "severity": "WARN", + "message": "['Fn::If', 2] is not reachable. When setting condition 'Enabled04' to False from current status True", + "source": "CFN_LINT", + "entity": { + "logicalId": "TaggedTopic", + "entityType": "Resource", + "resourceType": "AWS::SNS::Topic" + }, + "propertyPath": "Properties.Fn::If.Fn::If.1.Tags.Fn::If.2", + "category": "Best Practice", + "startLine": 142, + "startColumn": 5, + "endLine": 142, + "endColumn": 11, + "ruleDescription": "Check Fn::If has a path that cannot be reached", + "phase": "LINT" + }, + { + "ruleId": "W2530", + "severity": "WARN", + "message": "SnapStart is enabled but no AWS::Lambda::Version resource is attached", + "source": "CFN_LINT", + "entity": { + "logicalId": "SnapStartFunction", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.SnapStart.ApplyOn", + "suggestedFix": "Add an AWS::Lambda::Version resource that references this function", + "category": "Best Practice", + "startLine": 139, + "startColumn": 54, + "endLine": 139, + "endColumn": 61, + "ruleDescription": "Validate that SnapStart is properly configured", + "phase": "LINT" + }, + { + "ruleId": "I2530", + "severity": "INFO", + "message": "Runtime 'java21' should consider using SnapStart for improved performance", + "source": "CFN_LINT", + "entity": { + "logicalId": "SnapStartFunction", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.SnapStart.ApplyOn", + "suggestedFix": "Add SnapStart with ApplyOn set to 'PublishedVersions'", + "category": "Best Practice", + "startLine": 139, + "startColumn": 7, + "endLine": 139, + "endColumn": 16, + "documentationUrl": "https://docs.aws.amazon.com/lambda/latest/dg/snapstart.html", + "ruleDescription": "Validate that SnapStart is configured for >= Java11 runtimes", + "phase": "LINT" + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'HostedZoneName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "Record", + "entityType": "Resource", + "resourceType": "AWS::Route53::RecordSet" + }, + "propertyPath": "Properties.HostedZoneName", + "category": "Best Practice", + "startLine": 154, + "startColumn": 7, + "endLine": 154, + "endColumn": 21, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-route53-recordset", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'SharedRole' of type 'AWS::IAM::Role' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "SharedRole", + "entityType": "Resource", + "resourceType": "AWS::IAM::Role" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 94, + "startColumn": 5, + "endLine": 94, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'ComplementaryArchitectureFunction' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "ComplementaryArchitectureFunction", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 103, + "startColumn": 5, + "endLine": 103, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'RepeatedConditionFunction' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "RepeatedConditionFunction", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 113, + "startColumn": 5, + "endLine": 113, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'SnapStartFunction' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "SnapStartFunction", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 134, + "startColumn": 5, + "endLine": 134, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, "security/cross_reference_fanout.yaml": { "filePath": "security/cross_reference_fanout.yaml", "status": "OK", @@ -62685,6 +70075,343 @@ } ] }, + "security/independent_conditions_list_items.yaml": { + "filePath": "security/independent_conditions_list_items.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 1, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'Type' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "Analyzer", + "entityType": "Resource", + "resourceType": "AWS::AccessAnalyzer::Analyzer" + }, + "propertyPath": "Properties.Type", + "category": "Best Practice", + "startLine": 83, + "startColumn": 7, + "endLine": 83, + "endColumn": 11, + "documentationUrl": "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-accessanalyzer.git", + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only" + } + } + ] + }, + "security/independent_conditions_object_keys.yaml": { + "filePath": "security/independent_conditions_object_keys.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 2, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 2, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'FunctionRole' of type 'AWS::IAM::Role' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "FunctionRole", + "entityType": "Resource", + "resourceType": "AWS::IAM::Role" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 74, + "startColumn": 5, + "endLine": 74, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Function' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "Function", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 83, + "startColumn": 5, + "endLine": 83, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "security/independent_conditions_properties.yaml": { + "filePath": "security/independent_conditions_properties.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 2, + "counts": { + "fatal": 2, + "errors": 0, + "warnings": 2, + "informational": 3, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "F3031", + "severity": "FATAL", + "message": "'' does not match pattern '^([a-zA-Z0-9_-]{1,64}|arn:[a-zA-Z0-9-]+:lambda:[a-zA-Z0-9-]+:\\d{12}:function:[a-zA-Z0-9_-]{1,64})$'", + "source": "SCHEMA", + "entity": { + "logicalId": "Function", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.FunctionName", + "category": "Schema", + "startLine": 100, + "startColumn": 7, + "endLine": 100, + "endColumn": 19, + "conditionScenario": { + "Enabled12": true + }, + "ruleDescription": "Value does not match pattern", + "phase": "SCHEMA", + "context": { + "actualValue": "", + "expectedConstraint": "^([a-zA-Z0-9_-]{1,64}|arn:[a-zA-Z0-9-]+:lambda:[a-zA-Z0-9-]+:\\d{12}:function:[a-zA-Z0-9_-]{1,64})$", + "resolutionSource": "Fn::If on condition 'Enabled12'" + } + }, + { + "ruleId": "F3033", + "severity": "FATAL", + "message": "length 0 is below minimum 1", + "source": "SCHEMA", + "entity": { + "logicalId": "Function", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.FunctionName", + "category": "Schema", + "startLine": 100, + "startColumn": 7, + "endLine": 100, + "endColumn": 19, + "conditionScenario": { + "Enabled12": true + }, + "ruleDescription": "String length out of bounds", + "phase": "SCHEMA", + "context": { + "actualValue": "", + "resolutionSource": "Fn::If on condition 'Enabled12'", + "extra": { + "actual_length": 0, + "min_length": 1 + } + } + }, + { + "ruleId": "W2530", + "severity": "WARN", + "message": "SnapStart is enabled but no AWS::Lambda::Version resource is attached", + "source": "CFN_LINT", + "entity": { + "logicalId": "Function", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.SnapStart.ApplyOn", + "suggestedFix": "Add an AWS::Lambda::Version resource that references this function", + "category": "Best Practice", + "startLine": 102, + "startColumn": 35, + "endLine": 102, + "endColumn": 42, + "ruleDescription": "Validate that SnapStart is properly configured", + "phase": "LINT" + }, + { + "ruleId": "W9002", + "severity": "WARN", + "message": "Property 'KmsKeyArn' has a hardcoded ARN - use Ref, GetAtt, or a parameter instead", + "source": "ENGINE", + "entity": { + "logicalId": "Function", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.KmsKeyArn", + "category": "Best Practice", + "startLine": 92, + "startColumn": 7, + "endLine": 92, + "endColumn": 16, + "ruleDescription": "Hardcoded ARN property", + "phase": "LINT" + }, + { + "ruleId": "I9001", + "severity": "INFO", + "message": "Property 'FunctionName' is create-only; updating it will cause resource replacement", + "source": "ENGINE", + "entity": { + "logicalId": "Function", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.FunctionName", + "category": "Best Practice", + "startLine": 100, + "startColumn": 7, + "endLine": 100, + "endColumn": 19, + "ruleDescription": "Create-only property updated triggers resource replacement", + "phase": "SCHEMA", + "context": { + "lifecycle": "create-only", + "resolutionSource": "Fn::If on condition 'Enabled12'" + } + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'FunctionRole' of type 'AWS::IAM::Role' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "FunctionRole", + "entityType": "Resource", + "resourceType": "AWS::IAM::Role" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 74, + "startColumn": 5, + "endLine": 74, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Function' of type 'AWS::Lambda::Function' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "Function", + "entityType": "Resource", + "resourceType": "AWS::Lambda::Function" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 103, + "startColumn": 7, + "endLine": 103, + "endColumn": 11, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, + "security/independent_conditions_statements.yaml": { + "filePath": "security/independent_conditions_statements.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 1, + "counts": { + "fatal": 0, + "errors": 1, + "warnings": 0, + "informational": 1, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "E3510", + "severity": "ERROR", + "message": "[] is too short (minimum 1 item)", + "source": "CFN_LINT", + "entity": { + "logicalId": "Role", + "entityType": "Resource", + "resourceType": "AWS::IAM::Role" + }, + "propertyPath": "Properties.Policies.0.PolicyDocument.Statement", + "category": "Resource", + "startLine": 85, + "startColumn": 13, + "endLine": 85, + "endColumn": 22, + "ruleDescription": "Validate identity based IAM policies", + "phase": "LINT" + }, + { + "ruleId": "I9040", + "severity": "INFO", + "message": "Resource 'Role' of type 'AWS::IAM::Role' supports Tags but none are configured", + "source": "ENGINE", + "entity": { + "logicalId": "Role", + "entityType": "Resource", + "resourceType": "AWS::IAM::Role" + }, + "propertyPath": "Properties.Tags", + "suggestedFix": "Add Tags to improve resource organization and cost tracking", + "category": "Best Practice", + "startLine": 74, + "startColumn": 5, + "endLine": 74, + "endColumn": 15, + "ruleDescription": "Resource should have Tags", + "phase": "LINT" + } + ] + }, "security/many_conditions.yaml": { "filePath": "security/many_conditions.yaml", "status": "OK", @@ -147849,5 +155576,69 @@ "phase": "LINT" } ] + }, + "security/yaml_alias_expanded_depth.yaml": { + "filePath": "security/yaml_alias_expanded_depth.yaml", + "status": "ERROR", + "metadata": { + "resourcesScanned": 0, + "counts": { + "fatal": 1, + "errors": 0, + "warnings": 0, + "informational": 0, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "F1101", + "severity": "FATAL", + "message": "Template exceeds the maximum structural nesting depth of 512 at line 12", + "source": "SCHEMA", + "category": "Structure", + "startLine": 12, + "startColumn": 83, + "endLine": 12, + "endColumn": 83, + "ruleDescription": "Invalid YAML/JSON syntax", + "phase": "PARSE" + } + ] + }, + "security/yaml_alias_expansion.yaml": { + "filePath": "security/yaml_alias_expansion.yaml", + "status": "ERROR", + "metadata": { + "resourcesScanned": 0, + "counts": { + "fatal": 1, + "errors": 0, + "warnings": 0, + "informational": 0, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [ + { + "ruleId": "F1101", + "severity": "FATAL", + "message": "Template exceeds the maximum YAML alias expansion of 1048576 nodes at line 12", + "source": "SCHEMA", + "category": "Structure", + "startLine": 12, + "startColumn": 20, + "endLine": 12, + "endColumn": 20, + "ruleDescription": "Invalid YAML/JSON syntax", + "phase": "PARSE" + } + ] } } diff --git a/src/resources/security/conditional_scenario_correctness.yaml b/src/resources/security/conditional_scenario_correctness.yaml new file mode 100644 index 00000000..4b4535de --- /dev/null +++ b/src/resources/security/conditional_scenario_correctness.yaml @@ -0,0 +1,172 @@ +# Generated by resources/security/generate.py - do not edit by hand. + +AWSTemplateFormatVersion: '2010-09-09' +Description: 'Fixture: conditional scenario correctness. Generated; no sensitive data.' +Parameters: + Toggle00: + Type: String + Default: '' + Toggle01: + Type: String + Default: '' + Toggle02: + Type: String + Default: '' + Toggle03: + Type: String + Default: '' + Toggle04: + Type: String + Default: '' + Toggle05: + Type: String + Default: '' + Toggle06: + Type: String + Default: '' + Toggle07: + Type: String + Default: '' + Toggle08: + Type: String + Default: '' + Toggle09: + Type: String + Default: '' + Toggle10: + Type: String + Default: '' + Toggle11: + Type: String + Default: '' + Toggle12: + Type: String + Default: '' + Toggle13: + Type: String + Default: '' + Toggle14: + Type: String + Default: '' + Toggle15: + Type: String + Default: '' + Toggle16: + Type: String + Default: '' + Toggle17: + Type: String + Default: '' + Toggle18: + Type: String + Default: '' + Toggle19: + Type: String + Default: '' + Toggle20: + Type: String + Default: '' +Conditions: + Enabled00: !Not [!Equals [!Ref Toggle00, '']] + Enabled01: !Not [!Equals [!Ref Toggle01, '']] + Enabled02: !Not [!Equals [!Ref Toggle02, '']] + Enabled03: !Not [!Equals [!Ref Toggle03, '']] + Enabled04: !Not [!Equals [!Ref Toggle04, '']] + Enabled05: !Not [!Equals [!Ref Toggle05, '']] + Enabled06: !Not [!Equals [!Ref Toggle06, '']] + Enabled07: !Not [!Equals [!Ref Toggle07, '']] + Enabled08: !Not [!Equals [!Ref Toggle08, '']] + Enabled09: !Not [!Equals [!Ref Toggle09, '']] + Enabled10: !Not [!Equals [!Ref Toggle10, '']] + Enabled11: !Not [!Equals [!Ref Toggle11, '']] + Enabled12: !Not [!Equals [!Ref Toggle12, '']] + Enabled13: !Not [!Equals [!Ref Toggle13, '']] + Enabled14: !Not [!Equals [!Ref Toggle14, '']] + Enabled15: !Not [!Equals [!Ref Toggle15, '']] + Enabled16: !Not [!Equals [!Ref Toggle16, '']] + Enabled17: !Not [!Equals [!Ref Toggle17, '']] + Enabled18: !Not [!Equals [!Ref Toggle18, '']] + Enabled19: !Not [!Equals [!Ref Toggle19, '']] + Enabled20: !Not [!Equals [!Ref Toggle20, '']] +Resources: + SharedRole: + Type: AWS::IAM::Role + Properties: + AssumeRolePolicyDocument: + Version: '2012-10-17' + Statement: + - Effect: Allow + Principal: {Service: lambda.amazonaws.com} + Action: 'sts:AssumeRole' + ComplementaryArchitectureFunction: + Type: AWS::Lambda::Function + Properties: + Runtime: python3.12 + Handler: index.handler + Role: !GetAtt SharedRole.Arn + Code: {S3Bucket: fixture, S3Key: function.zip} + Architectures: + - !If [Enabled00, !ImportValue ArchitectureA, !Ref AWS::NoValue] + - !If [Enabled00, !Ref AWS::NoValue, !ImportValue ArchitectureB] + RepeatedConditionFunction: + Type: AWS::Lambda::Function + Properties: + Runtime: python3.12 + Handler: index.handler + Role: !GetAtt SharedRole.Arn + Code: {S3Bucket: fixture, S3Key: function.zip} + Architectures: + - x86_64 + - !If [Enabled01, !If [Enabled01, !Ref AWS::NoValue, arm64], !Ref AWS::NoValue] + NestedUniqueFunction: + Type: AWS::Lambda::Function + Properties: + Runtime: python3.12 + Handler: index.handler + Role: !GetAtt SharedRole.Arn + Code: {S3Bucket: fixture, S3Key: function.zip} + Tags: + - Key: Stage + Value: !If [Enabled02, prod, dev] + - {Key: Stage, Value: dev} + SnapStartFunction: + Type: AWS::Lambda::Function + Properties: + Runtime: java21 + Handler: index.handler + Role: !GetAtt SharedRole.Arn + Code: {S3Bucket: fixture, S3Key: function.zip} + SnapStart: !If [Enabled03, !Ref AWS::NoValue, {ApplyOn: PublishedVersions}] + TaggedTopic: + Type: AWS::SNS::Topic + Properties: !If + - Enabled04 + - TopicName: tagged-a + Tags: !If + - Enabled04 + - [{Key: team, Value: a}] + - !Ref AWS::NoValue + - TopicName: tagged-b + Tags: [{Key: team, Value: b}] + Record: + Type: AWS::Route53::RecordSet + Properties: + HostedZoneName: example.com. + Name: www.example.com. + Type: A + TTL: '300' + ResourceRecords: + - !If [Enabled05, 192.0.2.1, !If [Enabled06, 192.0.2.2, !If [Enabled07, not-an-address, 192.0.2.3]]] + - !If [Enabled08, 198.51.100.1, !Ref AWS::NoValue] + - !If [Enabled09, 198.51.100.2, !Ref AWS::NoValue] + - !If [Enabled10, 198.51.100.3, !Ref AWS::NoValue] + - !If [Enabled11, 198.51.100.4, !Ref AWS::NoValue] + - !If [Enabled12, 198.51.100.5, !Ref AWS::NoValue] + - !If [Enabled13, 198.51.100.6, !Ref AWS::NoValue] + - !If [Enabled14, 198.51.100.7, !Ref AWS::NoValue] + - !If [Enabled15, 198.51.100.8, !Ref AWS::NoValue] + - !If [Enabled16, 198.51.100.9, !Ref AWS::NoValue] + - !If [Enabled17, 198.51.100.10, !Ref AWS::NoValue] + - !If [Enabled18, 198.51.100.11, !Ref AWS::NoValue] + - !If [Enabled19, 198.51.100.12, !Ref AWS::NoValue] + - !If [Enabled20, 198.51.100.13, !Ref AWS::NoValue] diff --git a/src/resources/security/generate.py b/src/resources/security/generate.py index b1f1f473..56872f1a 100644 --- a/src/resources/security/generate.py +++ b/src/resources/security/generate.py @@ -37,6 +37,30 @@ shared-input fusion, wide parameter closures, opaque values, De Morgan nesting, Rules constraints, and nested Fn::If resources + independent_conditions_list_items.yaml + one Access Analyzer whose Tags list has 18 items, + each gated by its own Fn::If over AWS::NoValue + (2^18 joint presence assignments; schema has + maxItems and uniqueItems) + independent_conditions_properties.yaml + one Lambda function with 16 optional top-level + properties, each gated by its own condition + independent_conditions_object_keys.yaml + one Lambda function whose Environment.Variables + object has 16 optional keys + independent_conditions_statements.yaml + one IAM role whose inline policy has 16 optional + statements (a joint consumer of the whole document) + conditional_scenario_correctness.yaml + reachable alternatives and condition-aware list + cardinality, uniqueness, property presence, and + SnapStart checks + yaml_alias_expansion.yaml eight levels of nine YAML aliases that resolve to + 9^8 scalars when aliases are copied (billion laughs) + yaml_alias_expanded_depth.yaml + a small alias chain whose expanded nesting exceeds + the structural depth limit while its node count + remains below the expansion budget All content is synthetic and generic: no account IDs, ARNs, secrets, or any sensitive or private data. Names are sequential placeholders. @@ -877,6 +901,281 @@ def append_if_arguments(depth: int, indent: int) -> None: write("deep_intrinsic_resolution.yaml", "\n".join(lines) + "\n") +# Independent conditions on the members of one value. CloudFormation allows 200 +# parameters and does not cap conditions, so a resource exposing this many +# optional members through parameters is a valid template; validation must stay +# polynomial in the member count rather than enumerate the 2^N joint assignments. +INDEPENDENT_LIST_ITEMS = 18 +INDEPENDENT_PROPERTIES = 16 +INDEPENDENT_OBJECT_KEYS = 16 +INDEPENDENT_STATEMENTS = 16 + +# Lambda function properties that are optional in the resource schema, each with +# a value accepted by that property. +OPTIONAL_LAMBDA_PROPERTIES = [ + ("Description", "!Ref Toggle00"), + ("MemorySize", "256"), + ("Timeout", "30"), + ("ReservedConcurrentExecutions", "5"), + ("KmsKeyArn", "!Sub 'arn:${AWS::Partition}:kms:${AWS::Region}:${AWS::AccountId}:key/fixture'"), + ("Environment", "{Variables: {STAGE: !Ref Toggle00}}"), + ("TracingConfig", "{Mode: Active}"), + ("DeadLetterConfig", "{TargetArn: !Sub 'arn:${AWS::Partition}:sqs:${AWS::Region}:${AWS::AccountId}:fixture'}"), + ("VpcConfig", "{SubnetIds: [subnet-00000000], SecurityGroupIds: [sg-00000000]}"), + ("Layers", "[!Sub 'arn:${AWS::Partition}:lambda:${AWS::Region}:${AWS::AccountId}:layer:fixture:1']"), + ("Architectures", "[arm64]"), + ("EphemeralStorage", "{Size: 1024}"), + ("FunctionName", "!Ref Toggle00"), + ("LoggingConfig", "{LogFormat: JSON}"), + ("SnapStart", "{ApplyOn: PublishedVersions}"), + ("Tags", "[{Key: team, Value: !Ref Toggle00}]"), +] + +# Alias fan-out of the YAML alias fixture: LEVELS nested anchors, each a sequence +# of WIDTH aliases to the previous level, so a copying alias resolver builds +# WIDTH^LEVELS scalars from a few hundred bytes. +YAML_ALIAS_WIDTH = 9 +YAML_ALIAS_LEVELS = 8 +YAML_ALIAS_DEPTH_PER_LEVEL = 64 +YAML_ALIAS_DEPTH_LEVELS = 9 +SCENARIO_COVERAGE_SIBLINGS = 13 +SCENARIO_CORRECTNESS_CONDITIONS = 8 + SCENARIO_COVERAGE_SIBLINGS + + +def independent_condition_header(description: str, count: int) -> list[str]: + lines = [ + HEADER, + "AWSTemplateFormatVersion: '2010-09-09'", + f"Description: 'Fixture: {description}. Generated; no sensitive data.'", + "Parameters:", + ] + for index in range(count): + lines += [f" Toggle{index:02d}:", " Type: String", " Default: ''"] + lines.append("Conditions:") + for index in range(count): + lines.append(f" Enabled{index:02d}: !Not [!Equals [!Ref Toggle{index:02d}, '']]") + return lines + + +def lambda_function_lines(resource_name: str) -> list[str]: + return [ + f" {resource_name}Role:", + " Type: AWS::IAM::Role", + " Properties:", + " AssumeRolePolicyDocument:", + " Version: '2012-10-17'", + " Statement:", + " - Effect: Allow", + " Principal: {Service: lambda.amazonaws.com}", + " Action: 'sts:AssumeRole'", + f" {resource_name}:", + " Type: AWS::Lambda::Function", + " Properties:", + " Runtime: python3.12", + " Handler: index.handler", + f" Role: !GetAtt {resource_name}Role.Arn", + " Code: {ZipFile: 'def handler(event, context): return None'}", + ] + + +def gen_independent_conditions_list_items() -> None: + """One schema-constrained list whose items are independently gated.""" + lines = independent_condition_header("independent conditions on list items", INDEPENDENT_LIST_ITEMS) + lines += [ + "Resources:", + " Analyzer:", + " Type: AWS::AccessAnalyzer::Analyzer", + " Properties:", + " Type: ACCOUNT", + " Tags:", + ] + for index in range(INDEPENDENT_LIST_ITEMS): + lines.append( + f" - !If [Enabled{index:02d}, {{Key: tag-{index:02d}, Value: !Ref Toggle{index:02d}}}, " + "!Ref AWS::NoValue]" + ) + write("independent_conditions_list_items.yaml", "\n".join(lines) + "\n") + + +def gen_independent_conditions_properties() -> None: + """One resource whose optional top-level properties are each independently gated. + + Rules that read the whole Properties block must expand only the properties they + inspect; otherwise 2^16 joint scenarios are materialized per rule. + """ + if len(OPTIONAL_LAMBDA_PROPERTIES) != INDEPENDENT_PROPERTIES: + raise RuntimeError("the optional Lambda property list must match INDEPENDENT_PROPERTIES") + lines = independent_condition_header("independent conditions on optional properties", INDEPENDENT_PROPERTIES) + lines += ["Resources:"] + lambda_function_lines("Function") + for index, (name, value) in enumerate(OPTIONAL_LAMBDA_PROPERTIES): + lines.append(f" {name}: !If [Enabled{index:02d}, {value}, !Ref AWS::NoValue]") + write("independent_conditions_properties.yaml", "\n".join(lines) + "\n") + + +def gen_independent_conditions_object_keys() -> None: + """One nested object whose keys are each independently gated.""" + lines = independent_condition_header("independent conditions on object keys", INDEPENDENT_OBJECT_KEYS) + lines += ["Resources:"] + lambda_function_lines("Function") + [" Environment:", " Variables:"] + for index in range(INDEPENDENT_OBJECT_KEYS): + lines.append( + f" VARIABLE_{index:02d}: !If [Enabled{index:02d}, !Ref Toggle{index:02d}, !Ref AWS::NoValue]" + ) + write("independent_conditions_object_keys.yaml", "\n".join(lines) + "\n") + + +def gen_independent_conditions_statements() -> None: + """One IAM policy document whose statements are each independently gated. + + Policy analysis evaluates the document as a whole, so it exercises the joint + scenario product directly; the covering strategy must keep it linear. + """ + lines = independent_condition_header("independent conditions on policy statements", INDEPENDENT_STATEMENTS) + lines += [ + "Resources:", + " Role:", + " Type: AWS::IAM::Role", + " Properties:", + " AssumeRolePolicyDocument:", + " Version: '2012-10-17'", + " Statement:", + " - Effect: Allow", + " Principal: {Service: lambda.amazonaws.com}", + " Action: 'sts:AssumeRole'", + " Policies:", + " - PolicyName: inline", + " PolicyDocument:", + " Version: '2012-10-17'", + " Statement:", + ] + for index in range(INDEPENDENT_STATEMENTS): + lines.append( + f" - !If [Enabled{index:02d}, {{Effect: Allow, Action: 's3:GetObject', " + f"Resource: !Sub 'arn:${{AWS::Partition}}:s3:::fixture-{index:02d}/*'}}, !Ref AWS::NoValue]" + ) + write("independent_conditions_statements.yaml", "\n".join(lines) + "\n") + + +def gen_conditional_scenario_correctness() -> None: + """Condition-sensitive checks that must remain exact beyond the product bound.""" + lines = independent_condition_header("conditional scenario correctness", SCENARIO_CORRECTNESS_CONDITIONS) + lines += [ + "Resources:", + " SharedRole:", + " Type: AWS::IAM::Role", + " Properties:", + " AssumeRolePolicyDocument:", + " Version: '2012-10-17'", + " Statement:", + " - Effect: Allow", + " Principal: {Service: lambda.amazonaws.com}", + " Action: 'sts:AssumeRole'", + ] + + def append_function(name: str, runtime: str = "python3.12") -> None: + lines.extend( + [ + f" {name}:", + " Type: AWS::Lambda::Function", + " Properties:", + f" Runtime: {runtime}", + " Handler: index.handler", + " Role: !GetAtt SharedRole.Arn", + " Code: {S3Bucket: fixture, S3Key: function.zip}", + ] + ) + + append_function("ComplementaryArchitectureFunction") + lines += [ + " Architectures:", + " - !If [Enabled00, !ImportValue ArchitectureA, !Ref AWS::NoValue]", + " - !If [Enabled00, !Ref AWS::NoValue, !ImportValue ArchitectureB]", + ] + append_function("RepeatedConditionFunction") + lines += [ + " Architectures:", + " - x86_64", + " - !If [Enabled01, !If [Enabled01, !Ref AWS::NoValue, arm64], !Ref AWS::NoValue]", + ] + append_function("NestedUniqueFunction") + lines += [ + " Tags:", + " - Key: Stage", + " Value: !If [Enabled02, prod, dev]", + " - {Key: Stage, Value: dev}", + ] + append_function("SnapStartFunction", "java21") + lines.append(" SnapStart: !If [Enabled03, !Ref AWS::NoValue, {ApplyOn: PublishedVersions}]") + lines += [ + " TaggedTopic:", + " Type: AWS::SNS::Topic", + " Properties: !If", + " - Enabled04", + " - TopicName: tagged-a", + " Tags: !If", + " - Enabled04", + " - [{Key: team, Value: a}]", + " - !Ref AWS::NoValue", + " - TopicName: tagged-b", + " Tags: [{Key: team, Value: b}]", + " Record:", + " Type: AWS::Route53::RecordSet", + " Properties:", + " HostedZoneName: example.com.", + " Name: www.example.com.", + " Type: A", + " TTL: '300'", + " ResourceRecords:", + " - !If [Enabled05, 192.0.2.1, !If [Enabled06, 192.0.2.2, !If [Enabled07, not-an-address, 192.0.2.3]]]", + ] + for index in range(SCENARIO_COVERAGE_SIBLINGS): + condition_index = index + 8 + lines.append( + f" - !If [Enabled{condition_index:02d}, 198.51.100.{index + 1}, !Ref AWS::NoValue]" + ) + write("conditional_scenario_correctness.yaml", "\n".join(lines) + "\n") + + +def gen_yaml_alias_expanded_depth() -> None: + """An alias chain whose expanded nesting, but not node count, exceeds the depth limit.""" + open_containers = "[" * YAML_ALIAS_DEPTH_PER_LEVEL + close_containers = "]" * YAML_ALIAS_DEPTH_PER_LEVEL + lines = [ + HEADER, + "AWSTemplateFormatVersion: '2010-09-09'", + "Metadata:", + f" Level0: &level0 {open_containers}x{close_containers}", + ] + for level in range(1, YAML_ALIAS_DEPTH_LEVELS): + lines.append( + f" Level{level}: &level{level} {open_containers}*level{level - 1}{close_containers}" + ) + lines += ["Resources:", " Topic:", " Type: AWS::SNS::Topic"] + write("yaml_alias_expanded_depth.yaml", "\n".join(lines) + "\n") + + +def gen_yaml_alias_expansion() -> None: + """Nested YAML aliases whose copied expansion is exponential in the nesting depth.""" + lines = [ + HEADER, + "AWSTemplateFormatVersion: '2010-09-09'", + f"Description: 'Fixture: {YAML_ALIAS_LEVELS} levels of {YAML_ALIAS_WIDTH} YAML aliases. " + "Generated; no sensitive data.'", + "Metadata:", + f" Level0: &level0 [{', '.join(['x'] * YAML_ALIAS_WIDTH)}]", + ] + for level in range(1, YAML_ALIAS_LEVELS): + aliases = ", ".join([f"*level{level - 1}"] * YAML_ALIAS_WIDTH) + lines.append(f" Level{level}: &level{level} [{aliases}]") + lines += [ + "Resources:", + " Topic:", + " Type: AWS::SNS::Topic", + " Metadata:", + f" Expanded: *level{YAML_ALIAS_LEVELS - 1}", + ] + write("yaml_alias_expansion.yaml", "\n".join(lines) + "\n") + + def main() -> None: gen_deep_nesting() gen_many_conditions() @@ -892,6 +1191,13 @@ def main() -> None: gen_foreach_branch_explosion() gen_deep_yaml_nesting() gen_deep_intrinsic_resolution() + gen_independent_conditions_list_items() + gen_independent_conditions_properties() + gen_independent_conditions_object_keys() + gen_independent_conditions_statements() + gen_conditional_scenario_correctness() + gen_yaml_alias_expansion() + gen_yaml_alias_expanded_depth() if __name__ == "__main__": diff --git a/src/resources/security/independent_conditions_list_items.yaml b/src/resources/security/independent_conditions_list_items.yaml new file mode 100644 index 00000000..6d90a832 --- /dev/null +++ b/src/resources/security/independent_conditions_list_items.yaml @@ -0,0 +1,102 @@ +# Generated by resources/security/generate.py - do not edit by hand. + +AWSTemplateFormatVersion: '2010-09-09' +Description: 'Fixture: independent conditions on list items. Generated; no sensitive data.' +Parameters: + Toggle00: + Type: String + Default: '' + Toggle01: + Type: String + Default: '' + Toggle02: + Type: String + Default: '' + Toggle03: + Type: String + Default: '' + Toggle04: + Type: String + Default: '' + Toggle05: + Type: String + Default: '' + Toggle06: + Type: String + Default: '' + Toggle07: + Type: String + Default: '' + Toggle08: + Type: String + Default: '' + Toggle09: + Type: String + Default: '' + Toggle10: + Type: String + Default: '' + Toggle11: + Type: String + Default: '' + Toggle12: + Type: String + Default: '' + Toggle13: + Type: String + Default: '' + Toggle14: + Type: String + Default: '' + Toggle15: + Type: String + Default: '' + Toggle16: + Type: String + Default: '' + Toggle17: + Type: String + Default: '' +Conditions: + Enabled00: !Not [!Equals [!Ref Toggle00, '']] + Enabled01: !Not [!Equals [!Ref Toggle01, '']] + Enabled02: !Not [!Equals [!Ref Toggle02, '']] + Enabled03: !Not [!Equals [!Ref Toggle03, '']] + Enabled04: !Not [!Equals [!Ref Toggle04, '']] + Enabled05: !Not [!Equals [!Ref Toggle05, '']] + Enabled06: !Not [!Equals [!Ref Toggle06, '']] + Enabled07: !Not [!Equals [!Ref Toggle07, '']] + Enabled08: !Not [!Equals [!Ref Toggle08, '']] + Enabled09: !Not [!Equals [!Ref Toggle09, '']] + Enabled10: !Not [!Equals [!Ref Toggle10, '']] + Enabled11: !Not [!Equals [!Ref Toggle11, '']] + Enabled12: !Not [!Equals [!Ref Toggle12, '']] + Enabled13: !Not [!Equals [!Ref Toggle13, '']] + Enabled14: !Not [!Equals [!Ref Toggle14, '']] + Enabled15: !Not [!Equals [!Ref Toggle15, '']] + Enabled16: !Not [!Equals [!Ref Toggle16, '']] + Enabled17: !Not [!Equals [!Ref Toggle17, '']] +Resources: + Analyzer: + Type: AWS::AccessAnalyzer::Analyzer + Properties: + Type: ACCOUNT + Tags: + - !If [Enabled00, {Key: tag-00, Value: !Ref Toggle00}, !Ref AWS::NoValue] + - !If [Enabled01, {Key: tag-01, Value: !Ref Toggle01}, !Ref AWS::NoValue] + - !If [Enabled02, {Key: tag-02, Value: !Ref Toggle02}, !Ref AWS::NoValue] + - !If [Enabled03, {Key: tag-03, Value: !Ref Toggle03}, !Ref AWS::NoValue] + - !If [Enabled04, {Key: tag-04, Value: !Ref Toggle04}, !Ref AWS::NoValue] + - !If [Enabled05, {Key: tag-05, Value: !Ref Toggle05}, !Ref AWS::NoValue] + - !If [Enabled06, {Key: tag-06, Value: !Ref Toggle06}, !Ref AWS::NoValue] + - !If [Enabled07, {Key: tag-07, Value: !Ref Toggle07}, !Ref AWS::NoValue] + - !If [Enabled08, {Key: tag-08, Value: !Ref Toggle08}, !Ref AWS::NoValue] + - !If [Enabled09, {Key: tag-09, Value: !Ref Toggle09}, !Ref AWS::NoValue] + - !If [Enabled10, {Key: tag-10, Value: !Ref Toggle10}, !Ref AWS::NoValue] + - !If [Enabled11, {Key: tag-11, Value: !Ref Toggle11}, !Ref AWS::NoValue] + - !If [Enabled12, {Key: tag-12, Value: !Ref Toggle12}, !Ref AWS::NoValue] + - !If [Enabled13, {Key: tag-13, Value: !Ref Toggle13}, !Ref AWS::NoValue] + - !If [Enabled14, {Key: tag-14, Value: !Ref Toggle14}, !Ref AWS::NoValue] + - !If [Enabled15, {Key: tag-15, Value: !Ref Toggle15}, !Ref AWS::NoValue] + - !If [Enabled16, {Key: tag-16, Value: !Ref Toggle16}, !Ref AWS::NoValue] + - !If [Enabled17, {Key: tag-17, Value: !Ref Toggle17}, !Ref AWS::NoValue] diff --git a/src/resources/security/independent_conditions_object_keys.yaml b/src/resources/security/independent_conditions_object_keys.yaml new file mode 100644 index 00000000..8a96d7b1 --- /dev/null +++ b/src/resources/security/independent_conditions_object_keys.yaml @@ -0,0 +1,105 @@ +# Generated by resources/security/generate.py - do not edit by hand. + +AWSTemplateFormatVersion: '2010-09-09' +Description: 'Fixture: independent conditions on object keys. Generated; no sensitive data.' +Parameters: + Toggle00: + Type: String + Default: '' + Toggle01: + Type: String + Default: '' + Toggle02: + Type: String + Default: '' + Toggle03: + Type: String + Default: '' + Toggle04: + Type: String + Default: '' + Toggle05: + Type: String + Default: '' + Toggle06: + Type: String + Default: '' + Toggle07: + Type: String + Default: '' + Toggle08: + Type: String + Default: '' + Toggle09: + Type: String + Default: '' + Toggle10: + Type: String + Default: '' + Toggle11: + Type: String + Default: '' + Toggle12: + Type: String + Default: '' + Toggle13: + Type: String + Default: '' + Toggle14: + Type: String + Default: '' + Toggle15: + Type: String + Default: '' +Conditions: + Enabled00: !Not [!Equals [!Ref Toggle00, '']] + Enabled01: !Not [!Equals [!Ref Toggle01, '']] + Enabled02: !Not [!Equals [!Ref Toggle02, '']] + Enabled03: !Not [!Equals [!Ref Toggle03, '']] + Enabled04: !Not [!Equals [!Ref Toggle04, '']] + Enabled05: !Not [!Equals [!Ref Toggle05, '']] + Enabled06: !Not [!Equals [!Ref Toggle06, '']] + Enabled07: !Not [!Equals [!Ref Toggle07, '']] + Enabled08: !Not [!Equals [!Ref Toggle08, '']] + Enabled09: !Not [!Equals [!Ref Toggle09, '']] + Enabled10: !Not [!Equals [!Ref Toggle10, '']] + Enabled11: !Not [!Equals [!Ref Toggle11, '']] + Enabled12: !Not [!Equals [!Ref Toggle12, '']] + Enabled13: !Not [!Equals [!Ref Toggle13, '']] + Enabled14: !Not [!Equals [!Ref Toggle14, '']] + Enabled15: !Not [!Equals [!Ref Toggle15, '']] +Resources: + FunctionRole: + Type: AWS::IAM::Role + Properties: + AssumeRolePolicyDocument: + Version: '2012-10-17' + Statement: + - Effect: Allow + Principal: {Service: lambda.amazonaws.com} + Action: 'sts:AssumeRole' + Function: + Type: AWS::Lambda::Function + Properties: + Runtime: python3.12 + Handler: index.handler + Role: !GetAtt FunctionRole.Arn + Code: {ZipFile: 'def handler(event, context): return None'} + Environment: + Variables: + VARIABLE_00: !If [Enabled00, !Ref Toggle00, !Ref AWS::NoValue] + VARIABLE_01: !If [Enabled01, !Ref Toggle01, !Ref AWS::NoValue] + VARIABLE_02: !If [Enabled02, !Ref Toggle02, !Ref AWS::NoValue] + VARIABLE_03: !If [Enabled03, !Ref Toggle03, !Ref AWS::NoValue] + VARIABLE_04: !If [Enabled04, !Ref Toggle04, !Ref AWS::NoValue] + VARIABLE_05: !If [Enabled05, !Ref Toggle05, !Ref AWS::NoValue] + VARIABLE_06: !If [Enabled06, !Ref Toggle06, !Ref AWS::NoValue] + VARIABLE_07: !If [Enabled07, !Ref Toggle07, !Ref AWS::NoValue] + VARIABLE_08: !If [Enabled08, !Ref Toggle08, !Ref AWS::NoValue] + VARIABLE_09: !If [Enabled09, !Ref Toggle09, !Ref AWS::NoValue] + VARIABLE_10: !If [Enabled10, !Ref Toggle10, !Ref AWS::NoValue] + VARIABLE_11: !If [Enabled11, !Ref Toggle11, !Ref AWS::NoValue] + VARIABLE_12: !If [Enabled12, !Ref Toggle12, !Ref AWS::NoValue] + VARIABLE_13: !If [Enabled13, !Ref Toggle13, !Ref AWS::NoValue] + VARIABLE_14: !If [Enabled14, !Ref Toggle14, !Ref AWS::NoValue] + VARIABLE_15: !If [Enabled15, !Ref Toggle15, !Ref AWS::NoValue] diff --git a/src/resources/security/independent_conditions_properties.yaml b/src/resources/security/independent_conditions_properties.yaml new file mode 100644 index 00000000..005be57c --- /dev/null +++ b/src/resources/security/independent_conditions_properties.yaml @@ -0,0 +1,103 @@ +# Generated by resources/security/generate.py - do not edit by hand. + +AWSTemplateFormatVersion: '2010-09-09' +Description: 'Fixture: independent conditions on optional properties. Generated; no sensitive data.' +Parameters: + Toggle00: + Type: String + Default: '' + Toggle01: + Type: String + Default: '' + Toggle02: + Type: String + Default: '' + Toggle03: + Type: String + Default: '' + Toggle04: + Type: String + Default: '' + Toggle05: + Type: String + Default: '' + Toggle06: + Type: String + Default: '' + Toggle07: + Type: String + Default: '' + Toggle08: + Type: String + Default: '' + Toggle09: + Type: String + Default: '' + Toggle10: + Type: String + Default: '' + Toggle11: + Type: String + Default: '' + Toggle12: + Type: String + Default: '' + Toggle13: + Type: String + Default: '' + Toggle14: + Type: String + Default: '' + Toggle15: + Type: String + Default: '' +Conditions: + Enabled00: !Not [!Equals [!Ref Toggle00, '']] + Enabled01: !Not [!Equals [!Ref Toggle01, '']] + Enabled02: !Not [!Equals [!Ref Toggle02, '']] + Enabled03: !Not [!Equals [!Ref Toggle03, '']] + Enabled04: !Not [!Equals [!Ref Toggle04, '']] + Enabled05: !Not [!Equals [!Ref Toggle05, '']] + Enabled06: !Not [!Equals [!Ref Toggle06, '']] + Enabled07: !Not [!Equals [!Ref Toggle07, '']] + Enabled08: !Not [!Equals [!Ref Toggle08, '']] + Enabled09: !Not [!Equals [!Ref Toggle09, '']] + Enabled10: !Not [!Equals [!Ref Toggle10, '']] + Enabled11: !Not [!Equals [!Ref Toggle11, '']] + Enabled12: !Not [!Equals [!Ref Toggle12, '']] + Enabled13: !Not [!Equals [!Ref Toggle13, '']] + Enabled14: !Not [!Equals [!Ref Toggle14, '']] + Enabled15: !Not [!Equals [!Ref Toggle15, '']] +Resources: + FunctionRole: + Type: AWS::IAM::Role + Properties: + AssumeRolePolicyDocument: + Version: '2012-10-17' + Statement: + - Effect: Allow + Principal: {Service: lambda.amazonaws.com} + Action: 'sts:AssumeRole' + Function: + Type: AWS::Lambda::Function + Properties: + Runtime: python3.12 + Handler: index.handler + Role: !GetAtt FunctionRole.Arn + Code: {ZipFile: 'def handler(event, context): return None'} + Description: !If [Enabled00, !Ref Toggle00, !Ref AWS::NoValue] + MemorySize: !If [Enabled01, 256, !Ref AWS::NoValue] + Timeout: !If [Enabled02, 30, !Ref AWS::NoValue] + ReservedConcurrentExecutions: !If [Enabled03, 5, !Ref AWS::NoValue] + KmsKeyArn: !If [Enabled04, !Sub 'arn:${AWS::Partition}:kms:${AWS::Region}:${AWS::AccountId}:key/fixture', !Ref AWS::NoValue] + Environment: !If [Enabled05, {Variables: {STAGE: !Ref Toggle00}}, !Ref AWS::NoValue] + TracingConfig: !If [Enabled06, {Mode: Active}, !Ref AWS::NoValue] + DeadLetterConfig: !If [Enabled07, {TargetArn: !Sub 'arn:${AWS::Partition}:sqs:${AWS::Region}:${AWS::AccountId}:fixture'}, !Ref AWS::NoValue] + VpcConfig: !If [Enabled08, {SubnetIds: [subnet-00000000], SecurityGroupIds: [sg-00000000]}, !Ref AWS::NoValue] + Layers: !If [Enabled09, [!Sub 'arn:${AWS::Partition}:lambda:${AWS::Region}:${AWS::AccountId}:layer:fixture:1'], !Ref AWS::NoValue] + Architectures: !If [Enabled10, [arm64], !Ref AWS::NoValue] + EphemeralStorage: !If [Enabled11, {Size: 1024}, !Ref AWS::NoValue] + FunctionName: !If [Enabled12, !Ref Toggle00, !Ref AWS::NoValue] + LoggingConfig: !If [Enabled13, {LogFormat: JSON}, !Ref AWS::NoValue] + SnapStart: !If [Enabled14, {ApplyOn: PublishedVersions}, !Ref AWS::NoValue] + Tags: !If [Enabled15, [{Key: team, Value: !Ref Toggle00}], !Ref AWS::NoValue] diff --git a/src/resources/security/independent_conditions_statements.yaml b/src/resources/security/independent_conditions_statements.yaml new file mode 100644 index 00000000..62e87b49 --- /dev/null +++ b/src/resources/security/independent_conditions_statements.yaml @@ -0,0 +1,101 @@ +# Generated by resources/security/generate.py - do not edit by hand. + +AWSTemplateFormatVersion: '2010-09-09' +Description: 'Fixture: independent conditions on policy statements. Generated; no sensitive data.' +Parameters: + Toggle00: + Type: String + Default: '' + Toggle01: + Type: String + Default: '' + Toggle02: + Type: String + Default: '' + Toggle03: + Type: String + Default: '' + Toggle04: + Type: String + Default: '' + Toggle05: + Type: String + Default: '' + Toggle06: + Type: String + Default: '' + Toggle07: + Type: String + Default: '' + Toggle08: + Type: String + Default: '' + Toggle09: + Type: String + Default: '' + Toggle10: + Type: String + Default: '' + Toggle11: + Type: String + Default: '' + Toggle12: + Type: String + Default: '' + Toggle13: + Type: String + Default: '' + Toggle14: + Type: String + Default: '' + Toggle15: + Type: String + Default: '' +Conditions: + Enabled00: !Not [!Equals [!Ref Toggle00, '']] + Enabled01: !Not [!Equals [!Ref Toggle01, '']] + Enabled02: !Not [!Equals [!Ref Toggle02, '']] + Enabled03: !Not [!Equals [!Ref Toggle03, '']] + Enabled04: !Not [!Equals [!Ref Toggle04, '']] + Enabled05: !Not [!Equals [!Ref Toggle05, '']] + Enabled06: !Not [!Equals [!Ref Toggle06, '']] + Enabled07: !Not [!Equals [!Ref Toggle07, '']] + Enabled08: !Not [!Equals [!Ref Toggle08, '']] + Enabled09: !Not [!Equals [!Ref Toggle09, '']] + Enabled10: !Not [!Equals [!Ref Toggle10, '']] + Enabled11: !Not [!Equals [!Ref Toggle11, '']] + Enabled12: !Not [!Equals [!Ref Toggle12, '']] + Enabled13: !Not [!Equals [!Ref Toggle13, '']] + Enabled14: !Not [!Equals [!Ref Toggle14, '']] + Enabled15: !Not [!Equals [!Ref Toggle15, '']] +Resources: + Role: + Type: AWS::IAM::Role + Properties: + AssumeRolePolicyDocument: + Version: '2012-10-17' + Statement: + - Effect: Allow + Principal: {Service: lambda.amazonaws.com} + Action: 'sts:AssumeRole' + Policies: + - PolicyName: inline + PolicyDocument: + Version: '2012-10-17' + Statement: + - !If [Enabled00, {Effect: Allow, Action: 's3:GetObject', Resource: !Sub 'arn:${AWS::Partition}:s3:::fixture-00/*'}, !Ref AWS::NoValue] + - !If [Enabled01, {Effect: Allow, Action: 's3:GetObject', Resource: !Sub 'arn:${AWS::Partition}:s3:::fixture-01/*'}, !Ref AWS::NoValue] + - !If [Enabled02, {Effect: Allow, Action: 's3:GetObject', Resource: !Sub 'arn:${AWS::Partition}:s3:::fixture-02/*'}, !Ref AWS::NoValue] + - !If [Enabled03, {Effect: Allow, Action: 's3:GetObject', Resource: !Sub 'arn:${AWS::Partition}:s3:::fixture-03/*'}, !Ref AWS::NoValue] + - !If [Enabled04, {Effect: Allow, Action: 's3:GetObject', Resource: !Sub 'arn:${AWS::Partition}:s3:::fixture-04/*'}, !Ref AWS::NoValue] + - !If [Enabled05, {Effect: Allow, Action: 's3:GetObject', Resource: !Sub 'arn:${AWS::Partition}:s3:::fixture-05/*'}, !Ref AWS::NoValue] + - !If [Enabled06, {Effect: Allow, Action: 's3:GetObject', Resource: !Sub 'arn:${AWS::Partition}:s3:::fixture-06/*'}, !Ref AWS::NoValue] + - !If [Enabled07, {Effect: Allow, Action: 's3:GetObject', Resource: !Sub 'arn:${AWS::Partition}:s3:::fixture-07/*'}, !Ref AWS::NoValue] + - !If [Enabled08, {Effect: Allow, Action: 's3:GetObject', Resource: !Sub 'arn:${AWS::Partition}:s3:::fixture-08/*'}, !Ref AWS::NoValue] + - !If [Enabled09, {Effect: Allow, Action: 's3:GetObject', Resource: !Sub 'arn:${AWS::Partition}:s3:::fixture-09/*'}, !Ref AWS::NoValue] + - !If [Enabled10, {Effect: Allow, Action: 's3:GetObject', Resource: !Sub 'arn:${AWS::Partition}:s3:::fixture-10/*'}, !Ref AWS::NoValue] + - !If [Enabled11, {Effect: Allow, Action: 's3:GetObject', Resource: !Sub 'arn:${AWS::Partition}:s3:::fixture-11/*'}, !Ref AWS::NoValue] + - !If [Enabled12, {Effect: Allow, Action: 's3:GetObject', Resource: !Sub 'arn:${AWS::Partition}:s3:::fixture-12/*'}, !Ref AWS::NoValue] + - !If [Enabled13, {Effect: Allow, Action: 's3:GetObject', Resource: !Sub 'arn:${AWS::Partition}:s3:::fixture-13/*'}, !Ref AWS::NoValue] + - !If [Enabled14, {Effect: Allow, Action: 's3:GetObject', Resource: !Sub 'arn:${AWS::Partition}:s3:::fixture-14/*'}, !Ref AWS::NoValue] + - !If [Enabled15, {Effect: Allow, Action: 's3:GetObject', Resource: !Sub 'arn:${AWS::Partition}:s3:::fixture-15/*'}, !Ref AWS::NoValue] diff --git a/src/resources/security/yaml_alias_expanded_depth.yaml b/src/resources/security/yaml_alias_expanded_depth.yaml new file mode 100644 index 00000000..f51e8bb8 --- /dev/null +++ b/src/resources/security/yaml_alias_expanded_depth.yaml @@ -0,0 +1,16 @@ +# Generated by resources/security/generate.py - do not edit by hand. + +AWSTemplateFormatVersion: '2010-09-09' +Metadata: + Level0: &level0 [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[x]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] + Level1: &level1 [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[*level0]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] + Level2: &level2 [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[*level1]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] + Level3: &level3 [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[*level2]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] + Level4: &level4 [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[*level3]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] + Level5: &level5 [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[*level4]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] + Level6: &level6 [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[*level5]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] + Level7: &level7 [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[*level6]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] + Level8: &level8 [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[*level7]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] +Resources: + Topic: + Type: AWS::SNS::Topic diff --git a/src/resources/security/yaml_alias_expansion.yaml b/src/resources/security/yaml_alias_expansion.yaml new file mode 100644 index 00000000..dee867e5 --- /dev/null +++ b/src/resources/security/yaml_alias_expansion.yaml @@ -0,0 +1,18 @@ +# Generated by resources/security/generate.py - do not edit by hand. + +AWSTemplateFormatVersion: '2010-09-09' +Description: 'Fixture: 8 levels of 9 YAML aliases. Generated; no sensitive data.' +Metadata: + Level0: &level0 [x, x, x, x, x, x, x, x, x] + Level1: &level1 [*level0, *level0, *level0, *level0, *level0, *level0, *level0, *level0, *level0] + Level2: &level2 [*level1, *level1, *level1, *level1, *level1, *level1, *level1, *level1, *level1] + Level3: &level3 [*level2, *level2, *level2, *level2, *level2, *level2, *level2, *level2, *level2] + Level4: &level4 [*level3, *level3, *level3, *level3, *level3, *level3, *level3, *level3, *level3] + Level5: &level5 [*level4, *level4, *level4, *level4, *level4, *level4, *level4, *level4, *level4] + Level6: &level6 [*level5, *level5, *level5, *level5, *level5, *level5, *level5, *level5, *level5] + Level7: &level7 [*level6, *level6, *level6, *level6, *level6, *level6, *level6, *level6, *level6] +Resources: + Topic: + Type: AWS::SNS::Topic + Metadata: + Expanded: *level7 diff --git a/src/resources/templates/bad/E3023_cname_conditional_record_counts.yaml b/src/resources/templates/bad/E3023_cname_conditional_record_counts.yaml new file mode 100644 index 00000000..761c88d5 --- /dev/null +++ b/src/resources/templates/bad/E3023_cname_conditional_record_counts.yaml @@ -0,0 +1,45 @@ +AWSTemplateFormatVersion: '2010-09-09' +Description: Regression fixture for conditional CNAME record-count source paths +Parameters: + Mode: + Type: String + AllowedValues: [first, second] +Conditions: + ChooseFirst: !Equals [!Ref Mode, first] +Resources: + ConditionalList: + Type: AWS::Route53::RecordSet + Properties: + HostedZoneName: example.com. + Name: list.example.com. + Type: CNAME + TTL: '300' + ResourceRecords: !If + - ChooseFirst + - [one.example.net., two.example.net.] + - [three.example.net., four.example.net.] + ConditionalProperties: + Type: AWS::Route53::RecordSet + Properties: !If + - ChooseFirst + - HostedZoneName: example.com. + Name: properties.example.com. + Type: CNAME + TTL: '300' + ResourceRecords: [five.example.net., six.example.net.] + - HostedZoneName: example.com. + Name: properties.example.com. + Type: CNAME + TTL: '300' + ResourceRecords: [seven.example.net., eight.example.net.] + SingleRecordBranches: + Type: AWS::Route53::RecordSet + Properties: + HostedZoneName: example.com. + Name: single.example.com. + Type: CNAME + TTL: '300' + ResourceRecords: !If + - ChooseFirst + - [nine.example.net.] + - [ten.example.net.] diff --git a/src/resources/templates/bad/E3023_cname_projection_covering.yaml b/src/resources/templates/bad/E3023_cname_projection_covering.yaml new file mode 100644 index 00000000..421fcba9 --- /dev/null +++ b/src/resources/templates/bad/E3023_cname_projection_covering.yaml @@ -0,0 +1,90 @@ +AWSTemplateFormatVersion: '2010-09-09' +Description: Regression fixture for correlated Route53 record identity scenarios +Parameters: + TypeFirstValue: + Type: String + AllowedValues: ['true', 'false'] + TypeSecondValue: + Type: String + AllowedValues: ['true', 'false'] + TypeThirdValue: + Type: String + AllowedValues: ['true', 'false'] + UseSubdomainValue: + Type: String + AllowedValues: ['true', 'false'] + Record00Value: + Type: String + AllowedValues: ['true', 'false'] + Record01Value: + Type: String + AllowedValues: ['true', 'false'] + Record02Value: + Type: String + AllowedValues: ['true', 'false'] + Record03Value: + Type: String + AllowedValues: ['true', 'false'] + Record04Value: + Type: String + AllowedValues: ['true', 'false'] + Record05Value: + Type: String + AllowedValues: ['true', 'false'] + Record06Value: + Type: String + AllowedValues: ['true', 'false'] + Record07Value: + Type: String + AllowedValues: ['true', 'false'] + Record08Value: + Type: String + AllowedValues: ['true', 'false'] + Record09Value: + Type: String + AllowedValues: ['true', 'false'] +Conditions: + TypeFirst: !Equals [!Ref TypeFirstValue, 'true'] + TypeSecond: !Equals [!Ref TypeSecondValue, 'true'] + TypeThird: !Equals [!Ref TypeThirdValue, 'true'] + UseSubdomain: !Equals [!Ref UseSubdomainValue, 'true'] + Record00Enabled: !Equals [!Ref Record00Value, 'true'] + Record01Enabled: !Equals [!Ref Record01Value, 'true'] + Record02Enabled: !Equals [!Ref Record02Value, 'true'] + Record03Enabled: !Equals [!Ref Record03Value, 'true'] + Record04Enabled: !Equals [!Ref Record04Value, 'true'] + Record05Enabled: !Equals [!Ref Record05Value, 'true'] + Record06Enabled: !Equals [!Ref Record06Value, 'true'] + Record07Enabled: !Equals [!Ref Record07Value, 'true'] + Record08Enabled: !Equals [!Ref Record08Value, 'true'] + Record09Enabled: !Equals [!Ref Record09Value, 'true'] + IncludeRecord00: !And [!Condition Record00Enabled, !Or [!Condition TypeFirst, !Condition TypeSecond, !Not [!Condition TypeThird]]] + IncludeRecord01: !And [!Condition Record01Enabled, !Or [!Condition TypeFirst, !Condition TypeSecond, !Not [!Condition TypeThird]]] + IncludeRecord02: !And [!Condition Record02Enabled, !Or [!Condition TypeFirst, !Condition TypeSecond, !Not [!Condition TypeThird]]] + IncludeRecord03: !And [!Condition Record03Enabled, !Or [!Condition TypeFirst, !Condition TypeSecond, !Not [!Condition TypeThird]]] + IncludeRecord04: !And [!Condition Record04Enabled, !Or [!Condition TypeFirst, !Condition TypeSecond, !Not [!Condition TypeThird]]] + IncludeRecord05: !And [!Condition Record05Enabled, !Or [!Condition TypeFirst, !Condition TypeSecond, !Not [!Condition TypeThird]]] + IncludeRecord06: !And [!Condition Record06Enabled, !Or [!Condition TypeFirst, !Condition TypeSecond, !Not [!Condition TypeThird]]] + IncludeRecord07: !And [!Condition Record07Enabled, !Or [!Condition TypeFirst, !Condition TypeSecond, !Not [!Condition TypeThird]]] + IncludeRecord08: !And [!Condition Record08Enabled, !Or [!Condition TypeFirst, !Condition TypeSecond, !Not [!Condition TypeThird]]] + IncludeRecord09: !And [!Condition Record09Enabled, !Or [!Condition TypeFirst, !Condition TypeSecond, !Not [!Condition TypeThird]]] +Resources: + Record: + Type: AWS::Route53::RecordSet + Properties: + HostedZoneName: example.com. + Name: !If [UseSubdomain, www.example.com., example.com.] + Type: !If [TypeFirst, NS, !If [TypeSecond, NS, !If [TypeThird, CNAME, NS]]] + TTL: '300' + ResourceRecords: + - target.example.net. + - !If [IncludeRecord00, target00.example.net., !Ref AWS::NoValue] + - !If [IncludeRecord01, target01.example.net., !Ref AWS::NoValue] + - !If [IncludeRecord02, target02.example.net., !Ref AWS::NoValue] + - !If [IncludeRecord03, target03.example.net., !Ref AWS::NoValue] + - !If [IncludeRecord04, target04.example.net., !Ref AWS::NoValue] + - !If [IncludeRecord05, target05.example.net., !Ref AWS::NoValue] + - !If [IncludeRecord06, target06.example.net., !Ref AWS::NoValue] + - !If [IncludeRecord07, target07.example.net., !Ref AWS::NoValue] + - !If [IncludeRecord08, target08.example.net., !Ref AWS::NoValue] + - !If [IncludeRecord09, target09.example.net., !Ref AWS::NoValue] diff --git a/src/resources/templates/bad/E3023_record_value_projection_covering.yaml b/src/resources/templates/bad/E3023_record_value_projection_covering.yaml new file mode 100644 index 00000000..ed641106 --- /dev/null +++ b/src/resources/templates/bad/E3023_record_value_projection_covering.yaml @@ -0,0 +1,101 @@ +AWSTemplateFormatVersion: '2010-09-09' +Description: Regression fixture for independently evaluated Route53 record members +Parameters: + TypeFirstValue: + Type: String + AllowedValues: ['true', 'false'] + TypeSecondValue: + Type: String + AllowedValues: ['true', 'false'] + TypeThirdValue: + Type: String + AllowedValues: ['true', 'false'] + Skip00Value: + Type: String + AllowedValues: ['true', 'false'] + Skip01Value: + Type: String + AllowedValues: ['true', 'false'] + Skip02Value: + Type: String + AllowedValues: ['true', 'false'] + Skip03Value: + Type: String + AllowedValues: ['true', 'false'] + Skip04Value: + Type: String + AllowedValues: ['true', 'false'] + Skip05Value: + Type: String + AllowedValues: ['true', 'false'] + Skip06Value: + Type: String + AllowedValues: ['true', 'false'] + Skip07Value: + Type: String + AllowedValues: ['true', 'false'] + Skip08Value: + Type: String + AllowedValues: ['true', 'false'] + Skip09Value: + Type: String + AllowedValues: ['true', 'false'] + Skip10Value: + Type: String + AllowedValues: ['true', 'false'] +Conditions: + TypeFirst: !Equals [!Ref TypeFirstValue, 'true'] + TypeSecond: !Equals [!Ref TypeSecondValue, 'true'] + TypeThird: !Equals [!Ref TypeThirdValue, 'true'] + Skip00: !Equals [!Ref Skip00Value, 'true'] + Skip01: !Equals [!Ref Skip01Value, 'true'] + Skip02: !Equals [!Ref Skip02Value, 'true'] + Skip03: !Equals [!Ref Skip03Value, 'true'] + Skip04: !Equals [!Ref Skip04Value, 'true'] + Skip05: !Equals [!Ref Skip05Value, 'true'] + Skip06: !Equals [!Ref Skip06Value, 'true'] + Skip07: !Equals [!Ref Skip07Value, 'true'] + Skip08: !Equals [!Ref Skip08Value, 'true'] + Skip09: !Equals [!Ref Skip09Value, 'true'] + Skip10: !Equals [!Ref Skip10Value, 'true'] +Resources: + CnameCountRecord: + Type: AWS::Route53::RecordSet + Properties: + HostedZoneName: example.com. + Name: count.example.com. + Type: !If [TypeFirst, NS, !If [TypeSecond, NS, !If [TypeThird, CNAME, NS]]] + TTL: '300' + ResourceRecords: + - target.example.net. + - !If [Skip00, !Ref AWS::NoValue, target00.example.net.] + - !If [Skip01, !Ref AWS::NoValue, target01.example.net.] + - !If [Skip02, !Ref AWS::NoValue, target02.example.net.] + - !If [Skip03, !Ref AWS::NoValue, target03.example.net.] + - !If [Skip04, !Ref AWS::NoValue, target04.example.net.] + - !If [Skip05, !Ref AWS::NoValue, target05.example.net.] + - !If [Skip06, !Ref AWS::NoValue, target06.example.net.] + - !If [Skip07, !Ref AWS::NoValue, target07.example.net.] + - !If [Skip08, !Ref AWS::NoValue, target08.example.net.] + - !If [Skip09, !Ref AWS::NoValue, target09.example.net.] + - !If [Skip10, !Ref AWS::NoValue, target10.example.net.] + AddressRecord: + Type: AWS::Route53::RecordSet + Properties: + HostedZoneName: example.com. + Name: address.example.com. + Type: !If [TypeFirst, NS, !If [TypeSecond, NS, !If [TypeThird, A, NS]]] + TTL: '300' + ResourceRecords: + - 192.0.2.1 + - !If [Skip00, !Ref AWS::NoValue, not-an-ip] + - !If [Skip01, !Ref AWS::NoValue, 192.0.2.2] + - !If [Skip02, !Ref AWS::NoValue, 192.0.2.3] + - !If [Skip03, !Ref AWS::NoValue, 192.0.2.4] + - !If [Skip04, !Ref AWS::NoValue, 192.0.2.5] + - !If [Skip05, !Ref AWS::NoValue, 192.0.2.6] + - !If [Skip06, !Ref AWS::NoValue, 192.0.2.7] + - !If [Skip07, !Ref AWS::NoValue, 192.0.2.8] + - !If [Skip08, !Ref AWS::NoValue, 192.0.2.9] + - !If [Skip09, !Ref AWS::NoValue, 192.0.2.10] + - !If [Skip10, !Ref AWS::NoValue, 192.0.2.11] diff --git a/src/resources/templates/bad/E3023_recordsetgroup_projection_covering.yaml b/src/resources/templates/bad/E3023_recordsetgroup_projection_covering.yaml new file mode 100644 index 00000000..721a01a8 --- /dev/null +++ b/src/resources/templates/bad/E3023_recordsetgroup_projection_covering.yaml @@ -0,0 +1,75 @@ +AWSTemplateFormatVersion: '2010-09-09' +Description: Regression fixture for independently evaluated Route53 record group members +Parameters: + TypeFirstValue: {Type: String, AllowedValues: ['true', 'false']} + TypeSecondValue: {Type: String, AllowedValues: ['true', 'false']} + TypeThirdValue: {Type: String, AllowedValues: ['true', 'false']} + Skip00Value: {Type: String, AllowedValues: ['true', 'false']} + Skip01Value: {Type: String, AllowedValues: ['true', 'false']} + Skip02Value: {Type: String, AllowedValues: ['true', 'false']} + Skip03Value: {Type: String, AllowedValues: ['true', 'false']} + Skip04Value: {Type: String, AllowedValues: ['true', 'false']} + Skip05Value: {Type: String, AllowedValues: ['true', 'false']} + Skip06Value: {Type: String, AllowedValues: ['true', 'false']} + Skip07Value: {Type: String, AllowedValues: ['true', 'false']} + Skip08Value: {Type: String, AllowedValues: ['true', 'false']} + Skip09Value: {Type: String, AllowedValues: ['true', 'false']} + Skip10Value: {Type: String, AllowedValues: ['true', 'false']} +Conditions: + TypeFirst: !Equals [!Ref TypeFirstValue, 'true'] + TypeSecond: !Equals [!Ref TypeSecondValue, 'true'] + TypeThird: !Equals [!Ref TypeThirdValue, 'true'] + Skip00: !Equals [!Ref Skip00Value, 'true'] + Skip01: !Equals [!Ref Skip01Value, 'true'] + Skip02: !Equals [!Ref Skip02Value, 'true'] + Skip03: !Equals [!Ref Skip03Value, 'true'] + Skip04: !Equals [!Ref Skip04Value, 'true'] + Skip05: !Equals [!Ref Skip05Value, 'true'] + Skip06: !Equals [!Ref Skip06Value, 'true'] + Skip07: !Equals [!Ref Skip07Value, 'true'] + Skip08: !Equals [!Ref Skip08Value, 'true'] + Skip09: !Equals [!Ref Skip09Value, 'true'] + Skip10: !Equals [!Ref Skip10Value, 'true'] +Resources: + CnameGroup: + Type: AWS::Route53::RecordSetGroup + Properties: + HostedZoneName: example.com. + RecordSets: + - Name: count.example.com. + Type: !If [TypeFirst, NS, !If [TypeSecond, NS, !If [TypeThird, CNAME, NS]]] + TTL: '300' + ResourceRecords: + - target.example.net. + - !If [Skip00, !Ref AWS::NoValue, target00.example.net.] + - !If [Skip01, !Ref AWS::NoValue, target01.example.net.] + - !If [Skip02, !Ref AWS::NoValue, target02.example.net.] + - !If [Skip03, !Ref AWS::NoValue, target03.example.net.] + - !If [Skip04, !Ref AWS::NoValue, target04.example.net.] + - !If [Skip05, !Ref AWS::NoValue, target05.example.net.] + - !If [Skip06, !Ref AWS::NoValue, target06.example.net.] + - !If [Skip07, !Ref AWS::NoValue, target07.example.net.] + - !If [Skip08, !Ref AWS::NoValue, target08.example.net.] + - !If [Skip09, !Ref AWS::NoValue, target09.example.net.] + - !If [Skip10, !Ref AWS::NoValue, target10.example.net.] + AddressGroup: + Type: AWS::Route53::RecordSetGroup + Properties: + HostedZoneName: example.com. + RecordSets: + - Name: address.example.com. + Type: !If [TypeFirst, NS, !If [TypeSecond, NS, !If [TypeThird, A, NS]]] + TTL: '300' + ResourceRecords: + - 192.0.2.1 + - !If [Skip00, !Ref AWS::NoValue, not-an-ip] + - !If [Skip01, !Ref AWS::NoValue, 192.0.2.2] + - !If [Skip02, !Ref AWS::NoValue, 192.0.2.3] + - !If [Skip03, !Ref AWS::NoValue, 192.0.2.4] + - !If [Skip04, !Ref AWS::NoValue, 192.0.2.5] + - !If [Skip05, !Ref AWS::NoValue, 192.0.2.6] + - !If [Skip06, !Ref AWS::NoValue, 192.0.2.7] + - !If [Skip07, !Ref AWS::NoValue, 192.0.2.8] + - !If [Skip08, !Ref AWS::NoValue, 192.0.2.9] + - !If [Skip09, !Ref AWS::NoValue, 192.0.2.10] + - !If [Skip10, !Ref AWS::NoValue, 192.0.2.11] diff --git a/src/resources/templates/bad/E3029_alias_projection_covering.yaml b/src/resources/templates/bad/E3029_alias_projection_covering.yaml new file mode 100644 index 00000000..3da30e9b --- /dev/null +++ b/src/resources/templates/bad/E3029_alias_projection_covering.yaml @@ -0,0 +1,35 @@ +AWSTemplateFormatVersion: '2010-09-09' +Parameters: + TtlValue: + Type: String + AllowedValues: ['60', '61', '62', '63', '64', '65', '66', '67', '68', '69', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '80', '81', '82', '83', '84', '85', '86', '87', '88', '89', '90', '91', '92', '93', '94', '95', '96', '97', '98', '99', '100', '101', '102', '103', '104', '105', '106', '107', '108', '109', '110', '111', '112', '113', '114', '115', '116', '117', '118', '119', '120', '121', '122', '123', '124', '125', '126', '127', '128', '129', '130', '131', '132', '133', '134', '135', '136', '137', '138', '139', '140', '141', '142', '143', '144', '145', '146', '147', '148', '149', '150', '151', '152', '153', '154', '155', '156', '157', '158', '159', '160', '161', '162', '163', '164', '165', '166', '167', '168', '169', '170', '171', '172', '173', '174', '175', '176', '177', '178', '179', '180', '181', '182', '183', '184', '185', '186', '187', '188', '189', '190', '191', '192', '193', '194', '195', '196', '197', '198', '199', '200', '201', '202', '203', '204', '205', '206', '207', '208', '209', '210', '211', '212', '213', '214', '215', '216', '217', '218', '219', '220', '221', '222', '223', '224', '225', '226', '227', '228', '229', '230', '231', '232', '233', '234', '235', '236', '237', '238', '239', '240', '241', '242', '243', '244', '245', '246', '247', '248', '249', '250', '251', '252', '253', '254', '255', '256', '257', '258', '259', '260', '261', '262', '263', '264', '265', '266', '267', '268', '269', '270', '271', '272', '273', '274', '275', '276', '277', '278', '279', '280', '281', '282', '283', '284', '285', '286', '287', '288', '289', '290', '291', '292', '293', '294', '295', '296', '297', '298', '299', '300', '301', '302', '303', '304', '305', '306', '307', '308', '309', '310', '311', '312', '313', '314', '315', '316', '317', '318', '319', '320', '321', '322', '323', '324', '325', '326', '327', '328', '329', '330', '331', '332', '333', '334', '335', '336', '337', '338', '339', '340', '341', '342', '343', '344', '345', '346', '347', '348', '349', '350', '351', '352', '353', '354', '355', '356', '357', '358', '359', '360', '361', '362', '363', '364', '365', '366', '367', '368', '369', '370', '371', '372', '373', '374', '375', '376', '377', '378', '379', '380', '381', '382', '383', '384', '385', '386', '387', '388', '389', '390', '391', '392', '393', '394', '395', '396', '397', '398', '399', '400', '401', '402', '403', '404', '405', '406', '407', '408', '409', '410', '411', '412', '413', '414', '415', '416', '417', '418', '419', '420', '421', '422', '423', '424', '425', '426', '427', '428', '429', '430', '431', '432', '433', '434', '435', '436', '437', '438', '439', '440', '441', '442', '443', '444', '445', '446', '447', '448', '449', '450', '451', '452', '453', '454', '455', '456', '457', '458', '459', '460', '461', '462', '463', '464', '465', '466', '467', '468', '469', '470', '471', '472', '473', '474', '475', '476', '477', '478', '479', '480', '481', '482', '483', '484', '485', '486', '487', '488', '489', '490', '491', '492', '493', '494', '495', '496', '497', '498', '499', '500', '501', '502', '503', '504', '505', '506', '507', '508', '509', '510', '511', '512', '513', '514', '515', '516', '517', '518', '519', '520', '521', '522', '523', '524', '525', '526', '527', '528', '529', '530', '531', '532', '533', '534', '535', '536', '537', '538', '539', '540', '541', '542', '543', '544', '545', '546', '547', '548', '549', '550', '551', '552', '553', '554', '555', '556', '557', '558', '559', '560', '561', '562', '563', '564', '565', '566', '567', '568', '569', '570', '571', '572', '573', '574', '575', '576', '577', '578', '579', '580', '581', '582', '583', '584', '585', '586', '587', '588', '589', '590', '591', '592', '593', '594', '595', '596', '597', '598', '599', '600', '601', '602', '603', '604', '605', '606', '607', '608', '609', '610', '611', '612', '613', '614', '615', '616', '617', '618', '619', '620', '621', '622', '623', '624', '625', '626', '627', '628', '629', '630', '631', '632', '633', '634', '635', '636', '637', '638', '639', '640', '641', '642', '643', '644', '645', '646', '647', '648', '649', '650', '651', '652', '653', '654', '655', '656', '657', '658', '659'] + AliasOffValue: + Type: String + AllowedValues: ['true', 'false'] + TypeFirstValue: + Type: String + AllowedValues: ['true', 'false'] + TypeSecondValue: + Type: String + AllowedValues: ['true', 'false'] + TypeThirdValue: + Type: String + AllowedValues: ['true', 'false'] +Conditions: + AliasOff: !Equals [!Ref AliasOffValue, 'true'] + TypeFirst: !Equals [!Ref TypeFirstValue, 'true'] + TypeSecond: !Equals [!Ref TypeSecondValue, 'true'] + TypeThird: !Equals [!Ref TypeThirdValue, 'true'] +Resources: + Record: + Type: AWS::Route53::RecordSet + Properties: + HostedZoneName: example.com. + Name: www.example.com. + Type: !If [TypeFirst, A, !If [TypeSecond, A, !If [TypeThird, NS, A]]] + TTL: !Ref TtlValue + AliasTarget: !If + - AliasOff + - !Ref AWS::NoValue + - DNSName: d111111abcdef8.cloudfront.net. + HostedZoneId: Z2FDTNDATAQYW2 diff --git a/src/resources/templates/bad/E3048_fargate_projection_covering.yaml b/src/resources/templates/bad/E3048_fargate_projection_covering.yaml new file mode 100644 index 00000000..6f6e07ed --- /dev/null +++ b/src/resources/templates/bad/E3048_fargate_projection_covering.yaml @@ -0,0 +1,91 @@ +AWSTemplateFormatVersion: '2010-09-09' +Description: Regression fixture for independently projected Fargate properties +Parameters: + LaunchType: + Type: String + AllowedValues: [FARGATE, EC2] + NetworkFirstValue: + Type: String + AllowedValues: ['true', 'false'] + NetworkSecondValue: + Type: String + AllowedValues: ['true', 'false'] + NetworkThirdValue: + Type: String + AllowedValues: ['true', 'false'] + Placement00Value: + Type: String + AllowedValues: ['true', 'false'] + Placement01Value: + Type: String + AllowedValues: ['true', 'false'] + Placement02Value: + Type: String + AllowedValues: ['true', 'false'] + Placement03Value: + Type: String + AllowedValues: ['true', 'false'] + Placement04Value: + Type: String + AllowedValues: ['true', 'false'] + Placement05Value: + Type: String + AllowedValues: ['true', 'false'] + Placement06Value: + Type: String + AllowedValues: ['true', 'false'] + Placement07Value: + Type: String + AllowedValues: ['true', 'false'] + Placement08Value: + Type: String + AllowedValues: ['true', 'false'] + Placement09Value: + Type: String + AllowedValues: ['true', 'false'] + Placement10Value: + Type: String + AllowedValues: ['true', 'false'] +Conditions: + IsFargate: !Equals [!Ref LaunchType, FARGATE] + IsNotFargate: !Not [!Condition IsFargate] + NetworkFirst: !Equals [!Ref NetworkFirstValue, 'true'] + NetworkSecond: !Equals [!Ref NetworkSecondValue, 'true'] + NetworkThird: !Equals [!Ref NetworkThirdValue, 'true'] + Placement00: !Equals [!Ref Placement00Value, 'true'] + Placement01: !Equals [!Ref Placement01Value, 'true'] + Placement02: !Equals [!Ref Placement02Value, 'true'] + Placement03: !Equals [!Ref Placement03Value, 'true'] + Placement04: !Equals [!Ref Placement04Value, 'true'] + Placement05: !Equals [!Ref Placement05Value, 'true'] + Placement06: !Equals [!Ref Placement06Value, 'true'] + Placement07: !Equals [!Ref Placement07Value, 'true'] + Placement08: !Equals [!Ref Placement08Value, 'true'] + Placement09: !Equals [!Ref Placement09Value, 'true'] + Placement10: !Equals [!Ref Placement10Value, 'true'] +Resources: + Task: + Type: AWS::ECS::TaskDefinition + Properties: + RequiresCompatibilities: !If [IsFargate, [FARGATE], [EC2]] + Cpu: !If [IsNotFargate, '256', '512'] + Memory: '1024' + NetworkMode: !If [NetworkFirst, awsvpc, !If [NetworkSecond, awsvpc, !If [NetworkThird, !Ref AWS::NoValue, awsvpc]]] + ContainerDefinitions: + - Name: app + Image: nginx + Essential: true + PlacementConstraints: !If + - IsNotFargate + - - !If [Placement00, {Type: memberOf, Expression: 'attribute:zone00 == a'}, !Ref AWS::NoValue] + - !If [Placement01, {Type: memberOf, Expression: 'attribute:zone01 == a'}, !Ref AWS::NoValue] + - !If [Placement02, {Type: memberOf, Expression: 'attribute:zone02 == a'}, !Ref AWS::NoValue] + - !If [Placement03, {Type: memberOf, Expression: 'attribute:zone03 == a'}, !Ref AWS::NoValue] + - !If [Placement04, {Type: memberOf, Expression: 'attribute:zone04 == a'}, !Ref AWS::NoValue] + - !If [Placement05, {Type: memberOf, Expression: 'attribute:zone05 == a'}, !Ref AWS::NoValue] + - !If [Placement06, {Type: memberOf, Expression: 'attribute:zone06 == a'}, !Ref AWS::NoValue] + - !If [Placement07, {Type: memberOf, Expression: 'attribute:zone07 == a'}, !Ref AWS::NoValue] + - !If [Placement08, {Type: memberOf, Expression: 'attribute:zone08 == a'}, !Ref AWS::NoValue] + - !If [Placement09, {Type: memberOf, Expression: 'attribute:zone09 == a'}, !Ref AWS::NoValue] + - !If [Placement10, {Type: memberOf, Expression: 'attribute:zone10 == a'}, !Ref AWS::NoValue] + - !Ref AWS::NoValue diff --git a/src/resources/templates/bad/F3032_whole_properties_item_cardinality.yaml b/src/resources/templates/bad/F3032_whole_properties_item_cardinality.yaml new file mode 100644 index 00000000..6d907e51 --- /dev/null +++ b/src/resources/templates/bad/F3032_whole_properties_item_cardinality.yaml @@ -0,0 +1,113 @@ +AWSTemplateFormatVersion: '2010-09-09' +Description: Regression fixture for item cardinality inside conditional resource properties +Parameters: + OuterToggle: + Type: String + AllowedValues: ['true', 'false'] + Toggle00: + Type: String + AllowedValues: ['true', 'false'] + Toggle01: + Type: String + AllowedValues: ['true', 'false'] + Toggle02: + Type: String + AllowedValues: ['true', 'false'] + Toggle03: + Type: String + AllowedValues: ['true', 'false'] + Toggle04: + Type: String + AllowedValues: ['true', 'false'] + Toggle05: + Type: String + AllowedValues: ['true', 'false'] + Toggle06: + Type: String + AllowedValues: ['true', 'false'] + Toggle07: + Type: String + AllowedValues: ['true', 'false'] + Toggle08: + Type: String + AllowedValues: ['true', 'false'] + Toggle09: + Type: String + AllowedValues: ['true', 'false'] + Toggle10: + Type: String + AllowedValues: ['true', 'false'] + Toggle11: + Type: String + AllowedValues: ['true', 'false'] + Toggle12: + Type: String + AllowedValues: ['true', 'false'] + Toggle13: + Type: String + AllowedValues: ['true', 'false'] + Toggle14: + Type: String + AllowedValues: ['true', 'false'] + Toggle15: + Type: String + AllowedValues: ['true', 'false'] + Toggle16: + Type: String + AllowedValues: ['true', 'false'] +Conditions: + OuterEnabled: !Equals [!Ref OuterToggle, 'true'] + Enabled00: !Equals [!Ref Toggle00, 'true'] + Enabled01: !Equals [!Ref Toggle01, 'true'] + Enabled02: !Equals [!Ref Toggle02, 'true'] + Enabled03: !Equals [!Ref Toggle03, 'true'] + Enabled04: !Equals [!Ref Toggle04, 'true'] + Enabled05: !Equals [!Ref Toggle05, 'true'] + Enabled06: !Equals [!Ref Toggle06, 'true'] + Enabled07: !Equals [!Ref Toggle07, 'true'] + Enabled08: !Equals [!Ref Toggle08, 'true'] + Enabled09: !Equals [!Ref Toggle09, 'true'] + Enabled10: !Equals [!Ref Toggle10, 'true'] + Enabled11: !Equals [!Ref Toggle11, 'true'] + Enabled12: !Equals [!Ref Toggle12, 'true'] + Enabled13: !Equals [!Ref Toggle13, 'true'] + Enabled14: !Equals [!Ref Toggle14, 'true'] + Enabled15: !Equals [!Ref Toggle15, 'true'] + Enabled16: !Equals [!Ref Toggle16, 'true'] +Resources: + Function: + Type: AWS::Lambda::Function + Properties: + Fn::If: + - OuterEnabled + - Code: {S3Bucket: example-bucket, S3Key: function.zip} + Handler: example.Handler + Role: arn:aws:iam::123456789012:role/example + Runtime: python3.12 + Tags: [{Key: Name, Value: cardinality-fixture}] + VpcConfig: + SubnetIds: + - !If [Enabled00, subnet-00000000000000000, !Ref AWS::NoValue] + - !If [Enabled01, subnet-00000000000000001, !Ref AWS::NoValue] + - !If [Enabled02, subnet-00000000000000002, !Ref AWS::NoValue] + - !If [Enabled03, subnet-00000000000000003, !Ref AWS::NoValue] + - !If [Enabled04, subnet-00000000000000004, !Ref AWS::NoValue] + - !If [Enabled05, subnet-00000000000000005, !Ref AWS::NoValue] + - !If [Enabled06, subnet-00000000000000006, !Ref AWS::NoValue] + - !If [Enabled07, subnet-00000000000000007, !Ref AWS::NoValue] + - !If [Enabled08, subnet-00000000000000008, !Ref AWS::NoValue] + - !If [Enabled09, !Ref AWS::NoValue, subnet-00000000000000009] + - !If [Enabled10, !Ref AWS::NoValue, subnet-0000000000000000a] + - !If [Enabled11, !Ref AWS::NoValue, subnet-0000000000000000b] + - !If [Enabled12, !Ref AWS::NoValue, subnet-0000000000000000c] + - !If [Enabled13, !Ref AWS::NoValue, subnet-0000000000000000d] + - !If [Enabled14, !Ref AWS::NoValue, subnet-0000000000000000e] + - !If [Enabled15, !Ref AWS::NoValue, subnet-0000000000000000f] + - !If [Enabled16, !Ref AWS::NoValue, subnet-00000000000000010] + - Code: {S3Bucket: example-bucket, S3Key: function.zip} + Handler: example.Handler + Role: arn:aws:iam::123456789012:role/example + Runtime: python3.12 + Tags: [{Key: Name, Value: cardinality-fixture}] + VpcConfig: + SubnetIds: [subnet-00000000000000000] diff --git a/src/resources/templates/bad/W2530_snapstart_conditional_apply_on.yaml b/src/resources/templates/bad/W2530_snapstart_conditional_apply_on.yaml new file mode 100644 index 00000000..a615ea81 --- /dev/null +++ b/src/resources/templates/bad/W2530_snapstart_conditional_apply_on.yaml @@ -0,0 +1,100 @@ +AWSTemplateFormatVersion: '2010-09-09' +Description: SnapStart enabled through Fn::If in a reachable deployment that publishes no function version +Conditions: + IsUsEast1: !Equals [!Ref AWS::Region, us-east-1] +Resources: + PropertiesTrueBranch: + Type: AWS::Lambda::Function + Properties: !If + - IsUsEast1 + - Runtime: python3.12 + Handler: index.handler + Role: !Sub arn:${AWS::Partition}:iam::${AWS::AccountId}:role/lambda + Code: + S3Bucket: bucket + S3Key: code.zip + SnapStart: + ApplyOn: PublishedVersions + - Runtime: python3.12 + Handler: index.handler + Role: !Sub arn:${AWS::Partition}:iam::${AWS::AccountId}:role/lambda + Code: + S3Bucket: bucket + S3Key: code.zip + PropertiesFalseBranch: + Type: AWS::Lambda::Function + Properties: !If + - IsUsEast1 + - Runtime: python3.12 + Handler: index.handler + Role: !Sub arn:${AWS::Partition}:iam::${AWS::AccountId}:role/lambda + Code: + S3Bucket: bucket + S3Key: code.zip + - Runtime: python3.12 + Handler: index.handler + Role: !Sub arn:${AWS::Partition}:iam::${AWS::AccountId}:role/lambda + Code: + S3Bucket: bucket + S3Key: code.zip + SnapStart: + ApplyOn: PublishedVersions + ApplyOnTrueBranch: + Type: AWS::Lambda::Function + Properties: + Runtime: python3.12 + Handler: index.handler + Role: !Sub arn:${AWS::Partition}:iam::${AWS::AccountId}:role/lambda + Code: + S3Bucket: bucket + S3Key: code.zip + SnapStart: + ApplyOn: !If [IsUsEast1, PublishedVersions, None] + ApplyOnFalseBranch: + Type: AWS::Lambda::Function + Properties: + Runtime: python3.12 + Handler: index.handler + Role: !Sub arn:${AWS::Partition}:iam::${AWS::AccountId}:role/lambda + Code: + S3Bucket: bucket + S3Key: code.zip + SnapStart: + ApplyOn: !If [IsUsEast1, None, PublishedVersions] + ApplyOnBesideNoValue: + Type: AWS::Lambda::Function + Properties: + Runtime: python3.12 + Handler: index.handler + Role: !Sub arn:${AWS::Partition}:iam::${AWS::AccountId}:role/lambda + Code: + S3Bucket: bucket + S3Key: code.zip + SnapStart: + ApplyOn: !If [IsUsEast1, !Ref AWS::NoValue, PublishedVersions] + SnapStartBesideNoValue: + Type: AWS::Lambda::Function + Properties: + Runtime: python3.12 + Handler: index.handler + Role: !Sub arn:${AWS::Partition}:iam::${AWS::AccountId}:role/lambda + Code: + S3Bucket: bucket + S3Key: code.zip + SnapStart: !If + - IsUsEast1 + - !Ref AWS::NoValue + - ApplyOn: PublishedVersions + EveryBranchEnables: + Type: AWS::Lambda::Function + Properties: + Runtime: python3.12 + Handler: index.handler + Role: !Sub arn:${AWS::Partition}:iam::${AWS::AccountId}:role/lambda + Code: + S3Bucket: bucket + S3Key: code.zip + SnapStart: !If + - IsUsEast1 + - ApplyOn: PublishedVersions + - ApplyOn: PublishedVersions diff --git a/src/resources/templates/bad/W2530_snapstart_version_not_coexisting.yaml b/src/resources/templates/bad/W2530_snapstart_version_not_coexisting.yaml new file mode 100644 index 00000000..aed944f8 --- /dev/null +++ b/src/resources/templates/bad/W2530_snapstart_version_not_coexisting.yaml @@ -0,0 +1,86 @@ +AWSTemplateFormatVersion: '2010-09-09' +Description: SnapStart enabled where no AWS::Lambda::Version publishes the function in the same deployment +Parameters: + Environment: + Type: String + AllowedValues: [prod, dev] + Default: dev +Conditions: + IsProd: !Equals [!Ref Environment, prod] + IsDev: !Equals [!Ref Environment, dev] + IsUsEast1: !Equals [!Ref AWS::Region, us-east-1] +Resources: + PublishedFunction: + Type: AWS::Lambda::Function + Properties: + Runtime: python3.12 + Handler: index.handler + Role: !Sub arn:${AWS::Partition}:iam::${AWS::AccountId}:role/lambda + Code: + S3Bucket: bucket + S3Key: code.zip + VersionOnlyDependsOnFunction: + Type: AWS::Lambda::Function + Properties: + Runtime: python3.12 + Handler: index.handler + Role: !Sub arn:${AWS::Partition}:iam::${AWS::AccountId}:role/lambda + Code: + S3Bucket: bucket + S3Key: code.zip + SnapStart: + ApplyOn: PublishedVersions + OrderedVersion: + Type: AWS::Lambda::Version + DependsOn: VersionOnlyDependsOnFunction + Properties: + FunctionName: !Ref PublishedFunction + VersionOnlyDescribesFunction: + Type: AWS::Lambda::Function + Properties: + Runtime: python3.12 + Handler: index.handler + Role: !Sub arn:${AWS::Partition}:iam::${AWS::AccountId}:role/lambda + Code: + S3Bucket: bucket + S3Key: code.zip + SnapStart: + ApplyOn: PublishedVersions + DescribedVersion: + Type: AWS::Lambda::Version + Properties: + FunctionName: !Ref PublishedFunction + Description: !Ref VersionOnlyDescribesFunction + VersionInOtherEnvironment: + Type: AWS::Lambda::Function + Properties: + Runtime: python3.12 + Handler: index.handler + Role: !Sub arn:${AWS::Partition}:iam::${AWS::AccountId}:role/lambda + Code: + S3Bucket: bucket + S3Key: code.zip + SnapStart: !If + - IsProd + - ApplyOn: PublishedVersions + - !Ref AWS::NoValue + DevOnlyVersion: + Type: AWS::Lambda::Version + Condition: IsDev + Properties: + FunctionName: !Ref VersionInOtherEnvironment + VersionNamesOtherFunctionWhenEnabled: + Type: AWS::Lambda::Function + Properties: + Runtime: python3.12 + Handler: index.handler + Role: !Sub arn:${AWS::Partition}:iam::${AWS::AccountId}:role/lambda + Code: + S3Bucket: bucket + S3Key: code.zip + SnapStart: + ApplyOn: !If [IsUsEast1, PublishedVersions, None] + SwitchedVersion: + Type: AWS::Lambda::Version + Properties: + FunctionName: !If [IsUsEast1, !Ref PublishedFunction, !Ref VersionNamesOtherFunctionWhenEnabled] diff --git a/src/resources/templates/good/W2530_snapstart_unreachable_or_published.yaml b/src/resources/templates/good/W2530_snapstart_unreachable_or_published.yaml new file mode 100644 index 00000000..97807fdc --- /dev/null +++ b/src/resources/templates/good/W2530_snapstart_unreachable_or_published.yaml @@ -0,0 +1,168 @@ +AWSTemplateFormatVersion: '2010-09-09' +Description: SnapStart that is either never enabled in a reachable deployment or is published in every deployment that enables it +Conditions: + IsUsEast1: !Equals [!Ref AWS::Region, us-east-1] + IsUsWest2: !Equals [!Ref AWS::Region, us-west-2] + IsNotUsEast1: !Not [!Condition IsUsEast1] +Resources: + PropertiesBranchExcludedByResourceCondition: + Type: AWS::Lambda::Function + Condition: IsUsEast1 + Properties: !If + - IsUsEast1 + - Runtime: python3.12 + Handler: index.handler + Role: !Sub arn:${AWS::Partition}:iam::${AWS::AccountId}:role/lambda + Code: + S3Bucket: bucket + S3Key: code.zip + - Runtime: python3.12 + Handler: index.handler + Role: !Sub arn:${AWS::Partition}:iam::${AWS::AccountId}:role/lambda + Code: + S3Bucket: bucket + S3Key: code.zip + SnapStart: + ApplyOn: PublishedVersions + ApplyOnBranchExcludedByResourceCondition: + Type: AWS::Lambda::Function + Condition: IsUsEast1 + Properties: + Runtime: python3.12 + Handler: index.handler + Role: !Sub arn:${AWS::Partition}:iam::${AWS::AccountId}:role/lambda + Code: + S3Bucket: bucket + S3Key: code.zip + SnapStart: + ApplyOn: !If [IsUsEast1, None, PublishedVersions] + RepeatedConditionExcludesInnerBranch: + Type: AWS::Lambda::Function + Properties: + Runtime: python3.12 + Handler: index.handler + Role: !Sub arn:${AWS::Partition}:iam::${AWS::AccountId}:role/lambda + Code: + S3Bucket: bucket + S3Key: code.zip + SnapStart: !If + - IsUsEast1 + - ApplyOn: !If [IsUsEast1, None, PublishedVersions] + - ApplyOn: None + ExclusiveConditionsExcludeInnerBranch: + Type: AWS::Lambda::Function + Properties: + Runtime: python3.12 + Handler: index.handler + Role: !Sub arn:${AWS::Partition}:iam::${AWS::AccountId}:role/lambda + Code: + S3Bucket: bucket + S3Key: code.zip + SnapStart: !If + - IsUsEast1 + - ApplyOn: !If [IsUsWest2, PublishedVersions, None] + - ApplyOn: None + SnapStartNoValueOrNone: + Type: AWS::Lambda::Function + Properties: + Runtime: python3.12 + Handler: index.handler + Role: !Sub arn:${AWS::Partition}:iam::${AWS::AccountId}:role/lambda + Code: + S3Bucket: bucket + S3Key: code.zip + SnapStart: !If + - IsUsEast1 + - !Ref AWS::NoValue + - ApplyOn: None + PublishedThroughSub: + Type: AWS::Lambda::Function + Properties: + Runtime: python3.12 + Handler: index.handler + Role: !Sub arn:${AWS::Partition}:iam::${AWS::AccountId}:role/lambda + Code: + S3Bucket: bucket + S3Key: code.zip + SnapStart: + ApplyOn: PublishedVersions + PublishedThroughSubVersion: + Type: AWS::Lambda::Version + Properties: + FunctionName: !Sub ${PublishedThroughSub} + PublishedFromConditionalProperties: + Type: AWS::Lambda::Function + Properties: !If + - IsUsEast1 + - Runtime: python3.12 + Handler: index.handler + Role: !Sub arn:${AWS::Partition}:iam::${AWS::AccountId}:role/lambda + Code: + S3Bucket: bucket + S3Key: code.zip + SnapStart: + ApplyOn: PublishedVersions + - Runtime: python3.12 + Handler: index.handler + Role: !Sub arn:${AWS::Partition}:iam::${AWS::AccountId}:role/lambda + Code: + S3Bucket: bucket + S3Key: code.zip + PublishedFromConditionalPropertiesVersion: + Type: AWS::Lambda::Version + Properties: + FunctionName: !GetAtt PublishedFromConditionalProperties.Arn + PublishedInMatchingCondition: + Type: AWS::Lambda::Function + Properties: + Runtime: python3.12 + Handler: index.handler + Role: !Sub arn:${AWS::Partition}:iam::${AWS::AccountId}:role/lambda + Code: + S3Bucket: bucket + S3Key: code.zip + SnapStart: !If + - IsUsEast1 + - ApplyOn: PublishedVersions + - !Ref AWS::NoValue + PublishedInMatchingConditionVersion: + Type: AWS::Lambda::Version + Condition: IsUsEast1 + Properties: + FunctionName: !Ref PublishedInMatchingCondition + PublishedInEveryDeployment: + Type: AWS::Lambda::Function + Properties: + Runtime: python3.12 + Handler: index.handler + Role: !Sub arn:${AWS::Partition}:iam::${AWS::AccountId}:role/lambda + Code: + S3Bucket: bucket + S3Key: code.zip + SnapStart: + ApplyOn: PublishedVersions + PublishedInUsEast1Version: + Type: AWS::Lambda::Version + Condition: IsUsEast1 + Properties: + FunctionName: !Ref PublishedInEveryDeployment + PublishedElsewhereVersion: + Type: AWS::Lambda::Version + Condition: IsNotUsEast1 + Properties: + FunctionName: !Ref PublishedInEveryDeployment + PublishedFromMatchingFunctionNameBranch: + Type: AWS::Lambda::Function + Properties: + Runtime: python3.12 + Handler: index.handler + Role: !Sub arn:${AWS::Partition}:iam::${AWS::AccountId}:role/lambda + Code: + S3Bucket: bucket + S3Key: code.zip + SnapStart: + ApplyOn: !If [IsUsEast1, PublishedVersions, None] + PublishedFromMatchingFunctionNameBranchVersion: + Type: AWS::Lambda::Version + Properties: + FunctionName: !If [IsUsEast1, !Ref PublishedFromMatchingFunctionNameBranch, !Ref PublishedThroughSub] diff --git a/src/schema-validator/src/validate.rs b/src/schema-validator/src/validate.rs index ee7f8941..266cc762 100644 --- a/src/schema-validator/src/validate.rs +++ b/src/schema-validator/src/validate.rs @@ -3,20 +3,23 @@ use crate::store::CompiledSchemaStore; use diagnostics::{Diagnostic, Phase, RegisteredDiagnostic, ViolationContext, resolve_section_span}; use rules::format_rule_for_format; use std::borrow::Cow; +use std::collections::hash_map::Entry; use std::collections::{BTreeSet, HashMap, HashSet}; use std::sync::{Arc, LazyLock}; use template_model::coercion::{CoerceResult, coerce_to_number, coerce_to_string, coerce_value, scalar_eq}; use template_model::conditions::Satisfiability; use template_model::consts::{ FN_CONDITION, FN_FOR_EACH_KEY_PREFIX, FN_IF, FN_REF, INTRINSIC_FN_PATH_SEGMENTS, KEY_PROPERTIES, KEY_TYPE, - MAX_REQUIRED_PROPERTY_COMBINATIONS, MAX_SCHEMA_MATCH_DEPTH as MAX_MATCH_DEPTH, - MAX_SCHEMA_SCENARIO_ASSIGNMENTS as MAX_GROUP_SCENARIO_ASSIGNMENTS, + MAX_COMPLETE_SCENARIO_PRODUCT, MAX_REQUIRED_PROPERTY_COMBINATIONS, MAX_SCENARIO_PRODUCT_NODES, + MAX_SCHEMA_MATCH_DEPTH as MAX_MATCH_DEPTH, MAX_SCHEMA_SCENARIO_ASSIGNMENTS as MAX_GROUP_SCENARIO_ASSIGNMENTS, MAX_SCHEMA_SCENARIO_MERGE_ATTEMPTS as MAX_GROUP_SCENARIO_MERGE_ATTEMPTS, PARAM_TYPE_COMMA_DELIMITED_LIST, PARAM_TYPE_NUMBER, PARAM_TYPE_STRING, SAM_FUNCTION_TYPE, SAM_SERVERLESS_TYPE_PREFIX, }; +use template_model::member_presence::{ContainerMember, MemberPresence, classify_members, extend_assignment}; use template_model::message::{render_str_list, render_value, render_value_list}; use template_model::model::ResolvedResource; use template_model::region_enums; +use template_model::resolved_value::{collect_scenarios, contains_dynamic_resolved, is_resolved_null}; use template_model::resolver::{RefKind, ResolvedValue}; use template_model::{ BudgetKind, CompiledPattern, IAM_ROLE_ARN_PATTERN, SECURITY_GROUP_NAME_PATTERN, SemanticModel, compile_pattern, @@ -939,22 +942,22 @@ fn property_presence_alternatives( return Vec::new(); } let (scenarios, was_curtailed) = - m.resolve_scenarios_with_limit(rid, &format!("{base_path}.{property}"), MAX_GROUP_PROPERTY_SCENARIOS); + m.resolve_scenarios_with_limit_shared(rid, &format!("{base_path}.{property}"), MAX_GROUP_PROPERTY_SCENARIOS); if was_curtailed && !m.scenario_budget_exhausted() { m.record_budget_exhaustion(BudgetKind::SchemaScenarioAssignments); } let mut alternatives = Vec::new(); let mut seen = HashSet::new(); - for (value, conditions) in scenarios { + for (value, conditions) in scenarios.iter() { let present = !matches!(value, ResolvedValue::Concrete { value } if value.is_null()); if present != want_present { continue; } - let Some(merged) = try_merge_assignments(filter, &conditions) else { + let Some(merged) = try_merge_assignments(filter, conditions) else { continue; }; - if assignment_is_proven_satisfiable(m, &merged) && seen.insert(canonical_assignment(&conditions)) { - alternatives.push(conditions); + if assignment_is_proven_satisfiable(m, &merged) && seen.insert(canonical_assignment(conditions)) { + alternatives.push(conditions.clone()); } } alternatives @@ -1094,7 +1097,7 @@ fn property_scenario_assignments( for property_path in property_paths { let (scenarios, was_curtailed) = - m.resolve_scenarios_with_limit(rid, property_path, MAX_GROUP_PROPERTY_SCENARIOS); + m.resolve_scenarios_with_limit_shared(rid, property_path, MAX_GROUP_PROPERTY_SCENARIOS); if was_curtailed { if !m.scenario_budget_exhausted() { m.record_budget_exhaustion(BudgetKind::SchemaScenarioAssignments); @@ -1107,7 +1110,7 @@ fn property_scenario_assignments( let mut property_assignments = Vec::new(); let mut seen_property_assignments = HashSet::new(); - for (_, conditions) in &scenarios { + for (_, conditions) in scenarios.iter() { if !is_satisfiable(m, conditions) || !scenario_consistent_with_filter(m, conditions) { continue; } @@ -1198,7 +1201,10 @@ fn property_present_under( prop: &str, assignment: &HashMap, ) -> bool { - let scenarios = m.resolve_scenarios(rid, &format!("{}.{}", base, prop)); + // Presence depends only on whether the property value itself resolves to + // `AWS::NoValue`, so only the conditions wrapping the whole value are split; + // conditions nested inside a present list or object cannot change the answer. + let scenarios = outer_resolved_scenarios(m, rid, &format!("{}.{}", base, prop)); if scenarios.is_empty() { return true; } @@ -3156,10 +3162,8 @@ fn outer_resolved_scenarios( resource_id: &str, property_path: &str, ) -> Vec<(ResolvedValue, HashMap)> { - let Some(value) = - model.resolve_deep(resource_id, property_path).or_else(|| model.resolve(resource_id, property_path).cloned()) - else { - return model.resolve_scenarios(resource_id, property_path); + let Some(value) = model.resolve_unexpanded(resource_id, property_path) else { + return Vec::new(); }; let mut scenarios = Vec::new(); collect_outer_resolved_scenarios(&value, &HashMap::new(), &mut scenarios); @@ -3196,12 +3200,13 @@ fn collect_outer_value_scenarios( } } +/// Whether a property's checks compare the whole composite value, so every +/// joint assignment of the conditions nested inside it must be materialized. +/// Item cardinality and uniqueness are not among them: `validate_item_cardinality` +/// reasons about member presence instead. fn schema_requires_nested_value_scenarios(schema: &PropSchema) -> bool { let has_composite_value = |value: &serde_json::Value| value.is_array() || value.is_object(); - schema.min_items.is_some() - || schema.max_items.is_some() - || schema.unique_items == Some(true) - || schema.min_properties.is_some() + schema.min_properties.is_some() || schema.max_properties.is_some() || schema.enum_values.iter().any(has_composite_value) || schema.enum_case_insensitive.iter().any(has_composite_value) @@ -3594,72 +3599,8 @@ fn validate_prop( } } - for (val, conds) in &scenarios { - if !is_satisfiable(m, conds) || val.is_null() { - continue; - } - if let Some(arr) = val.as_array() { - let len = arr.iter().filter(|item| !item.is_null()).count() as u64; - if let Some(max) = schema.max_items - && len > max - { - out.push(build_diagnostic_conditional( - "F3032", - &format!("expected maximum item count: {}, found: {}", max, len), - m, - rid, - prop_path, - None, - condition_map(conds), - )); - } - if let Some(min) = schema.min_items - && len < min - { - out.push(build_diagnostic_conditional( - "F3032", - &format!("expected minimum item count: {}, found: {}", min, len), - m, - rid, - prop_path, - None, - condition_map(conds), - )); - } - } - } - - if schema.unique_items == Some(true) { - for (val, conds) in &scenarios { - if !is_satisfiable(m, conds) || val.is_null() { - continue; - } - if let Some(arr) = val.as_array() { - let mut seen = Vec::new(); - for item in arr { - // A null element is an `AWS::NoValue` that CloudFormation - // removes from the list at deploy time, so it is not a real - // member and two such elements are not a duplicate. Only the - // surviving concrete items are checked for uniqueness. - if item.is_null() { - continue; - } - if seen.contains(item) { - out.push(build_diagnostic_conditional( - "F3037", - "Array items are not unique", - m, - rid, - prop_path, - None, - condition_map(conds), - )); - break; - } - seen.push(item.clone()); - } - } - } + if schema.min_items.is_some() || schema.max_items.is_some() || schema.unique_items == Some(true) { + validate_item_cardinality(out, m, rid, prop_path, schema); } let has_nested_constraints = !schema.properties.is_empty() @@ -3720,7 +3661,7 @@ fn validate_prop( // anchors the diagnostic at the branch path (`.Fn::If.`), // so reporting here too would duplicate that finding at the // un-qualified property path. - for (val, _conds) in m.resolve_scenarios(rid, prop_path) { + for (val, _conds) in m.resolve_scenarios_shared(rid, prop_path).iter() { if let ResolvedValue::Concrete { value } = &val && let Some(obj) = value.as_object() { @@ -3774,8 +3715,10 @@ fn validate_prop( for (pn, ps) in &schema.properties { let resolved = ps.resolve(defs); let sub_path = format!("{}.{}", prop_path, pn); - let sub_scenarios = m.resolve_scenarios_json(rid, &sub_path); - if !sub_scenarios.is_empty() || m.resolve_deep(rid, &sub_path).is_some() { + // A directly resolvable sub-property is authored; only when it is not + // (a `Properties` block wrapped in `Fn::If`) do the scenarios decide, + // so the expansion is not paid merely to learn that a value exists. + if m.resolve_deep(rid, &sub_path).is_some() || !m.resolve_scenarios_json(rid, &sub_path).is_empty() { validate_prop(out, store, m, rid, rtype, &sub_path, &resolved, defs, region); } } @@ -3807,6 +3750,562 @@ fn validate_prop( } } +/// Checks `minItems`, `maxItems` and `uniqueItems` from member presence. +/// +/// Members gated by `Fn::If` over `AWS::NoValue` are decided one member at a +/// time instead of enumerating every joint assignment, so a list of N +/// independently optional items never materializes its 2^N worlds. A member +/// that carries an unresolved reference still occupies a slot when present: +/// its contents are unknown, but whether it survives is not. +fn validate_item_cardinality( + out: &mut Vec, + m: &Arc, + rid: &str, + prop_path: &str, + schema: &PropSchema, +) { + for (container, outer_conditions) in outer_resolved_scenarios(m, rid, prop_path) { + if !is_satisfiable(m, &outer_conditions) { + continue; + } + match &container { + ResolvedValue::List { items } => { + let members = classify_members(items); + validate_member_item_counts(out, m, rid, prop_path, schema, &members, &outer_conditions); + if schema.unique_items == Some(true) { + validate_member_uniqueness(out, m, rid, prop_path, &members, &outer_conditions); + } + } + ResolvedValue::Concrete { value } if value.is_array() => { + let value = value.0.clone(); + validate_item_cardinality_of_value(out, m, rid, prop_path, schema, &value, &outer_conditions); + } + _ => {} + } + } +} + +fn validate_member_item_counts( + out: &mut Vec, + m: &Arc, + rid: &str, + prop_path: &str, + schema: &PropSchema, + members: &[ContainerMember<'_>], + outer_conditions: &HashMap, +) { + let bounds: Vec = ItemCountBound::of(schema).collect(); + if bounds.is_empty() { + return; + } + let Some(slots) = ItemSlots::from_members(members) else { + m.record_budget_exhaustion(BudgetKind::SchemaScenarioAssignments); + let always_present = members.iter().filter(|member| member.presence == MemberPresence::Always).count() as u64; + for bound in bounds { + if matches!(bound, ItemCountBound::Maximum(maximum) if always_present > maximum) + && assignment_is_proven_satisfiable(m, outer_conditions) + { + out.push(build_diagnostic_conditional( + "F3032", + &bound.violation_message(always_present), + m, + rid, + prop_path, + None, + condition_map(outer_conditions), + )); + } + } + return; + }; + for bound in bounds { + match slots.find_violation(m, bound, outer_conditions) { + WitnessSearch::Found((witness, count)) => out.push(build_diagnostic_conditional( + "F3032", + &bound.violation_message(count), + m, + rid, + prop_path, + None, + condition_map(&witness), + )), + WitnessSearch::NotFound => {} + WitnessSearch::BudgetExhausted => m.record_budget_exhaustion(BudgetKind::SchemaScenarioMergeAttempts), + } + } +} + +/// One schema bound on the number of list items that survive deployment. +#[derive(Clone, Copy)] +enum ItemCountBound { + Maximum(u64), + Minimum(u64), +} + +impl ItemCountBound { + fn of(schema: &PropSchema) -> impl Iterator { + [schema.max_items.map(Self::Maximum), schema.min_items.map(Self::Minimum)].into_iter().flatten() + } + + fn is_violated_by(self, count: u64) -> bool { + self.is_reachable(count, 0) + } + + /// Whether deciding the `undecided` members can still produce a violating + /// count; a decision can only add an item. + fn is_reachable(self, count: u64, undecided: u64) -> bool { + match self { + Self::Maximum(maximum) => count.saturating_add(undecided) > maximum, + Self::Minimum(minimum) => count < minimum, + } + } + + /// A maximum is approached by keeping members and a minimum by removing them. + fn prefers_present_members(self) -> bool { + matches!(self, Self::Maximum(_)) + } + + fn violation_message(self, count: u64) -> String { + match self { + Self::Maximum(maximum) => format!("expected maximum item count: {maximum}, found: {count}"), + Self::Minimum(minimum) => format!("expected minimum item count: {minimum}, found: {count}"), + } + } +} + +/// Result of a bounded search for one deployment that violates a constraint. +enum WitnessSearch { + Found(W), + NotFound, + BudgetExhausted, +} + +/// The items a list holds in every deployment, plus the decisions of the +/// members whose presence depends on conditions. +struct ItemSlots { + always_present: u64, + optional_members: Vec, +} + +impl ItemSlots { + /// `None` when a member has more branches than one bounded search admits. + fn from_members(members: &[ContainerMember<'_>]) -> Option { + let mut slots = Self { always_present: 0, optional_members: Vec::new() }; + for member in members { + match &member.presence { + MemberPresence::Always => slots.always_present += 1, + MemberPresence::Never => {} + MemberPresence::When(literals) => { + slots.optional_members.push(MemberDecisions::from_presence_literals(literals)); + } + MemberPresence::Complex => slots.optional_members.push(MemberDecisions::from_branches(member.value)?), + } + } + Some(slots) + } + + /// Backtracking search for one deployment extending `seed` whose item count + /// violates `bound`. Every optional member is decided explicitly, so a + /// witness fixes each member's presence and its count holds in every world + /// that extends it. Each added assumption must be proven satisfiable, and + /// the decisions tried are capped by the schema witness merge budget. + fn find_violation( + &self, + m: &Arc, + bound: ItemCountBound, + seed: &HashMap, + ) -> WitnessSearch<(HashMap, u64)> { + if !bound.is_reachable(self.always_present, self.optional_members.len() as u64) + || !assignment_is_proven_satisfiable(m, seed) + { + return WitnessSearch::NotFound; + } + let mut frames = vec![DecisionFrame { + assignment: seed.clone(), + count: self.always_present, + decided_members: 0, + next_decision: 0, + }]; + let mut merge_attempts = 0; + while let Some(frame) = frames.last_mut() { + let undecided = (self.optional_members.len() - frame.decided_members) as u64; + if !bound.is_reachable(frame.count, undecided) { + frames.pop(); + continue; + } + let Some(member) = self.optional_members.get(frame.decided_members) else { + return WitnessSearch::Found((frame.assignment.clone(), frame.count)); + }; + let Some((literals, keeps_member)) = member.decision(bound, frame.next_decision) else { + frames.pop(); + continue; + }; + frame.next_decision += 1; + if merge_attempts == MAX_GROUP_WITNESS_MERGE_ATTEMPTS { + return WitnessSearch::BudgetExhausted; + } + merge_attempts += 1; + let mut assignment = frame.assignment.clone(); + if !extend_assignment(&mut assignment, literals) + || (assignment.len() > frame.assignment.len() && !assignment_is_proven_satisfiable(m, &assignment)) + { + continue; + } + let child = DecisionFrame { + assignment, + count: frame.count + u64::from(keeps_member), + decided_members: frame.decided_members + 1, + next_decision: 0, + }; + frames.push(child); + } + WitnessSearch::NotFound + } +} + +/// One partially decided deployment of the item count search. +struct DecisionFrame { + assignment: HashMap, + count: u64, + decided_members: usize, + next_decision: usize, +} + +/// The literal conjunctions that decide one optional member: assuming any +/// `present` conjunction keeps the member, and assuming any `absent` +/// conjunction removes it. +struct MemberDecisions { + present: Vec>, + absent: Vec>, +} + +impl MemberDecisions { + /// A member present exactly when its literals hold is kept by assuming all + /// of them and removed by negating any one of them. + fn from_presence_literals(literals: &[(String, bool)]) -> Self { + Self { + present: vec![literals.to_vec()], + absent: literals.iter().map(|(condition, holds)| vec![(condition.clone(), !holds)]).collect(), + } + } + + /// Decisions for a member whose presence has no single literal conjunction: + /// the path literals of each outer branch, split by whether the branch + /// resolves to `AWS::NoValue`. `None` when the member has more branches + /// than one bounded search admits. + fn from_branches(value: &ResolvedValue) -> Option { + let mut decisions = Self { present: Vec::new(), absent: Vec::new() }; + decisions.collect_branches(value, &mut Vec::new()).then_some(decisions) + } + + fn collect_branches(&mut self, value: &ResolvedValue, path: &mut Vec<(String, bool)>) -> bool { + match value { + ResolvedValue::Conditional { condition, if_true, if_false } => { + if let Some(holds) = path.iter().find(|(name, _)| name == condition).map(|(_, holds)| *holds) { + return self.collect_branches(if holds { if_true } else { if_false }, path); + } + for (branch, holds) in [(if_true, true), (if_false, false)] { + path.push((condition.clone(), holds)); + let within_limit = self.collect_branches(branch, path); + path.pop(); + if !within_limit { + return false; + } + } + true + } + ResolvedValue::Enum { variants } => variants.iter().all(|variant| self.collect_branches(variant, path)), + branch => { + let branch_count = self.present.len() + self.absent.len(); + let decisions = if is_resolved_null(branch) { &mut self.absent } else { &mut self.present }; + if decisions.contains(path) { + return true; + } + if branch_count == MAX_GROUP_PROPERTY_SCENARIOS { + return false; + } + decisions.push(path.clone()); + true + } + } + } + + /// The `index`th decision in the order that approaches `bound` soonest, + /// with whether that decision keeps the member. + fn decision(&self, bound: ItemCountBound, index: usize) -> Option<(&[(String, bool)], bool)> { + let keeps_first = bound.prefers_present_members(); + let (first, second) = if keeps_first { (&self.present, &self.absent) } else { (&self.absent, &self.present) }; + match first.get(index) { + Some(literals) => Some((literals.as_slice(), keeps_first)), + None => second.get(index - first.len()).map(|literals| (literals.as_slice(), !keeps_first)), + } + } +} + +/// Checks `uniqueItems` across the members' surviving value alternatives. Only +/// alternatives with equal values are compared, and a duplicate is reported +/// with a proven satisfiable world in which both members survive holding that +/// value. A member with more alternatives than one bounded expansion admits +/// records the curtailment instead of concluding from a partial view. +fn validate_member_uniqueness( + out: &mut Vec, + m: &Arc, + rid: &str, + prop_path: &str, + members: &[ContainerMember<'_>], + outer_conditions: &HashMap, +) { + let alternative_groups = equal_value_alternative_groups(members, outer_conditions); + if alternative_groups.was_incomplete { + m.record_budget_exhaustion(BudgetKind::SchemaScenarioAssignments); + } + match duplicate_member_witness(m, &alternative_groups.groups) { + WitnessSearch::Found(witness) => out.push(build_diagnostic_conditional( + "F3037", + "Array items are not unique", + m, + rid, + prop_path, + None, + condition_map(&witness), + )), + WitnessSearch::NotFound => {} + WitnessSearch::BudgetExhausted => m.record_budget_exhaustion(BudgetKind::SchemaScenarioMergeAttempts), + } +} + +/// Concrete alternatives grouped by equal value, plus whether any member could +/// not be enumerated exactly within the per-member bound. +struct EqualValueAlternativeGroups { + groups: Vec>, + was_incomplete: bool, +} + +/// One member's concrete surviving value under one condition assignment. +struct MemberAlternative { + member_index: usize, + conditions: HashMap, +} + +/// Groups every member's concrete surviving alternatives under +/// `outer_conditions` by value, in first-appearance order, keeping one entry +/// per member, value and assignment. Each group lists a member's alternatives +/// contiguously and in member order. Members beyond the exact expansion bound +/// contribute their safe partial alternatives while marking the result incomplete. +fn equal_value_alternative_groups( + members: &[ContainerMember<'_>], + outer_conditions: &HashMap, +) -> EqualValueAlternativeGroups { + let mut groups: HashMap> = HashMap::new(); + let mut value_order = Vec::new(); + let mut was_incomplete = false; + for (member_index, member) in members.iter().enumerate() { + if member.presence == MemberPresence::Never { + continue; + } + if scenario_expansion_may_use_covering(member.value) { + was_incomplete = true; + } + let mut scenarios = Vec::new(); + if collect_scenarios(member.value, outer_conditions, MAX_GROUP_PROPERTY_SCENARIOS, &mut scenarios) { + was_incomplete = true; + } + let mut seen = HashSet::new(); + for (value, conditions) in scenarios { + if is_resolved_null(&value) || contains_dynamic_resolved(&value) { + continue; + } + let value_identity = canonical_json_key(&resolved_value_to_json(&value)); + if !seen.insert((value_identity.clone(), canonical_assignment(&conditions))) { + continue; + } + let alternative = MemberAlternative { member_index, conditions }; + match groups.entry(value_identity) { + Entry::Occupied(mut group) => group.get_mut().push(alternative), + Entry::Vacant(group) => { + value_order.push(group.key().clone()); + group.insert(vec![alternative]); + } + } + } + } + EqualValueAlternativeGroups { + groups: value_order.iter().filter_map(|value_identity| groups.remove(value_identity)).collect(), + was_incomplete, + } +} + +/// Whether expanding a value may replace an exact Cartesian product with a +/// covering set. The shape deliberately overestimates when conditions are +/// shared, conflict, or are already fixed outside the value: reporting +/// incomplete analysis is safer than treating a covering set as exhaustive. +fn scenario_expansion_may_use_covering(value: &ResolvedValue) -> bool { + #[derive(Clone, Copy)] + struct ScenarioShape { + combinations: usize, + nodes_per_combination: usize, + nested_covering: bool, + } + + fn shape(value: &ResolvedValue) -> ScenarioShape { + let combination_cap = MAX_COMPLETE_SCENARIO_PRODUCT.saturating_add(1); + match value { + ResolvedValue::Conditional { if_true, if_false, .. } => { + let left = shape(if_true); + let right = shape(if_false); + ScenarioShape { + combinations: left.combinations.saturating_add(right.combinations).min(combination_cap), + nodes_per_combination: left.nodes_per_combination.max(right.nodes_per_combination), + nested_covering: left.nested_covering || right.nested_covering, + } + } + ResolvedValue::Enum { variants } => { + let mut combined = ScenarioShape { combinations: 0, nodes_per_combination: 1, nested_covering: false }; + for variant in variants { + let variant_shape = shape(variant); + combined.combinations = + combined.combinations.saturating_add(variant_shape.combinations).min(combination_cap); + combined.nodes_per_combination = + combined.nodes_per_combination.max(variant_shape.nodes_per_combination); + combined.nested_covering |= variant_shape.nested_covering; + } + combined.combinations = combined.combinations.max(1); + combined + } + ResolvedValue::List { items } => container_shape(items.iter().map(shape)), + ResolvedValue::Map { entries } => container_shape(entries.iter().map(|entry| shape(&entry.value))), + _ => ScenarioShape { combinations: 1, nodes_per_combination: 1, nested_covering: false }, + } + } + + fn container_shape(children: impl Iterator) -> ScenarioShape { + let combination_cap = MAX_COMPLETE_SCENARIO_PRODUCT.saturating_add(1); + let node_cap = MAX_SCENARIO_PRODUCT_NODES.saturating_add(1); + let mut container = ScenarioShape { combinations: 1, nodes_per_combination: 1, nested_covering: false }; + for child in children { + container.combinations = + container.combinations.saturating_mul(child.combinations.max(1)).min(combination_cap); + container.nodes_per_combination = + container.nodes_per_combination.saturating_add(child.nodes_per_combination).min(node_cap); + container.nested_covering |= child.nested_covering; + } + let materialized_nodes = container.combinations.saturating_mul(container.nodes_per_combination); + container.nested_covering |= + container.combinations > MAX_COMPLETE_SCENARIO_PRODUCT || materialized_nodes > MAX_SCENARIO_PRODUCT_NODES; + container + } + + shape(value).nested_covering +} + +/// Finds a proven satisfiable world in which two different members survive +/// with one value, charging every pairing tried to the schema witness merge +/// budget. +fn duplicate_member_witness( + m: &Arc, + groups: &[Vec], +) -> WitnessSearch> { + let mut merge_attempts = 0; + for group in groups { + for (position, left) in group.iter().enumerate() { + let later_members = + group.iter().skip(position + 1).skip_while(|right| right.member_index == left.member_index); + for right in later_members { + if merge_attempts == MAX_GROUP_WITNESS_MERGE_ATTEMPTS { + return WitnessSearch::BudgetExhausted; + } + merge_attempts += 1; + if let Some(witness) = try_merge_assignments(&left.conditions, &right.conditions) + && assignment_is_proven_satisfiable(m, &witness) + { + return WitnessSearch::Found(witness); + } + } + } + } + WitnessSearch::NotFound +} + +/// A value identity independent of object key order: two JSON values share it +/// exactly when they are equal. +fn canonical_json_key(value: &serde_json::Value) -> String { + key_ordered_json(value).to_string() +} + +fn key_ordered_json(value: &serde_json::Value) -> serde_json::Value { + match value { + serde_json::Value::Array(items) => serde_json::Value::Array(items.iter().map(key_ordered_json).collect()), + serde_json::Value::Object(entries) => { + let mut ordered: Vec<(&String, &serde_json::Value)> = entries.iter().collect(); + ordered.sort_unstable_by_key(|(name, _)| *name); + serde_json::Value::Object( + ordered.into_iter().map(|(name, entry)| (name.clone(), key_ordered_json(entry))).collect(), + ) + } + // JSON Schema compares numbers mathematically, so integral floating-point + // spellings share one key with their integer spelling; this also merges + // negative and positive zero. + serde_json::Value::Number(number) if number.is_f64() => match number.as_f64() { + Some(value) if value.fract() == 0.0 && value >= 0.0 && value < u64::MAX as f64 => { + serde_json::Value::from(value as u64) + } + Some(value) if value.fract() == 0.0 && value >= i64::MIN as f64 && value < 0.0 => { + serde_json::Value::from(value as i64) + } + _ => value.clone(), + }, + scalar => scalar.clone(), + } +} + +fn validate_item_cardinality_of_value( + out: &mut Vec, + m: &Arc, + rid: &str, + prop_path: &str, + schema: &PropSchema, + value: &serde_json::Value, + conditions: &HashMap, +) { + let Some(items) = value.as_array() else { + return; + }; + // A null element is an `AWS::NoValue` that CloudFormation removes from the + // list at deploy time, so it is not a real member. + let surviving: Vec<&serde_json::Value> = items.iter().filter(|item| !item.is_null()).collect(); + let count = surviving.len() as u64; + for bound in ItemCountBound::of(schema) { + if bound.is_violated_by(count) { + out.push(build_diagnostic_conditional( + "F3032", + &bound.violation_message(count), + m, + rid, + prop_path, + None, + condition_map(conditions), + )); + } + } + if schema.unique_items == Some(true) { + let mut seen = HashSet::new(); + for item in surviving { + if !seen.insert(canonical_json_key(item)) { + out.push(build_diagnostic_conditional( + "F3037", + "Array items are not unique", + m, + rid, + prop_path, + None, + condition_map(conditions), + )); + break; + } + } + } +} + fn validate_array_item_constraints( out: &mut Vec, m: &Arc, diff --git a/src/schema-validator/tests/item_cardinality.rs b/src/schema-validator/tests/item_cardinality.rs new file mode 100644 index 00000000..835280e0 --- /dev/null +++ b/src/schema-validator/tests/item_cardinality.rs @@ -0,0 +1,626 @@ +//! Item count and uniqueness checks over lists whose members are gated by +//! conditions or carry values that resolve only at deploy time. + +use diagnostics::Diagnostic; +use schema_validator::SchemaValidator; +use serde_json::{Value, json}; +use std::collections::HashMap; +use std::sync::Arc; +use template_model::{BudgetKind, SemanticModel}; + +const LIST_TYPE: &str = "AWS::Test::ItemCardinality"; + +fn list_validator(values_schema: Value) -> SchemaValidator { + SchemaValidator::try_with_additional_schemas(vec![( + LIST_TYPE, + json!({"properties": {"Values": values_schema}, "required": ["Values"], "additionalProperties": false}), + )]) + .expect("test overlay must apply") +} + +fn string_list_schema(constraint: &str, value: Value) -> Value { + let mut schema = json!({"type": "array", "items": {"type": "string"}}); + schema[constraint] = value; + schema +} + +fn list_template(sections: Value, members: Value) -> String { + let mut template = sections; + template["Resources"] = json!({"Resource": {"Type": LIST_TYPE, "Properties": {"Values": members}}}); + template.to_string() +} + +fn conditional_properties_list_template( + sections: Value, + condition: &str, + if_true_members: Value, + if_false_members: Value, +) -> String { + let mut template = sections; + template["Resources"] = json!({ + "Resource": { + "Type": LIST_TYPE, + "Properties": if_condition( + condition, + json!({"Values": if_true_members}), + json!({"Values": if_false_members}), + ), + } + }); + template.to_string() +} + +fn model(template: &str) -> Arc { + Arc::new(SemanticModel::from_bytes(template.as_bytes()).expect("template must parse")) +} + +fn validate(validator: &SchemaValidator, semantic_model: &Arc) -> Vec { + validator.validate(semantic_model, Some("us-east-1")).diagnostics +} + +fn findings<'a>(diagnostics: &'a [Diagnostic], rule_id: &str) -> Vec<&'a Diagnostic> { + diagnostics.iter().filter(|diagnostic| diagnostic.rule_id == rule_id).collect() +} + +fn scenario(literals: &[(&str, bool)]) -> Option> { + Some(literals.iter().map(|(condition, holds)| (condition.to_string(), *holds)).collect()) +} + +fn toggle_parameter() -> Value { + json!({"Type": "String", "AllowedValues": ["true", "false"]}) +} + +fn toggled_on(parameter: &str) -> Value { + json!({"Fn::Equals": [{"Ref": parameter}, "true"]}) +} + +fn if_condition(condition: &str, if_true: Value, if_false: Value) -> Value { + json!({"Fn::If": [condition, if_true, if_false]}) +} + +fn no_value() -> Value { + json!({"Ref": "AWS::NoValue"}) +} + +fn imported_value() -> Value { + json!({"Fn::ImportValue": "SharedValue"}) +} + +fn toggles(names: &[&str]) -> Value { + let parameters: serde_json::Map = + names.iter().map(|name| (format!("{name}Value"), toggle_parameter())).collect(); + let conditions: serde_json::Map = + names.iter().map(|name| (name.to_string(), toggled_on(&format!("{name}Value")))).collect(); + json!({"Parameters": parameters, "Conditions": conditions}) +} + +/// Members present only when their own condition holds, where every condition +/// selects a different value of one parameter that may also select none. +fn mutually_exclusive_members_template(member_count: usize) -> String { + let mut allowed_values = vec!["none".to_string()]; + let mut conditions = serde_json::Map::new(); + let mut members = Vec::new(); + for index in 0..member_count { + let choice = format!("choice-{index:02}"); + let condition = format!("Chooses{index:02}"); + conditions.insert(condition.clone(), json!({"Fn::Equals": [{"Ref": "Choice"}, choice]})); + allowed_values.push(choice); + members.push(if_condition(&condition, json!(format!("value-{index:02}")), no_value())); + } + list_template( + json!({ + "Parameters": {"Choice": {"Type": "String", "AllowedValues": allowed_values}}, + "Conditions": conditions + }), + Value::Array(members), + ) +} + +/// Tag-like members whose key and value each select one of +/// `allowed_value_count` parameter values, giving every member +/// `allowed_value_count^2` alternatives with keys that never collide. +fn nested_enum_members_template(member_count: usize, allowed_value_count: usize) -> String { + let allowed_values: Vec = (0..allowed_value_count).map(|index| format!("v{index:02}")).collect(); + let members: Vec = (0..member_count) + .map(|index| { + json!({ + "Key": {"Fn::Join": ["", [format!("k{index:02}-"), {"Ref": "KeySuffix"}]]}, + "Value": {"Ref": "TagValue"} + }) + }) + .collect(); + list_template( + json!({"Parameters": { + "KeySuffix": {"Type": "String", "AllowedValues": allowed_values}, + "TagValue": {"Type": "String", "AllowedValues": allowed_values} + }}), + Value::Array(members), + ) +} + +fn unique_tag_list_validator() -> SchemaValidator { + list_validator(json!({ + "type": "array", + "items": {"type": "object", "properties": {"Key": {"type": "string"}, "Value": {"type": "string"}}}, + "uniqueItems": true + })) +} + +#[test] +fn max_items_counts_members_whose_conditions_exclude_each_other() { + const MEMBER_COUNT: usize = 13; + let mut parameters = serde_json::Map::new(); + let mut conditions = serde_json::Map::new(); + let mut members = Vec::new(); + for index in 0..MEMBER_COUNT { + let condition = format!("Skip{index:02}"); + if index == 1 { + conditions.insert(condition.clone(), json!({"Fn::Not": [{"Condition": "Skip00"}]})); + } else { + let parameter = format!("Skip{index:02}Value"); + conditions.insert(condition.clone(), toggled_on(¶meter)); + parameters.insert(parameter, toggle_parameter()); + } + members.push(if_condition(&condition, no_value(), json!(format!("value-{index:02}")))); + } + let template = list_template(json!({"Parameters": parameters, "Conditions": conditions}), Value::Array(members)); + let validator = list_validator(string_list_schema("maxItems", json!(5))); + let mut expected_witness: HashMap = + (0..MEMBER_COUNT).map(|index| (format!("Skip{index:02}"), false)).collect(); + expected_witness.insert("Skip01".to_string(), true); + + let diagnostics = validate(&validator, &model(&template)); + + let violations = findings(&diagnostics, "F3032"); + assert_eq!(violations.len(), 1, "twelve members survive together in one deployment: {diagnostics:#?}"); + assert_eq!(violations[0].message, "expected maximum item count: 5, found: 12"); + assert_eq!(violations[0].condition_scenario, Some(expected_witness)); +} + +#[test] +fn max_items_checks_members_inside_whole_properties_condition() { + const MEMBER_COUNT: usize = 13; + const PRESENT_WHEN_TRUE_COUNT: usize = 7; + let member_conditions: Vec = (0..MEMBER_COUNT).map(|index| format!("Present{index:02}")).collect(); + let condition_refs: Vec<&str> = + std::iter::once("UseConditionalProperties").chain(member_conditions.iter().map(String::as_str)).collect(); + let members: Vec = member_conditions + .iter() + .enumerate() + .map(|(index, condition)| { + let member = json!(format!("value-{index:02}")); + if index < PRESENT_WHEN_TRUE_COUNT { + if_condition(condition, member, no_value()) + } else { + if_condition(condition, no_value(), member) + } + }) + .collect(); + let template = conditional_properties_list_template( + toggles(&condition_refs), + "UseConditionalProperties", + Value::Array(members), + json!(["fallback"]), + ); + let validator = list_validator(string_list_schema("maxItems", json!(12))); + let mut expected_witness = HashMap::from([("UseConditionalProperties".to_string(), true)]); + expected_witness.extend( + member_conditions + .iter() + .enumerate() + .map(|(index, condition)| (condition.clone(), index < PRESENT_WHEN_TRUE_COUNT)), + ); + + let diagnostics = validate(&validator, &model(&template)); + + let violations = findings(&diagnostics, "F3032"); + assert_eq!(violations.len(), 1, "all thirteen members coexist only in the selected branch: {diagnostics:#?}"); + assert_eq!(violations[0].message, "expected maximum item count: 12, found: 13"); + assert_eq!(violations[0].condition_scenario, Some(expected_witness)); +} + +#[test] +fn max_items_respects_outer_condition_when_nested_member_reuses_it() { + let mut members: Vec = (0..12).map(|index| json!(format!("fixed-{index:02}"))).collect(); + members.push(if_condition("UseConditionalProperties", no_value(), json!("excluded"))); + let template = conditional_properties_list_template( + toggles(&["UseConditionalProperties"]), + "UseConditionalProperties", + Value::Array(members), + json!(["fallback"]), + ); + let validator = list_validator(string_list_schema("maxItems", json!(12))); + + let diagnostics = validate(&validator, &model(&template)); + + assert!( + findings(&diagnostics, "F3032").is_empty(), + "the thirteenth member exists only outside its enclosing branch: {diagnostics:#?}" + ); +} + +#[test] +fn min_items_counts_a_surviving_member_whose_value_is_unresolved() { + let template = list_template( + toggles(&["UseImported"]), + json!([ + if_condition("UseImported", no_value(), json!("value-a")), + if_condition("UseImported", no_value(), json!("value-b")), + if_condition("UseImported", imported_value(), no_value()), + ]), + ); + let validator = list_validator(string_list_schema("minItems", json!(2))); + + let diagnostics = validate(&validator, &model(&template)); + + let violations = findings(&diagnostics, "F3032"); + assert_eq!(violations.len(), 1, "only the imported member survives when importing: {diagnostics:#?}"); + assert_eq!(violations[0].message, "expected minimum item count: 2, found: 1"); + assert_eq!(violations[0].condition_scenario, scenario(&[("UseImported", true)])); +} + +#[test] +fn max_items_counts_an_always_present_member_whose_value_is_unresolved() { + let mut members: Vec = (1..=5).map(|index| json!(format!("value-{index}"))).collect(); + members.push(if_condition("UseShared", imported_value(), json!("value-6"))); + let template = list_template(toggles(&["UseShared"]), Value::Array(members)); + let validator = list_validator(string_list_schema("maxItems", json!(5))); + + let diagnostics = validate(&validator, &model(&template)); + + let violations = findings(&diagnostics, "F3032"); + assert_eq!(violations.len(), 1, "six members survive in every deployment: {diagnostics:#?}"); + assert_eq!(violations[0].message, "expected maximum item count: 5, found: 6"); + assert_eq!(violations[0].condition_scenario, None); +} + +#[test] +fn unique_items_is_checked_beside_a_member_whose_value_is_unresolved() { + let template = list_template(json!({}), json!(["value-a", "value-a", imported_value()])); + let validator = list_validator(string_list_schema("uniqueItems", json!(true))); + + let diagnostics = validate(&validator, &model(&template)); + + let violations = findings(&diagnostics, "F3037"); + assert_eq!(violations.len(), 1, "the two literal members are equal in every deployment: {diagnostics:#?}"); + assert_eq!(violations[0].condition_scenario, None); +} + +#[test] +fn unique_items_over_nested_enum_alternatives_stays_bounded_and_reports_incomplete_analysis() { + let semantic_model = model(&nested_enum_members_template(50, 64)); + + let diagnostics = validate(&unique_tag_list_validator(), &semantic_model); + + assert!( + findings(&diagnostics, "F3037").is_empty(), + "a curtailed expansion must not conclude a duplicate: {diagnostics:#?}" + ); + assert!( + semantic_model.exhausted_budget_kinds().contains(&BudgetKind::SchemaScenarioAssignments), + "4096 alternatives per member exceed the bounded expansion and must be recorded: {:?}", + semantic_model.exhausted_budget_kinds() + ); + assert!(semantic_model.budget_analysis_incomplete()); +} + +#[test] +fn unique_items_over_nested_enum_alternatives_within_the_bound_is_complete() { + let semantic_model = model(&nested_enum_members_template(50, 4)); + + let diagnostics = validate(&unique_tag_list_validator(), &semantic_model); + + assert!(findings(&diagnostics, "F3037").is_empty(), "member keys never collide: {diagnostics:#?}"); + assert!( + !semantic_model.exhausted_budget_kinds().contains(&BudgetKind::SchemaScenarioAssignments), + "sixteen alternatives per member are analyzed in full: {:?}", + semantic_model.exhausted_budget_kinds() + ); +} + +#[test] +fn max_items_search_reports_incomplete_analysis_when_its_budget_is_spent() { + let semantic_model = model(&mutually_exclusive_members_template(80)); + let validator = list_validator(string_list_schema("maxItems", json!(1))); + + let diagnostics = validate(&validator, &semantic_model); + + assert!( + findings(&diagnostics, "F3032").is_empty(), + "at most one member survives in any deployment: {diagnostics:#?}" + ); + assert!( + semantic_model.exhausted_budget_kinds().contains(&BudgetKind::SchemaScenarioMergeAttempts), + "proving no deployment keeps two members exceeds the merge-attempt budget and must be recorded: {:?}", + semantic_model.exhausted_budget_kinds() + ); +} + +#[test] +fn min_items_search_over_mutually_exclusive_members_finds_the_empty_deployment() { + const MEMBER_COUNT: usize = 80; + let semantic_model = model(&mutually_exclusive_members_template(MEMBER_COUNT)); + let validator = list_validator(string_list_schema("minItems", json!(1))); + let expected_witness: HashMap = + (0..MEMBER_COUNT).map(|index| (format!("Chooses{index:02}"), false)).collect(); + + let diagnostics = validate(&validator, &semantic_model); + + let violations = findings(&diagnostics, "F3032"); + assert_eq!(violations.len(), 1, "choosing none removes every member: {diagnostics:#?}"); + assert_eq!(violations[0].message, "expected minimum item count: 1, found: 0"); + assert_eq!(violations[0].condition_scenario, Some(expected_witness)); + assert!( + !semantic_model.exhausted_budget_kinds().contains(&BudgetKind::SchemaScenarioAssignments), + "the witness is found without exhausting the search budget: {:?}", + semantic_model.exhausted_budget_kinds() + ); +} + +#[test] +fn min_items_decides_each_branch_of_a_member_with_nested_conditions() { + let template = list_template( + toggles(&["UseOuter", "UseInner"]), + json!([ + "fixed", + if_condition("UseOuter", if_condition("UseInner", json!("inner"), no_value()), json!("outer")) + ]), + ); + let validator = list_validator(string_list_schema("minItems", json!(2))); + + let diagnostics = validate(&validator, &model(&template)); + + let violations = findings(&diagnostics, "F3032"); + assert_eq!(violations.len(), 1, "the nested member is absent only on its inner false branch: {diagnostics:#?}"); + assert_eq!(violations[0].message, "expected minimum item count: 2, found: 1"); + assert_eq!(violations[0].condition_scenario, scenario(&[("UseOuter", true), ("UseInner", false)])); +} + +#[test] +fn unique_items_reports_equal_alternatives_in_their_joint_world() { + let template = list_template( + toggles(&["ShareFirst", "ShareSecond"]), + json!([ + if_condition("ShareFirst", json!("shared"), json!("first")), + if_condition("ShareSecond", json!("shared"), json!("second")), + ]), + ); + let validator = list_validator(string_list_schema("uniqueItems", json!(true))); + + let diagnostics = validate(&validator, &model(&template)); + + let violations = findings(&diagnostics, "F3037"); + assert_eq!(violations.len(), 1, "both members hold the shared value together: {diagnostics:#?}"); + assert_eq!(violations[0].condition_scenario, scenario(&[("ShareFirst", true), ("ShareSecond", true)])); +} + +#[test] +fn unique_items_ignores_equal_alternatives_whose_conditions_exclude_each_other() { + let template = list_template( + json!({ + "Parameters": {"ShareFirstValue": toggle_parameter()}, + "Conditions": { + "ShareFirst": toggled_on("ShareFirstValue"), + "ShareSecond": {"Fn::Not": [{"Condition": "ShareFirst"}]} + } + }), + json!([ + if_condition("ShareFirst", json!("shared"), json!("first")), + if_condition("ShareSecond", json!("shared"), json!("second")), + ]), + ); + let validator = list_validator(string_list_schema("uniqueItems", json!(true))); + + let diagnostics = validate(&validator, &model(&template)); + + assert!( + findings(&diagnostics, "F3037").is_empty(), + "the members never hold the shared value in one deployment: {diagnostics:#?}" + ); +} + +#[test] +fn unique_items_does_not_pair_alternatives_of_one_member() { + let template = list_template( + toggles(&["UseFirst", "UseSecond"]), + json!([ + if_condition("UseFirst", json!("shared"), if_condition("UseSecond", json!("shared"), json!("other"))), + "distinct", + ]), + ); + let validator = list_validator(string_list_schema("uniqueItems", json!(true))); + + let diagnostics = validate(&validator, &model(&template)); + + assert!( + findings(&diagnostics, "F3037").is_empty(), + "one member holding one value under several conditions is a single item: {diagnostics:#?}" + ); +} + +#[test] +fn unique_items_compares_object_members_regardless_of_key_order() { + let template = list_template( + toggles(&["AddExtra"]), + json!([ + {"Key": "team", "Value": "a"}, + {"Value": "a", "Key": "team"}, + if_condition("AddExtra", json!({"Key": "extra", "Value": "b"}), no_value()), + ]), + ); + let validator = list_validator(json!({"type": "array", "items": {"type": "object"}, "uniqueItems": true})); + + let diagnostics = validate(&validator, &model(&template)); + + let violations = findings(&diagnostics, "F3037"); + assert_eq!(violations.len(), 1, "objects with the same entries are equal items: {diagnostics:#?}"); + assert_eq!(violations[0].condition_scenario, None); +} + +#[test] +fn unique_items_compares_numbers_by_mathematical_value() { + let template = list_template(json!({}), json!([1, 1.0])); + let validator = list_validator(json!({"type": "array", "items": {"type": "number"}, "uniqueItems": true})); + + let diagnostics = validate(&validator, &model(&template)); + + let violations = findings(&diagnostics, "F3037"); + assert_eq!(violations.len(), 1, "integer and floating-point spellings of one are equal: {diagnostics:#?}"); + assert_eq!(violations[0].condition_scenario, None); +} + +#[test] +fn unique_items_covering_window_reports_incomplete_analysis() { + const CONDITION_COUNT: usize = 13; + let condition_names: Vec = (0..CONDITION_COUNT).map(|index| format!("Toggle{index:02}")).collect(); + let condition_refs: Vec<&str> = condition_names.iter().map(String::as_str).collect(); + let conditional_entries: serde_json::Map = condition_names + .iter() + .enumerate() + .map(|(index, condition)| (format!("Field{index:02}"), if_condition(condition, json!("true"), json!("false")))) + .collect(); + let target_entries: serde_json::Map = (0..CONDITION_COUNT) + .map(|index| { + let value = if index < 7 { "true" } else { "false" }; + (format!("Field{index:02}"), json!(value)) + }) + .collect(); + let semantic_model = model(&list_template( + toggles(&condition_refs), + json!([Value::Object(conditional_entries), Value::Object(target_entries)]), + )); + let validator = list_validator(json!({"type": "array", "items": {"type": "object"}, "uniqueItems": true})); + + let diagnostics = validate(&validator, &semantic_model); + + assert!( + findings(&diagnostics, "F3037").is_empty(), + "the covering set does not prove the mixed world: {diagnostics:#?}" + ); + assert!( + semantic_model.exhausted_budget_kinds().contains(&BudgetKind::SchemaScenarioAssignments), + "8192 exact alternatives must not be treated as complete: {:?}", + semantic_model.exhausted_budget_kinds() + ); +} + +#[test] +fn unique_items_reports_literal_duplicate_beside_curtailed_member() { + let allowed_values: Vec = (0..258).map(|index| format!("value-{index:03}")).collect(); + let template = list_template( + json!({"Parameters": {"Choice": {"Type": "String", "AllowedValues": allowed_values}}}), + json!(["duplicate", "duplicate", {"Ref": "Choice"}]), + ); + let semantic_model = model(&template); + let validator = list_validator(string_list_schema("uniqueItems", json!(true))); + + let diagnostics = validate(&validator, &semantic_model); + + assert_eq!(findings(&diagnostics, "F3037").len(), 1, "the literal duplicate remains provable: {diagnostics:#?}"); + assert!( + semantic_model.exhausted_budget_kinds().contains(&BudgetKind::SchemaScenarioAssignments), + "the parameter member's omitted alternative must remain visible: {:?}", + semantic_model.exhausted_budget_kinds() + ); +} + +#[test] +fn max_items_reports_unconditional_violation_beside_oversized_complex_member() { + fn branching_member(depth: usize, index: &mut usize, conditions: &mut Vec) -> Value { + if depth == 0 { + let leaf = if (*index).is_multiple_of(2) { json!("optional") } else { no_value() }; + *index += 1; + return leaf; + } + let condition = format!("Branch{depth:02}"); + if !conditions.contains(&condition) { + conditions.push(condition.clone()); + } + if_condition( + &condition, + branching_member(depth - 1, index, conditions), + branching_member(depth - 1, index, conditions), + ) + } + + let mut conditions = Vec::new(); + let mut leaf_index = 0; + let complex_member = branching_member(9, &mut leaf_index, &mut conditions); + let condition_refs: Vec<&str> = conditions.iter().map(String::as_str).collect(); + let mut members: Vec = (0..6).map(|index| json!(format!("fixed-{index}"))).collect(); + members.push(complex_member); + let semantic_model = model(&list_template(toggles(&condition_refs), Value::Array(members))); + let validator = list_validator(string_list_schema("maxItems", json!(5))); + + let diagnostics = validate(&validator, &semantic_model); + + let violations = findings(&diagnostics, "F3032"); + assert_eq!(violations.len(), 1, "six unconditional members already violate the maximum: {diagnostics:#?}"); + assert_eq!(violations[0].message, "expected maximum item count: 5, found: 6"); + assert!(semantic_model.exhausted_budget_kinds().contains(&BudgetKind::SchemaScenarioAssignments)); +} + +#[test] +fn unique_items_does_not_collapse_out_of_range_integral_float() { + let template = list_template(json!({}), json!([i64::MAX, 9_223_372_036_854_775_808.0_f64])); + let validator = list_validator(json!({"type": "array", "items": {"type": "number"}, "uniqueItems": true})); + + let diagnostics = validate(&validator, &model(&template)); + + assert!( + findings(&diagnostics, "F3037").is_empty(), + "2^63 is distinct from the largest signed integer: {diagnostics:#?}" + ); +} + +#[test] +fn unique_items_with_shared_conditions_is_complete() { + let fields: serde_json::Map = (0..9) + .map(|index| (format!("Field{index}"), if_condition("Shared", json!("enabled"), json!("disabled")))) + .collect(); + let semantic_model = + model(&list_template(toggles(&["Shared"]), json!([Value::Object(fields), {"distinct": true}]))); + let validator = list_validator(json!({"type": "array", "items": {"type": "object"}, "uniqueItems": true})); + + let diagnostics = validate(&validator, &semantic_model); + + assert!(findings(&diagnostics, "F3037").is_empty(), "the two members are distinct: {diagnostics:#?}"); + assert!( + !semantic_model.exhausted_budget_kinds().contains(&BudgetKind::SchemaScenarioAssignments), + "shared conditions produce only two exact alternatives: {:?}", + semantic_model.exhausted_budget_kinds() + ); +} + +#[test] +fn unique_items_node_heavy_member_reports_incomplete_analysis() { + let heavy_conditions: Vec = (0..6).map(|index| format!("Heavy{index}")).collect(); + let light_conditions: Vec = (0..6).map(|index| format!("Light{index}")).collect(); + let condition_refs: Vec<&str> = heavy_conditions.iter().chain(&light_conditions).map(String::as_str).collect(); + let unresolved = Value::Array(vec![imported_value(); 50]); + let mut member = serde_json::Map::new(); + let mut target = serde_json::Map::new(); + for (index, condition) in heavy_conditions.iter().enumerate() { + member.insert(format!("Heavy{index}"), if_condition(condition, unresolved.clone(), json!("light"))); + target.insert(format!("Heavy{index}"), json!("light")); + } + for (index, condition) in light_conditions.iter().enumerate() { + member.insert(format!("Light{index}"), if_condition(condition, json!("a"), json!("b"))); + target.insert(format!("Light{index}"), json!(if index == 0 { "a" } else { "b" })); + } + let semantic_model = + model(&list_template(toggles(&condition_refs), json!([Value::Object(member), Value::Object(target)]))); + let validator = list_validator(json!({"type": "array", "items": {"type": "object"}, "uniqueItems": true})); + + let diagnostics = validate(&validator, &semantic_model); + + assert!( + findings(&diagnostics, "F3037").is_empty(), + "the covering set must not claim an unproven duplicate: {diagnostics:#?}" + ); + assert!( + semantic_model.exhausted_budget_kinds().contains(&BudgetKind::SchemaScenarioAssignments), + "the materialized-node bound forces covering and must be visible: {:?}", + semantic_model.exhausted_budget_kinds() + ); +} diff --git a/src/template-model/src/consts.rs b/src/template-model/src/consts.rs index a22b6c1a..2ed97eef 100644 --- a/src/template-model/src/consts.rs +++ b/src/template-model/src/consts.rs @@ -213,6 +213,22 @@ pub const MAX_SCENARIO_COMBINATIONS: usize = 262_144; /// (here 128x the per-value cap). pub const MAX_TOTAL_SCENARIO_COMBINATIONS: u64 = 33_554_432; +/// Largest joint product of a container's member scenarios that is enumerated in +/// full. A list or map whose members are gated by N independent conditions has +/// 2^N joint assignments; past this many, the product is replaced by an +/// alternative-covering set (see `resolved_value::cover_cartesian_scenarios`). +/// The covering set includes every member scenario and pair of condition states +/// while growing linearly in the sum of member alternatives. Matches +/// `MAX_ENUM_EXPANSION` so a single value never materializes more joint copies +/// than enumerated variants. +pub const MAX_COMPLETE_SCENARIO_PRODUCT: usize = 4_096; + +/// Largest number of `ResolvedValue` nodes a fully enumerated joint product may +/// materialize (scenario count times nodes per scenario). Bounds the memory of +/// one expansion by size rather than count: a product of large member values +/// switches to the covering set before `MAX_COMPLETE_SCENARIO_PRODUCT` would. +pub const MAX_SCENARIO_PRODUCT_NODES: usize = 1 << 20; + pub const MAX_RESOLVE_DEPTH: u32 = 512; /// Maximum structural nesting depth the YAML loader permits before rejecting @@ -228,6 +244,16 @@ pub const MAX_RESOLVE_DEPTH: u32 = 512; /// bounded by `serde_json`'s built-in recursion limit. pub const MAX_YAML_NESTING_DEPTH: usize = 512; +/// Maximum number of YAML nodes that alias resolution may copy into one +/// document. An alias is resolved by copying its anchored value, so nested +/// aliases multiply: eight levels of nine aliases over a nine-element list +/// expand a few hundred bytes into 9^8 scalars. The bound counts copied nodes +/// across the whole document and rejects the template with a located parse +/// error once exceeded. It is far above any template that uses anchors to share +/// configuration (a 10 MiB template cannot author this many nodes directly) and +/// well below the point where the copies exhaust memory. +pub const MAX_YAML_ALIAS_EXPANSION_NODES: usize = 1 << 20; + /// Cumulative work budget for `Fn::ForEach` transform expansion across all /// sections of a single template. Charged for every loop iteration (one unit per /// element emitted) and every recursive body-traversal node visited. Once diff --git a/src/template-model/src/dynamodb.rs b/src/template-model/src/dynamodb.rs index a84331e3..bb5497d3 100644 --- a/src/template-model/src/dynamodb.rs +++ b/src/template-model/src/dynamodb.rs @@ -29,11 +29,22 @@ pub fn analyze_dynamodb_table_scenarios(model: &SemanticModel, resource_id: &str let mut analysis = DynamoDbScenarioAnalysis::default(); let mut attribute_mismatches = BTreeSet::new(); - for (properties, conditions) in model.resolve_properties_scenarios(resource_id) { - if !scenario_is_reachable(model, resource_id, &conditions) { + let scenarios = model.resolve_properties_scenarios_projected( + resource_id, + &[ + ATTRIBUTE_DEFINITIONS, + BILLING_MODE, + GLOBAL_SECONDARY_INDEXES, + KEY_SCHEMA, + LOCAL_SECONDARY_INDEXES, + PROVISIONED_THROUGHPUT, + ], + ); + for (properties, conditions) in scenarios.iter() { + if !scenario_is_reachable(model, resource_id, conditions) { continue; } - let Some(properties) = properties_object(&properties) else { + let Some(properties) = properties_object(properties) else { continue; }; diff --git a/src/template-model/src/lib.rs b/src/template-model/src/lib.rs index 170e8c4d..97325c26 100644 --- a/src/template-model/src/lib.rs +++ b/src/template-model/src/lib.rs @@ -19,6 +19,7 @@ pub mod ir; pub mod json_value; pub(crate) mod lang_ext_shapes; pub(crate) mod language_extensions; +pub mod member_presence; pub mod message; pub mod model; pub(crate) mod nesting; @@ -51,7 +52,7 @@ pub use defect::{DefectPhase, ParseDefect}; pub use ir::*; pub use json_value::JsonValue; pub use message::{primary_identifier_conflict_message, quote, render_str_list, render_value, render_value_list}; -pub use model::{ParseConfig, ParseResult, PseudoParameterOverrides, SemanticModel}; +pub use model::{ListMemberScenario, ParseConfig, ParseResult, PseudoParameterOverrides, SemanticModel}; pub use pattern::{ CompiledPattern, anchor_allowed_pattern, compile as compile_pattern, default_matches_pattern, is_service_valid, }; diff --git a/src/template-model/src/member_presence.rs b/src/template-model/src/member_presence.rs new file mode 100644 index 00000000..2b5ece0e --- /dev/null +++ b/src/template-model/src/member_presence.rs @@ -0,0 +1,267 @@ +//! Presence analysis for the members of a resolved list or map. +//! +//! A member gated by `Fn::If` over `AWS::NoValue` is present in exactly the +//! deployments where its condition literals hold. Knowing each member's +//! presence literals lets a consumer reason about cardinality and co-presence +//! without enumerating the 2^N joint assignments of N independent conditions. + +use std::collections::HashMap; + +use crate::resolved_value::{contains_dynamic_resolved, is_resolved_null}; +use crate::resolver::ResolvedValue; + +/// When a container member survives to deployment. +#[derive(Debug, Clone, PartialEq, Eq)] +pub enum MemberPresence { + /// The member is present in every deployment. + Always, + /// The member resolves to `AWS::NoValue` in every deployment. + Never, + /// The member is present exactly when every listed `(condition, value)` + /// literal holds. + When(Vec<(String, bool)>), + /// Presence depends on conditions in a shape that has no single literal + /// conjunction (both branches partly present, or a parameter-driven `Enum` + /// mixing null and non-null variants). + Complex, +} + +/// Classifies one member of a resolved container. +#[must_use] +pub fn member_presence(member: &ResolvedValue) -> MemberPresence { + match member { + ResolvedValue::Conditional { condition, if_true, if_false } => { + conditional_presence(condition, member_presence(if_true), member_presence(if_false)) + } + ResolvedValue::Enum { variants } => { + let null_variants = variants.iter().filter(|variant| is_resolved_null(variant)).count(); + if null_variants == 0 { + MemberPresence::Always + } else if null_variants == variants.len() { + MemberPresence::Never + } else { + MemberPresence::Complex + } + } + other if is_resolved_null(other) => MemberPresence::Never, + _ => MemberPresence::Always, + } +} + +fn conditional_presence(condition: &str, if_true: MemberPresence, if_false: MemberPresence) -> MemberPresence { + let conjoin_literal = + |mut literals: Vec<(String, bool)>, expected: bool| match literals.iter().find(|(name, _)| name == condition) { + Some((_, existing)) if *existing != expected => MemberPresence::Never, + Some(_) => MemberPresence::When(literals), + None => { + literals.insert(0, (condition.to_string(), expected)); + MemberPresence::When(literals) + } + }; + match (if_true, if_false) { + (MemberPresence::Always, MemberPresence::Always) => MemberPresence::Always, + (MemberPresence::Never, MemberPresence::Never) => MemberPresence::Never, + (MemberPresence::Always, MemberPresence::Never) => MemberPresence::When(vec![(condition.to_string(), true)]), + (MemberPresence::Never, MemberPresence::Always) => MemberPresence::When(vec![(condition.to_string(), false)]), + (MemberPresence::When(literals), MemberPresence::Never) => conjoin_literal(literals, true), + (MemberPresence::Never, MemberPresence::When(literals)) => conjoin_literal(literals, false), + _ => MemberPresence::Complex, + } +} + +/// One container member with its presence and whether a present value would +/// carry an unresolved reference or dynamic placeholder. +#[derive(Debug, Clone)] +pub struct ContainerMember<'a> { + pub value: &'a ResolvedValue, + pub presence: MemberPresence, + pub is_dynamic: bool, +} + +/// Classifies every member of a list, or every entry value of a map. +#[must_use] +pub fn classify_members(members: &[ResolvedValue]) -> Vec> { + members + .iter() + .map(|value| ContainerMember { + value, + presence: member_presence(value), + is_dynamic: contains_dynamic_resolved(value), + }) + .collect() +} + +/// Every way a member resolves to `AWS::NoValue`, constrained by decisions +/// already made by an enclosing conditional. +pub(crate) fn absent_alternatives( + member: &ResolvedValue, + established_literals: &[(String, bool)], +) -> Vec> { + let mut alternatives = Vec::new(); + let mut literals = established_literals.to_vec(); + collect_absent_alternatives(member, &mut literals, &mut alternatives); + alternatives +} + +fn collect_absent_alternatives( + value: &ResolvedValue, + literals: &mut Vec<(String, bool)>, + alternatives: &mut Vec>, +) { + match value { + ResolvedValue::Conditional { condition, if_true, if_false } => { + for (branch, holds) in [(if_true, true), (if_false, false)] { + match literals.iter().find(|(name, _)| name == condition) { + Some((_, decided)) if *decided == holds => { + collect_absent_alternatives(branch, literals, alternatives); + } + Some(_) => {} + None => { + literals.push((condition.clone(), holds)); + collect_absent_alternatives(branch, literals, alternatives); + literals.pop(); + } + } + } + } + ResolvedValue::Enum { variants } => { + for variant in variants { + collect_absent_alternatives(variant, literals, alternatives); + } + } + other if is_resolved_null(other) => alternatives.push(literals.clone()), + _ => {} + } +} + +/// Adds `literals` to `assignment` unless one contradicts an existing entry. +/// Returns whether the literals were compatible; on `false` the assignment is +/// left unchanged. +pub fn extend_assignment(assignment: &mut HashMap, literals: &[(String, bool)]) -> bool { + let mut additions = HashMap::with_capacity(literals.len()); + for (condition, value) in literals { + if assignment.get(condition).is_some_and(|existing| existing != value) + || additions.insert(condition.as_str(), *value).is_some_and(|existing| existing != *value) + { + return false; + } + } + assignment.extend(additions.into_iter().map(|(condition, value)| (condition.to_string(), value))); + true +} + +#[cfg(test)] +mod tests { + use super::*; + + fn concrete(value: serde_json::Value) -> ResolvedValue { + ResolvedValue::Concrete { value: value.into() } + } + + fn no_value() -> ResolvedValue { + concrete(serde_json::Value::Null) + } + + fn conditional(condition: &str, if_true: ResolvedValue, if_false: ResolvedValue) -> ResolvedValue { + ResolvedValue::Conditional { + condition: condition.to_string(), + if_true: Box::new(if_true), + if_false: Box::new(if_false), + } + } + + #[test] + fn optional_member_over_no_value_is_present_when_its_condition_holds() { + let member = conditional("HasTag", concrete(serde_json::json!({"Key": "k"})), no_value()); + assert_eq!(member_presence(&member), MemberPresence::When(vec![("HasTag".to_string(), true)])); + } + + #[test] + fn reversed_branches_negate_the_literal() { + let member = conditional("Skip", no_value(), concrete(serde_json::json!("x"))); + assert_eq!(member_presence(&member), MemberPresence::When(vec![("Skip".to_string(), false)])); + } + + #[test] + fn nested_optional_member_conjoins_literals_outermost_first() { + let inner = conditional("Inner", concrete(serde_json::json!("x")), no_value()); + let member = conditional("Outer", inner, no_value()); + assert_eq!( + member_presence(&member), + MemberPresence::When(vec![("Outer".to_string(), true), ("Inner".to_string(), true)]) + ); + } + + #[test] + fn conditional_choosing_between_two_values_is_always_present() { + let member = conditional("Pick", concrete(serde_json::json!("a")), concrete(serde_json::json!("b"))); + assert_eq!(member_presence(&member), MemberPresence::Always); + } + + #[test] + fn conditional_whose_branches_are_both_partly_present_is_complex() { + let left = conditional("A", concrete(serde_json::json!("a")), no_value()); + let right = conditional("B", concrete(serde_json::json!("b")), no_value()); + assert_eq!(member_presence(&conditional("Pick", left, right)), MemberPresence::Complex); + } + + #[test] + fn enum_mixing_null_and_values_is_complex_and_all_null_is_never() { + let mixed = ResolvedValue::Enum { variants: vec![no_value(), concrete(serde_json::json!("a"))] }; + assert_eq!(member_presence(&mixed), MemberPresence::Complex); + let all_null = ResolvedValue::Enum { variants: vec![no_value(), no_value()] }; + assert_eq!(member_presence(&all_null), MemberPresence::Never); + } + + #[test] + fn absent_alternatives_lists_the_null_leaves() { + let member = conditional("HasTag", concrete(serde_json::json!({"Key": "k"})), no_value()); + assert_eq!(absent_alternatives(&member, &[]), vec![vec![("HasTag".to_string(), false)]]); + assert!(absent_alternatives(&concrete(serde_json::json!([])), &[]).is_empty()); + assert_eq!(absent_alternatives(&no_value(), &[]), vec![Vec::new()]); + } + + #[test] + fn classify_members_marks_reference_values_dynamic() { + let members = vec![ + ResolvedValue::Reference { target: "P".to_string(), kind: crate::resolver::RefKind::Ref }, + concrete(serde_json::json!("a")), + ]; + let classified = classify_members(&members); + assert!(classified[0].is_dynamic && classified[0].presence == MemberPresence::Always); + assert!(!classified[1].is_dynamic); + } + + #[test] + fn extend_assignment_rejects_contradicting_literals_without_mutating() { + let mut assignment = HashMap::from([("A".to_string(), true)]); + assert!(!extend_assignment(&mut assignment, &[("B".to_string(), true), ("A".to_string(), false)])); + assert_eq!(assignment.len(), 1); + assert!(extend_assignment(&mut assignment, &[("B".to_string(), true)])); + assert_eq!(assignment.get("B"), Some(&true)); + } + + #[test] + fn repeated_condition_that_requires_both_values_is_never_present() { + let impossible = + conditional("Same", conditional("Same", no_value(), concrete(serde_json::json!("dead"))), no_value()); + assert_eq!(member_presence(&impossible), MemberPresence::Never); + } + + #[test] + fn absent_alternatives_honor_established_condition_decisions() { + let member = conditional("Same", concrete(serde_json::json!("present")), no_value()); + assert!(absent_alternatives(&member, &[("Same".to_string(), true)]).is_empty()); + assert_eq!( + absent_alternatives(&member, &[("Same".to_string(), false)]), + vec![vec![("Same".to_string(), false)]] + ); + } + + #[test] + fn extend_assignment_rejects_contradictions_within_new_literals() { + let mut assignment = HashMap::new(); + assert!(!extend_assignment(&mut assignment, &[("A".to_string(), true), ("A".to_string(), false)])); + assert!(assignment.is_empty()); + } +} diff --git a/src/template-model/src/model.rs b/src/template-model/src/model.rs index 83ad6a0e..20dc0002 100644 --- a/src/template-model/src/model.rs +++ b/src/template-model/src/model.rs @@ -7,6 +7,7 @@ use crate::graph::ReferenceGraph; use crate::ir::*; use crate::is_custom_resource_type; use crate::json_value::JsonValue; +use crate::member_presence::absent_alternatives; use crate::regions::*; use crate::resolved_value::*; use crate::resolver::*; @@ -32,6 +33,21 @@ pub struct PathValuePair { pub value: String, } +/// One deployment scenario for an authored member of a resolved list. +#[derive(Debug, Clone)] +pub struct ListMemberScenario { + /// Identity shared by members from the same outer list alternative. + pub container_scenario: usize, + /// Conditions selecting the outer list alternative containing this member. + pub container_conditions: HashMap, + /// Authored zero-based position of the member in that list alternative. + pub index: usize, + /// Member value after expanding only conditions that wrap this member. + pub value: ResolvedValue, + /// Conditions selecting both the outer list alternative and this member value. + pub conditions: HashMap, +} + /// A property that is dropped (resolves to AWS::NoValue) in one branch of an Fn::If condition. #[derive(Debug, Clone, Serialize, Default)] #[cfg_attr(feature = "wasm-bindings", derive(tsify::Tsify))] @@ -324,8 +340,11 @@ pub struct SemanticModel { /// available for best-effort value resolution but cannot prove reachability. invalid_inline_conditions: HashSet, resolve_memo: Mutex>>, - raw_scenario_memo: Mutex)>>>, - properties_scenario_cache: Mutex)>>>>, + raw_scenario_memo: + Mutex)>>, bool)>>, + properties_scenario_cache: + Mutex>), Arc)>>>>, + list_member_scenario_cache: Mutex>>>, scenario_memo: Mutex)>>>>, lifecycle_policy_scenario_cache: Mutex)>>>, /// Cumulative count of scenarios materialized by `resolve_scenarios` across @@ -1135,6 +1154,7 @@ impl SemanticModel { resolve_memo: Mutex::new(HashMap::new()), raw_scenario_memo: Mutex::new(HashMap::new()), properties_scenario_cache: Mutex::new(HashMap::new()), + list_member_scenario_cache: Mutex::new(HashMap::new()), scenario_memo: Mutex::new(HashMap::new()), lifecycle_policy_scenario_cache: Mutex::new(HashMap::new()), scenario_combinations_used: AtomicU64::new(0), @@ -1517,6 +1537,278 @@ impl SemanticModel { result } + /// Returns the resolved value tree at `path` without expanding `Fn::If` or + /// parameter-enum alternatives. Unlike [`Self::resolve_deep`], this also + /// traverses a whole-`Properties` `Fn::If`; a path absent from one branch is + /// represented by the dynamic placeholder produced by + /// [`resolved_value_at_path`]. This lookup does not consume scenario budget. + #[must_use] + pub fn resolve_unexpanded(&self, resource_id: &str, path: &str) -> Option { + self.resolve_deep(resource_id, path) + .or_else(|| self.resolve(resource_id, path).cloned()) + .or_else(|| self.resolve_via_properties_if(resource_id, path)) + } + + /// Returns scenarios for each list member at `path`, expanding every member + /// independently under conditions that wrap the whole list. Conditions on + /// sibling members never multiply, and repeated callers share one cached + /// allocation. This structural query does not consume scenario budget. + #[must_use] + pub fn resolve_list_member_scenarios_shared(&self, resource_id: &str, path: &str) -> Arc> { + let cache_key = (resource_id.to_string(), path.to_string()); + let mut cache = self.list_member_scenario_cache.lock().unwrap_or_else(|poisoned| poisoned.into_inner()); + if let Some(scenarios) = cache.get(&cache_key) { + return Arc::clone(scenarios); + } + + let mut member_scenarios = Vec::new(); + if let Some(value) = self.resolve_unexpanded(resource_id, path) { + let mut next_container_scenario = 0; + self.collect_list_member_scenarios( + &value, + &HashMap::new(), + &mut next_container_scenario, + &mut member_scenarios, + ); + } + let shared = Arc::new(member_scenarios); + cache.insert(cache_key, Arc::clone(&shared)); + shared + } + + /// Returns each authored list source path that can contain two distinct, + /// non-null members in a deployment compatible with `base_conditions`. + /// Dynamic member values count as present. Members from different outer list + /// alternatives or different alternatives of one member never form a pair. + #[must_use] + pub fn list_member_pair_source_paths( + &self, + resource_id: &str, + path: &str, + base_conditions: &HashMap, + ) -> BTreeSet { + let member_scenarios = self.resolve_list_member_scenarios_shared(resource_id, path); + let container_scenarios: BTreeSet = + member_scenarios.iter().map(|scenario| scenario.container_scenario).collect(); + let mut source_paths = BTreeSet::new(); + for container_scenario in container_scenarios { + if self.conditions.satisfiability_budget_exhausted() { + break; + } + let Some(container) = + member_scenarios.iter().find(|scenario| scenario.container_scenario == container_scenario) + else { + continue; + }; + let Some(base_and_container) = + self.merge_reachable_conditions(resource_id, base_conditions, &container.container_conditions) + else { + continue; + }; + 'container_members: for (left_position, left) in member_scenarios.iter().enumerate() { + if left.container_scenario != container_scenario || is_resolved_null(&left.value) { + continue; + } + let Some(base_and_left) = + self.merge_reachable_conditions(resource_id, &base_and_container, &left.conditions) + else { + continue; + }; + for right in member_scenarios.iter().skip(left_position + 1) { + if self.conditions.satisfiability_budget_exhausted() { + return source_paths; + } + if right.container_scenario != container_scenario + || left.index == right.index + || is_resolved_null(&right.value) + { + continue; + } + if let Some(conditions) = + self.merge_reachable_conditions(resource_id, &base_and_left, &right.conditions) + { + source_paths.insert( + self.scenario_source_path(resource_id, path, &conditions) + .unwrap_or_else(|| path.to_string()), + ); + break 'container_members; + } + } + } + } + source_paths + } + + fn merge_reachable_conditions( + &self, + resource_id: &str, + left: &HashMap, + right: &HashMap, + ) -> Option> { + let mut merged = left.clone(); + for (condition, value) in right { + if merged.get(condition).is_some_and(|existing| existing != value) { + return None; + } + merged.insert(condition.clone(), *value); + } + if let Some(resource_condition) = + self.resources.get(resource_id).and_then(|resource| resource.condition.as_ref()) + { + if merged.get(resource_condition) == Some(&false) { + return None; + } + merged.insert(resource_condition.clone(), true); + } + let assumptions: Vec<(String, bool)> = + merged.iter().map(|(condition, value)| (condition.clone(), *value)).collect(); + (self.conditions.satisfiability(&assumptions) == Satisfiability::Satisfiable).then_some(merged) + } + + fn collect_list_member_scenarios( + &self, + value: &ResolvedValue, + assumptions: &HashMap, + next_container_scenario: &mut usize, + member_scenarios: &mut Vec, + ) { + match value { + ResolvedValue::Conditional { condition, if_true, if_false } => match assumptions.get(condition) { + Some(true) => { + self.collect_list_member_scenarios(if_true, assumptions, next_container_scenario, member_scenarios) + } + Some(false) => { + self.collect_list_member_scenarios(if_false, assumptions, next_container_scenario, member_scenarios) + } + None => { + let mut true_assumptions = assumptions.clone(); + true_assumptions.insert(condition.clone(), true); + self.collect_list_member_scenarios( + if_true, + &true_assumptions, + next_container_scenario, + member_scenarios, + ); + let mut false_assumptions = assumptions.clone(); + false_assumptions.insert(condition.clone(), false); + self.collect_list_member_scenarios( + if_false, + &false_assumptions, + next_container_scenario, + member_scenarios, + ); + } + }, + ResolvedValue::Enum { variants } => { + for variant in variants { + self.collect_list_member_scenarios(variant, assumptions, next_container_scenario, member_scenarios); + } + } + ResolvedValue::List { items } => { + let container_scenario = *next_container_scenario; + *next_container_scenario = (*next_container_scenario).saturating_add(1); + for (index, item) in items.iter().enumerate() { + Self::collect_member_scenarios( + item, + assumptions, + container_scenario, + index, + assumptions, + member_scenarios, + ); + } + } + ResolvedValue::Concrete { value } => { + if let Some(items) = value.as_array() { + let container_scenario = *next_container_scenario; + *next_container_scenario = (*next_container_scenario).saturating_add(1); + member_scenarios.extend(items.iter().enumerate().map(|(index, item)| ListMemberScenario { + container_scenario, + container_conditions: assumptions.clone(), + index, + value: ResolvedValue::Concrete { value: item.clone().into() }, + conditions: assumptions.clone(), + })); + } + } + ResolvedValue::Map { .. } + | ResolvedValue::Reference { .. } + | ResolvedValue::Dynamic { .. } + | ResolvedValue::TypedDynamic { .. } => {} + } + } + + fn collect_member_scenarios( + value: &ResolvedValue, + assumptions: &HashMap, + container_scenario: usize, + index: usize, + container_conditions: &HashMap, + member_scenarios: &mut Vec, + ) { + match value { + ResolvedValue::Conditional { condition, if_true, if_false } => match assumptions.get(condition) { + Some(true) => Self::collect_member_scenarios( + if_true, + assumptions, + container_scenario, + index, + container_conditions, + member_scenarios, + ), + Some(false) => Self::collect_member_scenarios( + if_false, + assumptions, + container_scenario, + index, + container_conditions, + member_scenarios, + ), + None => { + let mut true_assumptions = assumptions.clone(); + true_assumptions.insert(condition.clone(), true); + Self::collect_member_scenarios( + if_true, + &true_assumptions, + container_scenario, + index, + container_conditions, + member_scenarios, + ); + let mut false_assumptions = assumptions.clone(); + false_assumptions.insert(condition.clone(), false); + Self::collect_member_scenarios( + if_false, + &false_assumptions, + container_scenario, + index, + container_conditions, + member_scenarios, + ); + } + }, + ResolvedValue::Enum { variants } => { + for variant in variants { + Self::collect_member_scenarios( + variant, + assumptions, + container_scenario, + index, + container_conditions, + member_scenarios, + ); + } + } + _ => member_scenarios.push(ListMemberScenario { + container_scenario, + container_conditions: container_conditions.clone(), + index, + value: value.clone(), + conditions: assumptions.clone(), + }), + } + } + /// Whether the resource authors a value at `path`, whatever that value is. /// /// Presence is a different question from resolvability: a `Ref` to a @@ -1542,7 +1834,7 @@ impl SemanticModel { /// a property can take must stop when one of them cannot be known. #[must_use] pub fn has_unresolved_scenario(&self, resource_id: &str, path: &str) -> bool { - let scenarios = self.resolve_scenarios(resource_id, path); + let scenarios = self.resolve_scenarios_shared(resource_id, path); scenarios.is_empty() || scenarios.iter().any(|(value, _)| contains_dynamic_resolved(value)) } @@ -1761,7 +2053,13 @@ impl SemanticModel { let remaining_limit = usize::try_from(remaining).unwrap_or(usize::MAX); let effective_limit = per_value_limit.min(remaining_limit); let mut scenarios = Vec::new(); - let was_curtailed = collect_scenarios(value, assumptions, effective_limit, &mut scenarios); + let is_reachable = |scenario_assumptions: &HashMap| { + let assumptions: Vec<(String, bool)> = + scenario_assumptions.iter().map(|(condition, value)| (condition.clone(), *value)).collect(); + self.conditions.is_satisfiable(&assumptions) + }; + let was_curtailed = + collect_scenarios_reachable(value, assumptions, effective_limit, &mut scenarios, &is_reachable); if was_curtailed { self.scenario_expansion_curtailed.store(true, Ordering::Relaxed); if per_value_limit == MAX_SCENARIO_COMBINATIONS && per_value_limit <= remaining_limit { @@ -1827,11 +2125,61 @@ impl SemanticModel { &self, resource_id: &str, ) -> Arc)>> { + self.resolve_properties_scenarios_selected(resource_id, None) + } + + /// Owned copy of [`Self::resolve_properties_scenarios_shared`]; read-only + /// callers should use the shared accessor to avoid cloning the cached + /// expansion. + pub fn resolve_properties_scenarios(&self, resource_id: &str) -> Vec<(ResolvedValue, HashMap)> { + self.resolve_properties_scenarios_shared(resource_id).as_ref().clone() + } + + /// Like [`Self::resolve_properties_scenarios_shared`] but expands only the + /// named top-level properties. Conditions that gate other properties never + /// enter the expansion, so the scenario count grows with the conditions on + /// the requested properties alone, and a scenario's assumptions carry only + /// the conditions its values depend on. + pub fn resolve_properties_scenarios_projected( + &self, + resource_id: &str, + property_names: &[&str], + ) -> Arc)>> { + let selection: BTreeSet = property_names.iter().map(|name| (*name).to_string()).collect(); + self.resolve_properties_scenarios_selected(resource_id, Some(selection)) + } + + /// The condition assignments under which the top-level property + /// `property_name` is absent at deployment: undeclared, or resolving to + /// `AWS::NoValue`. Only the conditions that decide the property's own + /// presence appear, never conditions nested inside a present value, so the + /// result stays linear in the property's `Fn::If` depth. Empty when the + /// property is always present or the resource's properties are dynamic. + #[must_use] + pub fn property_absence_scenarios(&self, resource_id: &str, property_name: &str) -> Vec> { + let Some(properties) = self.resolved_properties_value(resource_id) else { + return Vec::new(); + }; + let mut absences = Vec::new(); + collect_property_absences(&properties, property_name, &mut Vec::new(), &mut absences); + absences + } + + fn resolve_properties_scenarios_selected( + &self, + resource_id: &str, + selection: Option>, + ) -> Arc)>> { + let cache_key = (resource_id.to_string(), selection); let mut cache = self.properties_scenario_cache.lock().unwrap_or_else(|poisoned| poisoned.into_inner()); - if let Some(scenarios) = cache.get(resource_id) { + if let Some(scenarios) = cache.get(&cache_key) { return Arc::clone(scenarios); } - let scenarios = match self.resolved_properties_value(resource_id) { + let properties = self.resolved_properties_value(resource_id).map(|properties| match &cache_key.1 { + Some(selection) => project_properties_value(&properties, selection), + None => properties, + }); + let scenarios = match properties { Some(properties) => self.collect_scenarios_with_budget( &properties, MAX_SCENARIO_COMBINATIONS, @@ -1840,14 +2188,10 @@ impl SemanticModel { None => Vec::new(), }; let shared = Arc::new(scenarios); - cache.insert(resource_id.to_string(), Arc::clone(&shared)); + cache.insert(cache_key, Arc::clone(&shared)); shared } - pub fn resolve_properties_scenarios(&self, resource_id: &str) -> Vec<(ResolvedValue, HashMap)> { - self.resolve_properties_scenarios_shared(resource_id).as_ref().clone() - } - /// Returns the authored, branch-qualified source path for an effective path in /// one resolved scenario. The returned path uses the same dotted form as /// resolver source paths and can be passed to [`Self::resource_span`]. @@ -1918,32 +2262,65 @@ impl SemanticModel { }) } + /// Returns one immutable allocation of the scenarios for the value at `path` + /// under the default per-value limit, shared across read-only callers. + pub fn resolve_scenarios_shared( + &self, + resource_id: &str, + path: &str, + ) -> Arc)>> { + self.resolve_scenarios_with_limit_shared(resource_id, path, MAX_SCENARIO_COMBINATIONS).0 + } + + /// Owned copy of [`Self::resolve_scenarios_shared`]; read-only callers should + /// use the shared accessor to avoid cloning the memoized expansion. pub fn resolve_scenarios(&self, resource_id: &str, path: &str) -> Vec<(ResolvedValue, HashMap)> { - let key = (resource_id.to_string(), path.to_string()); + self.resolve_scenarios_shared(resource_id, path).as_ref().clone() + } + + /// Expands the value at `path` under a per-value scenario limit, reporting + /// whether the expansion was curtailed. Results are memoized per + /// `(resource, path, limit)` so repeated queries, including the default-limit + /// [`Self::resolve_scenarios_shared`], share one allocation and charge the + /// cumulative budget once. + pub fn resolve_scenarios_with_limit_shared( + &self, + resource_id: &str, + path: &str, + per_value_limit: usize, + ) -> (Arc)>>, bool) { + let key = (resource_id.to_string(), path.to_string(), per_value_limit); let mut memo = self.raw_scenario_memo.lock().unwrap_or_else(|poisoned| poisoned.into_inner()); - if let Some(scenarios) = memo.get(&key) { - return scenarios.clone(); + if let Some((scenarios, was_curtailed)) = memo.get(&key) { + return (Arc::clone(scenarios), *was_curtailed); } - let scenarios = self.resolve_scenarios_with_limit(resource_id, path, MAX_SCENARIO_COMBINATIONS).0; - memo.insert(key, scenarios.clone()); - scenarios + let (scenarios, was_curtailed) = self.expand_scenarios_at_path(resource_id, path, per_value_limit); + let scenarios = Arc::new(scenarios); + memo.insert(key, (Arc::clone(&scenarios), was_curtailed)); + (scenarios, was_curtailed) } + /// Owned copy of [`Self::resolve_scenarios_with_limit_shared`]; read-only + /// callers should use the shared accessor to avoid cloning the memoized + /// expansion. pub fn resolve_scenarios_with_limit( &self, resource_id: &str, path: &str, per_value_limit: usize, ) -> (Vec<(ResolvedValue, HashMap)>, bool) { - let value = match self.resolve_deep(resource_id, path) { - Some(value) => value, - None => match self.resolve(resource_id, path) { - Some(value) => value.clone(), - None => match self.resolve_via_properties_if(resource_id, path) { - Some(value) => value, - None => return (Vec::new(), false), - }, - }, + let (scenarios, was_curtailed) = self.resolve_scenarios_with_limit_shared(resource_id, path, per_value_limit); + (scenarios.as_ref().clone(), was_curtailed) + } + + fn expand_scenarios_at_path( + &self, + resource_id: &str, + path: &str, + per_value_limit: usize, + ) -> (Vec<(ResolvedValue, HashMap)>, bool) { + let Some(value) = self.resolve_unexpanded(resource_id, path) else { + return (Vec::new(), false); }; self.collect_scenarios_with_budget_status(&value, per_value_limit, MAX_TOTAL_SCENARIO_COMBINATIONS) } @@ -1967,10 +2344,10 @@ impl SemanticModel { resource_id: &str, path: &str, ) -> Vec<(serde_json::Value, HashMap)> { - self.resolve_scenarios(resource_id, path) - .into_iter() + self.resolve_scenarios_shared(resource_id, path) + .iter() .filter_map(|(val, conds)| { - if contains_dynamic_resolved(&val) { + if contains_dynamic_resolved(val) { return None; } if !conds.is_empty() { @@ -1979,11 +2356,11 @@ impl SemanticModel { return None; } } - let json = crate::serialization::resolved_value_to_json_clean(&val)?; + let json = crate::serialization::resolved_value_to_json_clean(val)?; if json_contains_markers(&json) { return None; } - Some((json, conds)) + Some((json, conds.clone())) }) .collect() } @@ -2180,6 +2557,73 @@ impl SpanProvider for SemanticModel { } } +fn collect_property_absences( + properties: &ResolvedValue, + property_name: &str, + literals: &mut Vec<(String, bool)>, + absences: &mut Vec>, +) { + let assignment = |literals: &[(String, bool)]| literals.iter().cloned().collect::>(); + match properties { + ResolvedValue::Conditional { condition, if_true, if_false } => { + for (branch, holds) in [(if_true, true), (if_false, false)] { + match literals.iter().find(|(name, _)| name == condition) { + Some((_, decided)) if *decided == holds => { + collect_property_absences(branch, property_name, literals, absences); + } + Some(_) => {} + None => { + literals.push((condition.clone(), holds)); + collect_property_absences(branch, property_name, literals, absences); + literals.pop(); + } + } + } + } + ResolvedValue::Map { entries } => match entries.iter().find(|entry| entry.key == property_name) { + None => absences.push(assignment(literals)), + Some(entry) => { + for absence_literals in absent_alternatives(&entry.value, literals) { + absences.push(assignment(&absence_literals)); + } + } + }, + ResolvedValue::Concrete { value } if value.get(property_name).is_none_or(serde_json::Value::is_null) => { + absences.push(assignment(literals)); + } + _ => {} + } +} + +/// Keeps only the selected top-level properties of a resolved `Properties` +/// value, descending through an `Fn::If` that wraps the whole block. +fn project_properties_value(properties: &ResolvedValue, selection: &BTreeSet) -> ResolvedValue { + match properties { + ResolvedValue::Conditional { condition, if_true, if_false } => ResolvedValue::Conditional { + condition: condition.clone(), + if_true: Box::new(project_properties_value(if_true, selection)), + if_false: Box::new(project_properties_value(if_false, selection)), + }, + ResolvedValue::Map { entries } => ResolvedValue::Map { + entries: entries.iter().filter(|entry| selection.contains(&entry.key)).cloned().collect(), + }, + ResolvedValue::Concrete { value } => match value.as_object() { + Some(object) => ResolvedValue::Concrete { + value: serde_json::Value::Object( + object + .iter() + .filter(|(key, _)| selection.contains(*key)) + .map(|(k, v)| (k.clone(), v.clone())) + .collect(), + ) + .into(), + }, + None => properties.clone(), + }, + other => other.clone(), + } +} + fn parse_rules(rules_json: &Option, arena: &Arena, rules_node: NodeRef) -> Vec { let Some(rules) = rules_json else { return Vec::new(); @@ -2918,6 +3362,7 @@ fn resolve_output(arena: &Arena, node_ref: NodeRef, resolver: &mut Resolver) -> #[cfg(test)] mod tests { use super::*; + use crate::serialization::resolved_value_to_json; #[test] fn invalid_overrides_reports_nothing_when_unset_or_valid() { @@ -3288,6 +3733,144 @@ Resources: } } + #[test] + fn resolve_unexpanded_preserves_whole_properties_and_nested_conditions_without_spending_budget() { + let input = br#"{ + "Parameters": {"Mode": {"Type": "String"}}, + "Conditions": { + "ChooseProperties": {"Fn::Equals": [{"Ref": "Mode"}, "properties"]}, + "ChooseValue": {"Fn::Equals": [{"Ref": "Mode"}, "value"]} + }, + "Resources": { + "Direct": {"Type": "T", "Properties": {"Values": ["direct"]}}, + "Conditional": {"Type": "T", "Properties": { + "Fn::If": [ + "ChooseProperties", + {"Values": [{"Fn::If": ["ChooseValue", "first", "second"]}]}, + {"Values": ["fallback"]} + ] + }} + } + }"#; + let model = SemanticModel::from_bytes(input).unwrap(); + let direct = model.resolve_unexpanded("Direct", "Properties.Values").expect("direct value"); + let direct_deep = model.resolve_deep("Direct", "Properties.Values").expect("direct deep value"); + assert_eq!(resolved_value_to_json(&direct), serde_json::json!(["direct"])); + assert_eq!(resolved_value_to_json(&direct_deep), serde_json::json!(["direct"])); + + let conditional = model + .resolve_unexpanded("Conditional", "Properties.Values") + .expect("value inside whole-Properties condition"); + let ResolvedValue::Conditional { condition, if_true, if_false } = conditional else { + panic!("expected the whole-Properties condition"); + }; + assert_eq!(condition, "ChooseProperties"); + let ResolvedValue::List { items: true_items } = *if_true else { + panic!("expected true-branch list"); + }; + assert!( + matches!(true_items.as_slice(), [ResolvedValue::Conditional { condition, .. }] if condition == "ChooseValue") + ); + assert_eq!(resolved_value_to_json(if_false.as_ref()), serde_json::json!(["fallback"])); + assert_eq!(model.scenario_combinations_used(), 0, "an unexpanded lookup must not materialize scenarios"); + } + + #[test] + fn list_member_scenarios_expand_members_independently_and_reuse_cache() { + const MEMBER_COUNT: usize = 13; + let mut parameters = serde_json::Map::new(); + let mut conditions = serde_json::Map::new(); + let mut members = Vec::new(); + for index in 0..MEMBER_COUNT { + let parameter = format!("Toggle{index:02}"); + let condition = format!("Enabled{index:02}"); + parameters.insert(parameter.clone(), serde_json::json!({"Type": "String"})); + conditions.insert(condition.clone(), serde_json::json!({"Fn::Equals": [{"Ref": parameter}, "true"]})); + members.push(serde_json::json!({ + "Fn::If": [condition, format!("value-{index:02}"), {"Ref": "AWS::NoValue"}] + })); + } + let template = serde_json::json!({ + "Parameters": parameters, + "Conditions": conditions, + "Resources": {"R": {"Type": "T", "Properties": {"Values": members}}} + }) + .to_string(); + let model = SemanticModel::from_bytes(template.as_bytes()).unwrap(); + + let first = model.resolve_list_member_scenarios_shared("R", "Properties.Values"); + let combinations_after_first = model.scenario_combinations_used(); + let second = model.resolve_list_member_scenarios_shared("R", "Properties.Values"); + + assert_eq!(first.len(), MEMBER_COUNT * 2, "each member contributes only its own two branches"); + for index in 0..MEMBER_COUNT { + let member_scenarios: Vec<&ListMemberScenario> = + first.iter().filter(|scenario| scenario.index == index).collect(); + assert_eq!(member_scenarios.len(), 2, "member {index} must retain both branches"); + assert!(member_scenarios.iter().all(|scenario| scenario.container_scenario == 0)); + assert!(member_scenarios.iter().all(|scenario| scenario.container_conditions.is_empty())); + assert!(member_scenarios.iter().all(|scenario| scenario.conditions.len() == 1)); + } + assert_eq!(combinations_after_first, 0, "member extraction must not materialize joint scenarios"); + assert!(Arc::ptr_eq(&first, &second), "repeated member queries must share their cached allocation"); + assert_eq!(model.scenario_combinations_used(), combinations_after_first); + } + + #[test] + fn list_member_scenarios_keep_outer_enum_alternatives_separate() { + let model = SemanticModel::from_bytes(br#"{"Resources":{"R":{"Type":"T"}}}"#).unwrap(); + let value = ResolvedValue::Enum { + variants: vec![ + ResolvedValue::Concrete { value: serde_json::json!(["left", null]).into() }, + ResolvedValue::Concrete { value: serde_json::json!([null, "right"]).into() }, + ], + }; + let mut next_container_scenario = 0; + let mut member_scenarios = Vec::new(); + + model.collect_list_member_scenarios( + &value, + &HashMap::new(), + &mut next_container_scenario, + &mut member_scenarios, + ); + + assert_eq!(next_container_scenario, 2); + assert_eq!(member_scenarios.len(), 4); + for container_scenario in 0..2 { + let members: Vec<&ListMemberScenario> = + member_scenarios.iter().filter(|scenario| scenario.container_scenario == container_scenario).collect(); + assert_eq!(members.len(), 2); + assert_eq!(members.iter().filter(|scenario| !is_resolved_null(&scenario.value)).count(), 1); + } + } + + #[test] + fn list_member_pair_source_paths_preserve_outer_branches() { + let input = br#"{ + "Parameters": {"Mode": {"Type": "String"}}, + "Conditions": {"ChooseFirst": {"Fn::Equals": [{"Ref": "Mode"}, "first"]}}, + "Resources": { + "Invalid": {"Type": "T", "Properties": { + "Values": {"Fn::If": ["ChooseFirst", ["a", "b"], ["c", "d"]]} + }}, + "Valid": {"Type": "T", "Properties": { + "Values": {"Fn::If": ["ChooseFirst", ["a"], ["b"]]} + }} + } + }"#; + let model = SemanticModel::from_bytes(input).unwrap(); + + assert_eq!( + model.list_member_pair_source_paths("Invalid", "Properties.Values", &HashMap::new()), + BTreeSet::from(["Properties.Values.Fn::If.1".to_string(), "Properties.Values.Fn::If.2".to_string(),]) + ); + assert!( + model.list_member_pair_source_paths("Valid", "Properties.Values", &HashMap::new()).is_empty(), + "members from mutually exclusive one-item branches must not form a pair" + ); + } + #[test] fn model_findinmap_refs_tracked() { let input = br#"{"Resources":{"R":{"Type":"T","Properties":{"V":{"Fn::FindInMap":["MyMap","k1","k2"]}}}}}"#; @@ -3374,16 +3957,17 @@ Resources: assert_eq!(s1, s2); } + const CONDITIONAL_PROPERTY_TEMPLATE: &[u8] = br#"{ + "Parameters": {"Mode": {"Type": "String"}}, + "Conditions": {"ChooseFirst": {"Fn::Equals": [{"Ref": "Mode"}, "first"]}}, + "Resources": {"R": {"Type": "T", "Properties": { + "V": {"Fn::If": ["ChooseFirst", "a", "b"]} + }}} + }"#; + #[test] fn resolve_scenarios_json_shared_reuses_allocation_and_matches_owned() { - let input = br#"{ - "Parameters": {"Mode": {"Type": "String"}}, - "Conditions": {"ChooseFirst": {"Fn::Equals": [{"Ref": "Mode"}, "first"]}}, - "Resources": {"R": {"Type": "T", "Properties": { - "V": {"Fn::If": ["ChooseFirst", "a", "b"]} - }}} - }"#; - let model = SemanticModel::from_bytes(input).unwrap(); + let model = SemanticModel::from_bytes(CONDITIONAL_PROPERTY_TEMPLATE).unwrap(); let first = model.resolve_scenarios_json_shared("R", "Properties.V"); let combinations_after_first = model.scenario_combinations_used(); @@ -3398,14 +3982,7 @@ Resources: #[test] fn resolve_properties_scenarios_shared_reuses_allocation_and_matches_owned() { - let input = br#"{ - "Parameters": {"Mode": {"Type": "String"}}, - "Conditions": {"ChooseFirst": {"Fn::Equals": [{"Ref": "Mode"}, "first"]}}, - "Resources": {"R": {"Type": "T", "Properties": { - "V": {"Fn::If": ["ChooseFirst", "a", "b"]} - }}} - }"#; - let model = SemanticModel::from_bytes(input).unwrap(); + let model = SemanticModel::from_bytes(CONDITIONAL_PROPERTY_TEMPLATE).unwrap(); let first = model.resolve_properties_scenarios_shared("R"); let combinations_after_first = model.scenario_combinations_used(); @@ -3426,6 +4003,67 @@ Resources: ); } + #[test] + fn resolve_scenarios_shared_reuses_allocation_and_matches_owned() { + let model = SemanticModel::from_bytes(CONDITIONAL_PROPERTY_TEMPLATE).unwrap(); + + let first = model.resolve_scenarios_shared("R", "Properties.V"); + let combinations_after_first = model.scenario_combinations_used(); + let second = model.resolve_scenarios_shared("R", "Properties.V"); + let owned = model.resolve_scenarios("R", "Properties.V"); + + assert!(Arc::ptr_eq(&first, &second), "repeated shared access must reuse one allocation"); + assert_eq!(first.len(), 2, "the Fn::If value must expand into one scenario per branch"); + assert_eq!( + serde_json::to_value(first.as_ref()).expect("shared scenarios serialize"), + serde_json::to_value(&owned).expect("owned scenarios serialize"), + "the owned API must return the same scenarios as the shared accessor" + ); + assert_eq!( + model.scenario_combinations_used(), + combinations_after_first, + "cached shared and owned access must not consume additional scenario budget" + ); + } + + #[test] + fn resolve_scenarios_with_limit_owned_matches_shared_including_curtailment() { + let model = SemanticModel::from_bytes(CONDITIONAL_PROPERTY_TEMPLATE).unwrap(); + + let (shared, shared_was_curtailed) = model.resolve_scenarios_with_limit_shared("R", "Properties.V", 1); + let (repeated, repeated_was_curtailed) = model.resolve_scenarios_with_limit_shared("R", "Properties.V", 1); + let (owned, owned_was_curtailed) = model.resolve_scenarios_with_limit("R", "Properties.V", 1); + + assert!(Arc::ptr_eq(&shared, &repeated), "a repeated limited query must reuse its memoized allocation"); + assert_eq!(shared.len(), 1, "a per-value limit of one must keep only the first branch scenario"); + assert!(shared_was_curtailed, "omitting the second branch scenario must be reported as curtailment"); + assert!(repeated_was_curtailed, "a memoized result must keep its curtailment status"); + assert!(owned_was_curtailed, "the owned API must report the memoized curtailment status"); + assert_eq!( + serde_json::to_value(shared.as_ref()).expect("shared scenarios serialize"), + serde_json::to_value(&owned).expect("owned scenarios serialize"), + "the owned API must return the same scenarios as the shared accessor" + ); + } + + #[test] + fn resolve_scenarios_with_limit_shared_memoizes_each_limit_separately() { + let model = SemanticModel::from_bytes(CONDITIONAL_PROPERTY_TEMPLATE).unwrap(); + + let (limited, _) = model.resolve_scenarios_with_limit_shared("R", "Properties.V", 1); + let default_limit = model.resolve_scenarios_shared("R", "Properties.V"); + let (explicit_default_limit, was_curtailed) = + model.resolve_scenarios_with_limit_shared("R", "Properties.V", MAX_SCENARIO_COMBINATIONS); + + assert_eq!(limited.len(), 1, "a per-value limit of one must keep only the first branch scenario"); + assert_eq!(default_limit.len(), 2, "a curtailed limited expansion must not be served to a default-limit query"); + assert!( + Arc::ptr_eq(&default_limit, &explicit_default_limit), + "the default-limit accessor and an explicit default-limit query must share one memoized allocation" + ); + assert!(!was_curtailed, "the complete default-limit expansion must not report curtailment"); + } + #[test] fn default_scenario_queries_are_memoized_and_global_budget_halts_uncached_expansion() { let input = br#"{ diff --git a/src/template-model/src/parser/yaml.rs b/src/template-model/src/parser/yaml.rs index 05bf1a06..a50e9673 100644 --- a/src/template-model/src/parser/yaml.rs +++ b/src/template-model/src/parser/yaml.rs @@ -291,6 +291,12 @@ struct CfnYamlLoader { doc_stack: Vec<(Yaml, usize)>, key_stack: Vec, anchor_map: BTreeMap, + /// Size and nesting depth of each anchored value, so an alias is checked + /// without recursively walking the value it copies. + anchor_shapes: BTreeMap, + /// Nodes copied by alias resolution so far, charged against + /// `MAX_YAML_ALIAS_EXPANSION_NODES`. + alias_expanded_nodes: usize, /// Stack of tags to apply when sequences/mappings complete. /// Each entry is (tag_name, stack_depth_when_set). /// A stack is needed because nested tags (e.g. `!Or [!Equals [...]]`) @@ -347,6 +353,8 @@ impl CfnYamlLoader { doc_stack: Vec::new(), key_stack: Vec::new(), anchor_map: BTreeMap::new(), + anchor_shapes: BTreeMap::new(), + alias_expanded_nodes: 0, pending_tags: Vec::new(), path_frames: Vec::new(), span_map: HashMap::new(), @@ -554,6 +562,7 @@ impl CfnYamlLoader { } if aid > 0 { + self.anchor_shapes.insert(aid, yaml_shape(&node_val)); self.anchor_map.insert(aid, node_val.clone()); } @@ -667,6 +676,22 @@ impl CfnYamlLoader { _ => unreachable!(), } } + fn reject_nesting_depth(&mut self, mark: Marker) { + if self.load_error.is_none() { + let (line, column) = Self::mark_position(mark); + self.load_error = Some(ParseError { + message: format!( + "Template exceeds the maximum structural nesting depth of {} at line {}", + crate::consts::MAX_YAML_NESTING_DEPTH, + line + ), + line: Some(line), + column: Some(column), + }); + } + self.suppress_tree_construction = true; + } + /// Returns whether another container may be opened. On the first overrun, /// records a located parse error and suppresses every subsequent event so /// the loader never constructs a tree deeper than the deterministic bound. @@ -675,12 +700,31 @@ impl CfnYamlLoader { return true; } + self.reject_nesting_depth(mark); + false + } + + /// Returns whether resolving the alias `anchor_id` stays within both the + /// expanded-depth and document-wide node budgets. + fn allow_alias_expansion(&mut self, anchor_id: usize, mark: Marker) -> bool { + let shape = self.anchor_shapes.get(&anchor_id).copied().unwrap_or(YamlShape { nodes: 1, depth: 0 }); + let expanded_depth = self.doc_stack.len().saturating_add(shape.depth); + if expanded_depth > crate::consts::MAX_YAML_NESTING_DEPTH { + self.reject_nesting_depth(mark); + return false; + } + + self.alias_expanded_nodes = self.alias_expanded_nodes.saturating_add(shape.nodes); + if self.alias_expanded_nodes <= crate::consts::MAX_YAML_ALIAS_EXPANSION_NODES { + return true; + } + if self.load_error.is_none() { let (line, column) = Self::mark_position(mark); self.load_error = Some(ParseError { message: format!( - "Template exceeds the maximum structural nesting depth of {} at line {}", - crate::consts::MAX_YAML_NESTING_DEPTH, + "Template exceeds the maximum YAML alias expansion of {} nodes at line {}", + crate::consts::MAX_YAML_ALIAS_EXPANSION_NODES, line ), line: Some(line), @@ -692,6 +736,35 @@ impl CfnYamlLoader { } } +#[derive(Clone, Copy)] +struct YamlShape { + nodes: usize, + depth: usize, +} + +fn yaml_shape(value: &Yaml) -> YamlShape { + let mut nodes = 0usize; + let mut depth = 0usize; + let mut pending = vec![(value, 0usize)]; + while let Some((node, parent_depth)) = pending.pop() { + nodes = nodes.saturating_add(1); + match node { + Yaml::Array(items) => { + let node_depth = parent_depth + 1; + depth = depth.max(node_depth); + pending.extend(items.iter().map(|item| (item, node_depth))); + } + Yaml::Hash(entries) => { + let node_depth = parent_depth + 1; + depth = depth.max(node_depth); + pending.extend(entries.iter().flat_map(|(key, value)| [(key, node_depth), (value, node_depth)])); + } + _ => {} + } + } + YamlShape { nodes, depth } +} + impl MarkedEventReceiver for CfnYamlLoader { fn on_event(&mut self, ev: Event, mark: Marker) { if self.suppress_tree_construction { @@ -840,6 +913,9 @@ impl MarkedEventReceiver for CfnYamlLoader { } } Event::Alias(id) => { + if !self.allow_alias_expansion(id, mark) { + return; + } let n = self.anchor_map.get(&id).cloned().unwrap_or(Yaml::BadValue); // An alias resolves to an anchored value, so it is always a value or // sequence element (never a key); anchor a sequence element at itself. @@ -1990,4 +2066,65 @@ mod tests { assert!(msg.contains("nesting depth"), "error must reference nesting depth, got: {}", error.message); assert!(error.line.is_some(), "error must carry a source line"); } + + /// `levels` nested anchors, each a sequence of `width` aliases to the level + /// below, so resolving the final alias copies `width^levels` scalars. + fn nested_alias_yaml(width: usize, levels: usize) -> String { + let mut yaml = String::from("Metadata:\n"); + yaml.push_str(&format!(" Level0: &level0 [{}]\n", vec!["x"; width].join(", "))); + for level in 1..levels { + let aliases = vec![format!("*level{}", level - 1); width].join(", "); + yaml.push_str(&format!(" Level{level}: &level{level} [{aliases}]\n")); + } + yaml.push_str(&format!( + "Resources:\n Topic:\n Type: AWS::SNS::Topic\n Metadata:\n Expanded: *level{}\n", + levels - 1 + )); + yaml + } + + fn deeply_nested_alias_yaml(depth_per_anchor: usize, levels: usize) -> String { + let open = "[".repeat(depth_per_anchor); + let close = "]".repeat(depth_per_anchor); + let mut yaml = format!("Metadata:\n Level0: &level0 {open}x{close}\n"); + for level in 1..levels { + yaml.push_str(&format!(" Level{level}: &level{level} {open}*level{}{close}\n", level - 1)); + } + yaml.push_str("Resources:\n Topic:\n Type: AWS::SNS::Topic\n"); + yaml + } + + #[test] + fn yaml_aliases_within_the_expanded_depth_limit_parse() { + let result = parse_yaml(deeply_nested_alias_yaml(64, 4).as_bytes()); + assert!(result.is_ok(), "moderate expanded alias depth must parse: {:?}", result.err()); + } + + #[test] + fn yaml_aliases_beyond_the_expanded_depth_limit_fail_with_a_located_error() { + let result = parse_yaml(deeply_nested_alias_yaml(64, 9).as_bytes()); + let error = result.expect_err("alias-expanded nesting must be rejected before cloning"); + assert!(error.message.contains("nesting depth"), "unexpected error: {}", error.message); + assert!(error.line.is_some(), "error must carry a source line"); + } + + #[test] + fn yaml_aliases_within_the_expansion_budget_parse() { + // 4^5 = 1,024 scalars at the deepest alias, well inside the budget. + let result = parse_yaml(nested_alias_yaml(4, 6).as_bytes()); + assert!(result.is_ok(), "moderate alias reuse must parse: {:?}", result.err()); + } + + #[test] + fn yaml_aliases_beyond_the_expansion_budget_fail_with_a_located_error() { + // 9^7 scalars copied by the deepest level alone exceed the budget. + let result = parse_yaml(nested_alias_yaml(9, 8).as_bytes()); + let error = result.expect_err("exponential alias expansion must be rejected"); + assert!( + error.message.contains("alias expansion"), + "error must reference alias expansion, got: {}", + error.message + ); + assert!(error.line.is_some(), "error must carry a source line"); + } } diff --git a/src/template-model/src/resolved_value.rs b/src/template-model/src/resolved_value.rs index 0ad58b55..cfa77c42 100644 --- a/src/template-model/src/resolved_value.rs +++ b/src/template-model/src/resolved_value.rs @@ -1,7 +1,7 @@ use crate::consts::*; use crate::resolver::MapEntry; use crate::resolver::ResolvedValue; -use std::collections::HashMap; +use std::collections::{HashMap, HashSet}; pub fn resolved_value_at_path(val: &ResolvedValue, path: &str) -> Option { let mut segments = path.splitn(2, '.'); @@ -242,7 +242,7 @@ pub fn collect_conditional_nulls(val: &ResolvedValue, path: &str, out: &mut Vec< } } -fn is_resolved_null(val: &ResolvedValue) -> bool { +pub fn is_resolved_null(val: &ResolvedValue) -> bool { match val { ResolvedValue::Concrete { value: v } if v.is_null() => true, ResolvedValue::Conditional { if_true: t, if_false: f, .. } => is_resolved_null(t) && is_resolved_null(f), @@ -272,32 +272,42 @@ pub fn collect_scenarios( assumptions: &HashMap, limit: usize, results: &mut Vec<(ResolvedValue, HashMap)>, +) -> bool { + collect_scenarios_reachable(val, assumptions, limit, results, &|_| true) +} + +pub(crate) fn collect_scenarios_reachable( + val: &ResolvedValue, + assumptions: &HashMap, + limit: usize, + results: &mut Vec<(ResolvedValue, HashMap)>, + is_reachable: &dyn Fn(&HashMap) -> bool, ) -> bool { match val { ResolvedValue::Conditional { condition: cond, if_true: t, if_false: f } => { if assumptions.contains_key(cond.as_str()) { if assumptions[cond.as_str()] { - collect_scenarios(t, assumptions, limit, results) + collect_scenarios_reachable(t, assumptions, limit, results, is_reachable) } else { - collect_scenarios(f, assumptions, limit, results) + collect_scenarios_reachable(f, assumptions, limit, results, is_reachable) } } else { let mut true_assumptions = assumptions.clone(); true_assumptions.insert(cond.clone(), true); - let true_curtailed = collect_scenarios(t, &true_assumptions, limit, results); + let true_curtailed = collect_scenarios_reachable(t, &true_assumptions, limit, results, is_reachable); if true_curtailed && results.len() >= limit { return true; } let mut false_assumptions = assumptions.clone(); false_assumptions.insert(cond.clone(), false); - let false_curtailed = collect_scenarios(f, &false_assumptions, limit, results); + let false_curtailed = collect_scenarios_reachable(f, &false_assumptions, limit, results, is_reachable); true_curtailed || false_curtailed } } ResolvedValue::Enum { variants } => { let mut curtailed = false; for variant in variants { - curtailed |= collect_scenarios(variant, assumptions, limit, results); + curtailed |= collect_scenarios_reachable(variant, assumptions, limit, results, is_reachable); if curtailed && results.len() >= limit { break; } @@ -307,7 +317,7 @@ pub fn collect_scenarios( ResolvedValue::List { items } => { let has_branching = items.iter().any(contains_scenario_branching); if has_branching { - expand_list_scenarios(items, assumptions, limit, results) + expand_list_scenarios(items, assumptions, limit, results, is_reachable) } else { push_scenario(val, assumptions, limit, results) } @@ -315,7 +325,7 @@ pub fn collect_scenarios( ResolvedValue::Map { entries } => { let has_branching = entries.iter().any(|entry| contains_scenario_branching(&entry.value)); if has_branching { - expand_map_scenarios(entries, assumptions, limit, results) + expand_map_scenarios(entries, assumptions, limit, results, is_reachable) } else { push_scenario(val, assumptions, limit, results) } @@ -529,16 +539,25 @@ fn json_values_matching_wildcard_path(val: &serde_json::Value, path: &str) -> Ve /// Expansion remains bounded to `limit` partial combinations after every item, /// but every retained combination continues through every remaining item so no /// returned list or map is structurally incomplete. +/// +/// A product larger than `MAX_COMPLETE_SCENARIO_PRODUCT` combinations or +/// `MAX_SCENARIO_PRODUCT_NODES` nodes is not enumerated; every member +/// alternative is covered instead, keeping growth linear in the number of +/// alternatives. fn expand_cartesian_scenarios( items: &[(T, Vec<(ResolvedValue, HashMap)>)], base_assumptions: &HashMap, limit: usize, build_result: impl Fn(Vec<(T, ResolvedValue)>) -> ResolvedValue, results: &mut Vec<(ResolvedValue, HashMap)>, + is_reachable: &dyn Fn(&HashMap) -> bool, ) -> bool { if limit == 0 { return !items.is_empty(); } + if !product_is_enumerable(items) { + return cover_cartesian_scenarios(items, base_assumptions, limit, build_result, results, is_reachable); + } let mut combos: Vec<(Vec<(T, ResolvedValue)>, HashMap)> = vec![(Vec::new(), base_assumptions.clone())]; @@ -578,11 +597,155 @@ fn expand_cartesian_scenarios( curtailed } +/// Whether the joint product of the member scenarios is small enough, in +/// combinations and in materialized nodes, to enumerate in full. +fn product_is_enumerable(items: &[(T, Vec<(ResolvedValue, HashMap)>)]) -> bool { + let mut combinations = 1usize; + let mut nodes_per_combination = 0usize; + for (_, scenarios) in items { + combinations = combinations.saturating_mul(scenarios.len().max(1)); + nodes_per_combination += scenarios.iter().map(|(value, _)| node_count(value)).max().unwrap_or(0); + } + combinations <= MAX_COMPLETE_SCENARIO_PRODUCT + && combinations.saturating_mul(nodes_per_combination.max(1)) <= MAX_SCENARIO_PRODUCT_NODES +} + +/// Number of `ResolvedValue` nodes in a value, the unit the materialization +/// bound counts. +pub fn node_count(value: &ResolvedValue) -> usize { + match value { + ResolvedValue::List { items } => 1 + items.iter().map(node_count).sum::(), + ResolvedValue::Map { entries } => 1 + entries.iter().map(|entry| node_count(&entry.value)).sum::(), + ResolvedValue::Enum { variants } => 1 + variants.iter().map(node_count).sum::(), + ResolvedValue::Conditional { if_true, if_false, .. } => 1 + node_count(if_true) + node_count(if_false), + ResolvedValue::Concrete { .. } + | ResolvedValue::Reference { .. } + | ResolvedValue::Dynamic { .. } + | ResolvedValue::TypedDynamic { .. } => 1, + } +} + +fn merge_scenario_assumptions( + assumptions: &HashMap, + additions: &HashMap, +) -> Option> { + let mut merged = assumptions.clone(); + for (condition, value) in additions { + if merged.get(condition).is_some_and(|existing| existing != value) { + return None; + } + merged.insert(condition.clone(), *value); + } + Some(merged) +} + +/// Alternative-covering replacement for a joint product too large to enumerate. +/// +/// The result includes the all-true, all-false, and single-flip assignments used +/// for pairwise condition coverage, plus an assignment that selects every +/// scenario of every member at least once. Other members are selected greedily +/// while preserving satisfiability, so each reachable alternative has a +/// reachable full-container witness. Forcing the selected member scenario is +/// necessary when two alternatives share the same condition assignment, as +/// parameter enums can. This keeps the result linear in the sum of member +/// alternatives without hiding a branch that requires three or more literals. +fn cover_cartesian_scenarios( + items: &[(T, Vec<(ResolvedValue, HashMap)>)], + base_assumptions: &HashMap, + limit: usize, + build_result: impl Fn(Vec<(T, ResolvedValue)>) -> ResolvedValue, + results: &mut Vec<(ResolvedValue, HashMap)>, + is_reachable: &dyn Fn(&HashMap) -> bool, +) -> bool { + let mut conditions: Vec<&str> = items + .iter() + .flat_map(|(_, scenarios)| scenarios.iter().flat_map(|(_, assumptions)| assumptions.keys())) + .filter(|condition| !base_assumptions.contains_key(condition.as_str())) + .map(String::as_str) + .collect(); + conditions.sort_unstable(); + conditions.dedup(); + + let assignment = |decide: &dyn Fn(&str) -> bool| -> HashMap { + let mut assumptions = base_assumptions.clone(); + assumptions.extend(conditions.iter().map(|condition| (condition.to_string(), decide(condition)))); + assumptions + }; + + let mut seen: HashSet<(Vec<(String, bool)>, Vec)> = HashSet::new(); + let mut curtailed = false; + let mut add_assignment = |seed: HashMap, forced: Option<(usize, usize)>| -> bool { + if !is_reachable(&seed) { + return false; + } + let mut merged = seed; + let mut collected = Vec::with_capacity(items.len()); + let mut selected_indices = Vec::with_capacity(items.len()); + for (item_index, (key, scenarios)) in items.iter().enumerate() { + let selected = if let Some((_, forced_scenario)) = forced.filter(|(item, _)| *item == item_index) { + scenarios.get(forced_scenario).and_then(|(value, assumptions)| { + merge_scenario_assumptions(&merged, assumptions) + .filter(|candidate| is_reachable(candidate)) + .map(|candidate| (forced_scenario, value, candidate)) + }) + } else { + scenarios.iter().enumerate().find_map(|(scenario_index, (value, assumptions))| { + merge_scenario_assumptions(&merged, assumptions) + .filter(|candidate| is_reachable(candidate)) + .map(|candidate| (scenario_index, value, candidate)) + }) + }; + let Some((scenario_index, value, candidate)) = selected else { + curtailed = true; + return false; + }; + merged = candidate; + collected.push((key.clone(), value.clone())); + selected_indices.push(scenario_index); + } + + let mut canonical: Vec<(String, bool)> = + merged.iter().map(|(condition, value)| (condition.clone(), *value)).collect(); + canonical.sort_unstable(); + if !seen.insert((canonical, selected_indices)) { + return false; + } + if results.len() >= limit { + curtailed = true; + return true; + } + results.push((build_result(collected), merged)); + false + }; + + if add_assignment(assignment(&|_| true), None) || add_assignment(assignment(&|_| false), None) { + return true; + } + for flipped in &conditions { + if add_assignment(assignment(&|condition| condition != *flipped), None) { + return true; + } + } + + for (item_index, (_, scenarios)) in items.iter().enumerate() { + for (scenario_index, (_, scenario_assumptions)) in scenarios.iter().enumerate() { + let Some(seed) = merge_scenario_assumptions(base_assumptions, scenario_assumptions) else { + continue; + }; + if add_assignment(seed, Some((item_index, scenario_index))) { + return true; + } + } + } + curtailed +} + fn expand_list_scenarios( items: &[ResolvedValue], base_assumptions: &HashMap, limit: usize, results: &mut Vec<(ResolvedValue, HashMap)>, + is_reachable: &dyn Fn(&HashMap) -> bool, ) -> bool { let remaining = limit.saturating_sub(results.len()); if remaining == 0 { @@ -593,7 +756,8 @@ fn expand_list_scenarios( let mut prepared = Vec::with_capacity(items.len()); for (index, item) in items.iter().enumerate() { let mut scenarios = Vec::new(); - nested_curtailed |= collect_scenarios(item, base_assumptions, remaining, &mut scenarios); + nested_curtailed |= + collect_scenarios_reachable(item, base_assumptions, remaining, &mut scenarios, is_reachable); if scenarios.is_empty() { scenarios.push((item.clone(), base_assumptions.clone())); } @@ -605,6 +769,7 @@ fn expand_list_scenarios( remaining, |collected| ResolvedValue::List { items: collected.into_iter().map(|(_, value)| value).collect() }, results, + is_reachable, ); nested_curtailed || product_curtailed } @@ -614,6 +779,7 @@ fn expand_map_scenarios( base_assumptions: &HashMap, limit: usize, results: &mut Vec<(ResolvedValue, HashMap)>, + is_reachable: &dyn Fn(&HashMap) -> bool, ) -> bool { let remaining = limit.saturating_sub(results.len()); if remaining == 0 { @@ -624,7 +790,8 @@ fn expand_map_scenarios( let mut prepared = Vec::with_capacity(entries.len()); for entry in entries { let mut scenarios = Vec::new(); - nested_curtailed |= collect_scenarios(&entry.value, base_assumptions, remaining, &mut scenarios); + nested_curtailed |= + collect_scenarios_reachable(&entry.value, base_assumptions, remaining, &mut scenarios, is_reachable); if scenarios.is_empty() { scenarios.push((entry.value.clone(), base_assumptions.clone())); } @@ -638,6 +805,7 @@ fn expand_map_scenarios( entries: collected.into_iter().map(|(key, value)| MapEntry { key, value }).collect(), }, results, + is_reachable, ); nested_curtailed || product_curtailed } @@ -1329,6 +1497,7 @@ mod tests { 4, |collected| ResolvedValue::List { items: collected.into_iter().map(|(_, v)| v).collect() }, &mut results, + &|_| true, ); assert!(!curtailed, "4 combos with limit=4 must not be curtailed"); assert_eq!(results.len(), 4); @@ -1351,6 +1520,7 @@ mod tests { 4, |collected| ResolvedValue::List { items: collected.into_iter().map(|(_, v)| v).collect() }, &mut results, + &|_| true, ); assert!(curtailed, "8 combos with limit=4 must be curtailed"); assert!(results.len() <= 4, "at most limit results; got {}", results.len()); @@ -1364,4 +1534,188 @@ mod tests { } } } + + fn optional_item(condition: &str, value: &str) -> ResolvedValue { + ResolvedValue::Conditional { + condition: condition.to_string(), + if_true: Box::new(ResolvedValue::Concrete { value: json!(value).into() }), + if_false: Box::new(ResolvedValue::Concrete { value: json!(null).into() }), + } + } + + fn present_items(scenario: &ResolvedValue) -> Vec { + let ResolvedValue::List { items } = scenario else { panic!("expected a list, got {scenario:?}") }; + items + .iter() + .filter_map(|item| match item { + ResolvedValue::Concrete { value } => value.as_str().map(str::to_string), + other => panic!("expected a concrete item, got {other:?}"), + }) + .collect() + } + + #[test] + fn independent_conditions_below_the_product_bound_are_enumerated_in_full() { + let list = ResolvedValue::List { items: (0..4).map(|i| optional_item(&format!("C{i}"), "v")).collect() }; + let mut scenarios = Vec::new(); + let curtailed = collect_scenarios(&list, &HashMap::new(), MAX_SCENARIO_COMBINATIONS, &mut scenarios); + assert!(!curtailed); + assert_eq!(scenarios.len(), 16, "2^4 joint assignments"); + } + + #[test] + fn independent_conditions_above_the_product_bound_preserve_pairwise_condition_states() { + let count = 13; + let list = ResolvedValue::List { + items: (0..count).map(|i| optional_item(&format!("C{i:02}"), &format!("v{i:02}"))).collect(), + }; + let mut scenarios = Vec::new(); + let curtailed = collect_scenarios(&list, &HashMap::new(), MAX_SCENARIO_COMBINATIONS, &mut scenarios); + assert!(!curtailed, "a covering set is a complete analysis strategy, not a curtailment"); + assert_eq!(scenarios.len(), count + 2, "all-true, all-false and all-true with one condition flipped"); + + let all_present = scenarios.iter().find(|(value, _)| present_items(value).len() == count).expect("all-present"); + assert!(all_present.1.values().all(|value| *value)); + let all_absent = scenarios.iter().find(|(value, _)| present_items(value).is_empty()).expect("all-absent"); + assert!(all_absent.1.values().all(|value| !*value)); + for i in 0..count { + let flipped = format!("C{i:02}"); + let single_flip = scenarios + .iter() + .find(|(_, assumptions)| assumptions.iter().all(|(condition, value)| *value == (condition != &flipped))) + .unwrap_or_else(|| panic!("a scenario with only {flipped} false")); + let present = present_items(&single_flip.0); + assert_eq!(present.len(), count - 1); + assert!(!present.contains(&format!("v{i:02}"))); + } + for (_, assumptions) in &scenarios { + assert_eq!(assumptions.len(), count, "every scenario decides every condition"); + } + } + + #[test] + fn covering_set_deduplicates_assignments_that_coincide() { + // One shared condition gates every item, so all-true-with-flip equals all-false. + let list = ResolvedValue::List { items: (0..3).map(|_| optional_item("Shared", "v")).collect() }; + let mut scenarios = Vec::new(); + collect_scenarios(&list, &HashMap::new(), MAX_SCENARIO_COMBINATIONS, &mut scenarios); + assert_eq!(scenarios.len(), 2, "shared conditions never multiply"); + } + + #[test] + fn covering_set_includes_an_alternative_requiring_three_literals() { + let selected_value = ResolvedValue::Conditional { + condition: "CA".to_string(), + if_true: Box::new(ResolvedValue::Concrete { value: json!("a").into() }), + if_false: Box::new(ResolvedValue::Conditional { + condition: "CB".to_string(), + if_true: Box::new(ResolvedValue::Concrete { value: json!("b").into() }), + if_false: Box::new(ResolvedValue::Conditional { + condition: "CC".to_string(), + if_true: Box::new(ResolvedValue::Concrete { value: json!("selected").into() }), + if_false: Box::new(ResolvedValue::Concrete { value: json!("c").into() }), + }), + }), + }; + let mut items = vec![selected_value]; + items.extend((0..11).map(|index| optional_item(&format!("C{index:02}"), "sibling"))); + let list = ResolvedValue::List { items }; + + let mut scenarios = Vec::new(); + let curtailed = collect_scenarios(&list, &HashMap::new(), MAX_SCENARIO_COMBINATIONS, &mut scenarios); + + assert!(!curtailed); + let selected = scenarios + .iter() + .find(|(scenario, _)| present_items(scenario).first().is_some_and(|value| value == "selected")) + .expect("the three-literal alternative must be represented"); + assert_eq!(selected.1.get("CA"), Some(&false)); + assert_eq!(selected.1.get("CB"), Some(&false)); + assert_eq!(selected.1.get("CC"), Some(&true)); + } + + #[test] + fn covering_set_finds_a_reachable_completion_for_each_alternative() { + let selected_value = ResolvedValue::Conditional { + condition: "A".to_string(), + if_true: Box::new(ResolvedValue::Concrete { value: json!("other").into() }), + if_false: Box::new(ResolvedValue::Concrete { value: json!("selected").into() }), + }; + let correlated_value = ResolvedValue::Conditional { + condition: "B".to_string(), + if_true: Box::new(ResolvedValue::Concrete { value: json!("b-true").into() }), + if_false: Box::new(ResolvedValue::Concrete { value: json!("b-false").into() }), + }; + let mut items = vec![selected_value, correlated_value]; + items.extend((0..11).map(|index| optional_item(&format!("C{index:02}"), "sibling"))); + let list = ResolvedValue::List { items }; + let is_reachable = |assumptions: &HashMap| match (assumptions.get("A"), assumptions.get("B")) { + (Some(a), Some(b)) => a == b, + _ => true, + }; + + let mut scenarios = Vec::new(); + let curtailed = collect_scenarios_reachable( + &list, + &HashMap::new(), + MAX_SCENARIO_COMBINATIONS, + &mut scenarios, + &is_reachable, + ); + + assert!(!curtailed); + assert!(scenarios.iter().all(|(_, assumptions)| is_reachable(assumptions))); + let selected = scenarios + .iter() + .find(|(scenario, _)| present_items(scenario).first().is_some_and(|value| value == "selected")) + .expect("the reachable false alternative must be represented"); + assert_eq!(selected.1.get("A"), Some(&false)); + assert_eq!(selected.1.get("B"), Some(&false)); + } + + #[test] + fn covering_set_is_chosen_by_materialized_size_as_well_as_count() { + let wide_leaf = ResolvedValue::List { + items: (0..600).map(|i| ResolvedValue::Concrete { value: json!(i).into() }).collect(), + }; + let optional_wide = |condition: &str| ResolvedValue::Conditional { + condition: condition.to_string(), + if_true: Box::new(wide_leaf.clone()), + if_false: Box::new(ResolvedValue::Concrete { value: json!(null).into() }), + }; + let items: Vec<(usize, Vec<(ResolvedValue, HashMap)>)> = (0..11) + .map(|i| { + let mut scenarios = Vec::new(); + collect_scenarios(&optional_wide(&format!("C{i:02}")), &HashMap::new(), 16, &mut scenarios); + (i, scenarios) + }) + .collect(); + assert!(!product_is_enumerable(&items), "2^11 combos of ~600-node members exceed the node bound"); + let small: Vec<(usize, Vec<(ResolvedValue, HashMap)>)> = items + .iter() + .map(|(i, scenarios)| { + ( + *i, + scenarios + .iter() + .map(|(_, a)| (ResolvedValue::Concrete { value: json!(1).into() }, a.clone())) + .collect(), + ) + }) + .collect(); + assert!(product_is_enumerable(&small), "the same 2^11 combos of scalar members are enumerable"); + } + + #[test] + fn node_count_counts_every_resolved_node_once() { + let value = ResolvedValue::Map { + entries: vec![MapEntry { + key: "k".into(), + value: ResolvedValue::List { + items: vec![optional_item("C", "v"), ResolvedValue::Concrete { value: json!(1).into() }], + }, + }], + }; + assert_eq!(node_count(&value), 6, "map + list + conditional + its two leaves + the concrete item"); + } }